From a1e2704d53c183e9363f204b1a910b1a95f76681 Mon Sep 17 00:00:00 2001 From: jasonf Date: Tue, 14 Sep 1999 18:05:39 +0000 Subject: [PATCH] Initial revision --- 5250.tcap | 21 + 5250.terminfo | 30 + AUTHORS | 10 + COPYING | 339 ++++ INSTALL | 182 ++ NEWS | 0 README | 69 + Xdefaults | 30 + acconfig.h | 8 + config.guess | 1087 ++++++++++++ config.sub | 1215 ++++++++++++++ doc/Makefile.am | 7 + doc/rfc1205.txt | 675 ++++++++ doc/scs2ascii.1 | 55 + install-sh | 250 +++ ltconfig | 3017 +++++++++++++++++++++++++++++++++ ltmain.sh | 3975 ++++++++++++++++++++++++++++++++++++++++++++ missing | 188 +++ mkinstalldirs | 40 + src/.lclintrc | 14 + src/Makefile.am | 71 + src/buffer.c | 64 + src/buffer.h | 48 + src/codes5250.h | 45 + src/cursesterm.h | 32 + src/debug.c | 247 +++ src/debug.h | 26 + src/display.c | 338 ++++ src/display.h | 86 + src/field.c | 483 ++++++ src/field.h | 175 ++ src/formattable.c | 476 ++++++ src/formattable.h | 90 + src/portsnoop.c | 156 ++ src/printsession.c | 151 ++ src/printsession.h | 49 + src/record.h | 103 ++ src/scs.h | 34 + src/scs2ascii.c | 595 +++++++ src/session.h | 101 ++ src/slangterm.c | 688 ++++++++ src/slangterm.h | 32 + src/stream.h | 93 ++ src/terminal.h | 140 ++ src/tn5250.c | 316 ++++ src/transmaps | 78 + src/transmaps.h | 3353 +++++++++++++++++++++++++++++++++++++ src/utility.c | 179 ++ src/utility.h | 64 + src/version.c | 4 + src/xt5250 | 2 + tn5250-48x48.png | Bin 0 -> 1406 bytes tn5250-48x48.xpm | 156 ++ tn5250-62x48.png | Bin 0 -> 1528 bytes tn5250-62x48.xpm | 134 ++ uk5250.map | 283 ++++ us5250.map | 283 ++++ 57 files changed, 20387 insertions(+) create mode 100644 5250.tcap create mode 100644 5250.terminfo create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 NEWS create mode 100644 README create mode 100644 Xdefaults create mode 100644 acconfig.h create mode 100755 config.guess create mode 100755 config.sub create mode 100644 doc/Makefile.am create mode 100644 doc/rfc1205.txt create mode 100644 doc/scs2ascii.1 create mode 100755 install-sh create mode 100644 ltconfig create mode 100644 ltmain.sh create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 src/.lclintrc create mode 100644 src/Makefile.am create mode 100644 src/buffer.c create mode 100644 src/buffer.h create mode 100644 src/codes5250.h create mode 100644 src/cursesterm.h create mode 100644 src/debug.c create mode 100644 src/debug.h create mode 100644 src/display.c create mode 100644 src/display.h create mode 100644 src/field.c create mode 100644 src/field.h create mode 100644 src/formattable.c create mode 100644 src/formattable.h create mode 100644 src/portsnoop.c create mode 100644 src/printsession.c create mode 100644 src/printsession.h create mode 100644 src/record.h create mode 100644 src/scs.h create mode 100644 src/scs2ascii.c create mode 100644 src/session.h create mode 100644 src/slangterm.c create mode 100644 src/slangterm.h create mode 100644 src/stream.h create mode 100644 src/terminal.h create mode 100644 src/tn5250.c create mode 100755 src/transmaps create mode 100644 src/transmaps.h create mode 100644 src/utility.c create mode 100644 src/utility.h create mode 100644 src/version.c create mode 100755 src/xt5250 create mode 100644 tn5250-48x48.png create mode 100644 tn5250-48x48.xpm create mode 100644 tn5250-62x48.png create mode 100644 tn5250-62x48.xpm create mode 100644 uk5250.map create mode 100644 us5250.map diff --git a/5250.tcap b/5250.tcap new file mode 100644 index 0000000..aa48cec --- /dev/null +++ b/5250.tcap @@ -0,0 +1,21 @@ +# +# Ron Colcernian IBM's 5250 Terminal, adapted form linux +5250|IBMs 5250 Terminal:\ + :am:eo:mi:ms:ut:xn:xo:\ + :co#80:it#8:li#25:\ + :&7=^Z:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\ + :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\ + :IC=\E[%d@:K2=\E[G:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\ + :ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\ + :cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:dl=\E[M:\ + :do=^J:ei=\E[4l:ho=\E[H:ic=\E[@:im=\E[4h:k1=\E[[A:\ + :k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[17~:\ + :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:\ + :kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=\0177:kd=\E[B:\ + :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mr=\E[7m:\ + :nd=\E[C:nw=^M^J:r1=\Ec:rc=\E8:sc=\E7:sf=^J:sr=\EM:\ + :st=\EH:ta=^I:u6=\E[%i%d;%dR:u7=\E[6n:u8=\E[?6c:\ + :u9=\E[c:up=\E[A:vb=200\E[?5h\E[?5l:ve=\E[?25h:\ + :kB=\E^I:@8=\EOM:@7=\E[F:\ + :vi=\E[?25l:tc=klone+sgr:tc=klone+color:tc=klone+acs: diff --git a/5250.terminfo b/5250.terminfo new file mode 100644 index 0000000..3613f70 --- /dev/null +++ b/5250.terminfo @@ -0,0 +1,30 @@ +# 5250 terminal definition, based on linux console +5250|xterm-5250|5250 terminal, + am, bce, eo, mir, msgr, xenl, xon, + colors#8, it#8, pairs#64, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l, + clear=\E[H\E[J, cnorm=\E[?25h, cr=^M, + csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP, + dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, + ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h\E[?5l$<200/>, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, + il1=\E[L, ind=^J, invis=\E[8m, kb2=\E[G, kbs=\177, kcbt=\E[Z, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kdch1=\E[3~, kend=\E[4~, kent=\EOM, kf1=\E[[A, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, + kf21=\E[35~, kf22=\E[36~, kf23=\E[37~, kf24=\E[38~, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, kspd=^Z, + nel=^M^J, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, + rmacs=\E[10m, rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m, + rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + sgr0=\E[0;10m, smacs=\E[11m, smir=\E[4h, smpch=\E[11m, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, + u7=\E[6n, u8=\E[?6c, u9=\E[c, vpa=\E[%i%p1%dd, diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..84fb4f4 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,10 @@ +Roger Bowler +Ron Colcernian +Jan Echternach +Carey Evans +Jason 'Eraserhead' Felice - +Colin McCormack +Dave McKenzie +Michael Madore - +Peter Schlaile +William J. Suetholz diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..b5eeafb --- /dev/null +++ b/README @@ -0,0 +1,69 @@ +This is my implementation of the 5250 Telnet protocol for LINUX. This code +(as well as the documentation) is extremely BETA. That said, it does more or +less work... + +This version has been substantially re-written with a more object oriented +approach. Hopefully, the code is should be easier to follow, enhance, and +maintain. + +The linux console only defines F1-F20 by default. I have included a sample +map file which has all the function keys. It also has a modified definiton +for the tab key to allow the use of Shift-Tab to move backwards through +fields. It is based on the stock linux +console. To make use of the file, you need to use the loadkeys command. As +the root user, type the following: + + loadkeys us5250.map (or uk5250.map if you have that keyboard) + +The above is not necessary if you are only going to use the emlator in an +xterminal. After doing this, all the function keys will now return unique +codes. One caveat, is that this will effect all of your consoles. Also, the +change is only temporary, so you will have to invoke it again unless you put +it in a startup file somewhere. + +In addition to the map file you also need to make sure that the terminfo +file that you are using is properly set up. In particular, it needs to have +definitions for all 24 function keys, and it must have the proper code for +back tab. To look at the current contents of your terminfo, use the infocmp +command to dump them to a file. After making any necessary changes, you can +recompile the file with the tic command. For details please see the man +pages for those commands. There is a file called 5250.terminfo which shows +the what I use. To add this terminfo entry, type the following as root: + + tic 5250.terminfo + +Now all you need to do is set your TERM environment variable to 5250 (or +xterm-5250 if you are using X-Windows). + +To usr the emulator in an xterm, make sure you have compiled 5250.terminfo +using the tic command. To launch an xterm of the proper dimensions (a +standard xterm is only 24 rows high), use the xt5250 shell script. This +shell script will open an xterm 80X25 and sets the TERM environment variable +to the correct value, then launches the emulator. Below is an example +command line: + + xt5250 -s MIKEM01 192.168.1.10 + +Where MIKEM01 is the device name I want on the AS/400, and 192.168.1.10 is +the address of the host system. NOTE: as things stand, function keys will +only work properly in a genuine x-term. This means that rxvt won't respond +to function keys correctly. I'd be happy to include sample Xdefault +settings for rxvt if someone sends them to me. + + +To build the emulator simply type the following: + + ./configure + make + make install + +The emulator uses the ncurses library for manipulating the console. Make +sure you have the ncurses development libraries installed before trying to +compile the source. + +Please send me any comments, questions, bug reports or patches. + +Michael Madore +mmadore@blarg.net +http://www.blarg.net/~mmadore +February 14th, 1999 \ No newline at end of file diff --git a/Xdefaults b/Xdefaults new file mode 100644 index 0000000..36d7812 --- /dev/null +++ b/Xdefaults @@ -0,0 +1,30 @@ +xt5250*VT100.Translations: #override\n\ + KP_Enter: string("\033OM") \n\ + BackSpace: string("\177") \n\ + ~Shift F1: string("\033[[A") \n\ + ~Shift F2: string("\033[[B") \n\ + ~Shift F3: string("\033[[C") \n\ + ~Shift F4: string("\033[[D") \n\ + ~Shift F5: string("\033[[E") \n\ + ~Shift F6: string("\033[17~") \n\ + ~Shift F7: string("\033[18~") \n\ + ~Shift F8: string("\033[19~") \n\ + ~Shift F9: string("\033[20~") \n\ + ~Shift F10: string("\033[21~") \n\ + ~Shift F11: string("\033[23~") \n\ + ~Shift F12: string("\033[24~") \n\ + Shift F1: string("\033[25~") \n\ + Shift F2: string("\033[26~") \n\ + Shift F3: string("\033[28~") \n\ + Shift F4: string("\033[29~") \n\ + Shift F5: string("\033[31~") \n\ + Shift F6: string("\033[32~") \n\ + Shift F7: string("\033[33~") \n\ + Shift F8: string("\033[34~") \n\ + Shift F9: string("\033[35~") \n\ + Shift F10: string("\033[36~") \n\ + Shift F11: string("\033[37~") \n\ + Shift F12: string("\033[38~") \n\ + Shift Tab: string("\033[Z") \n\ + ~Shift Delete: string("\033[3~") \n\ + ~Shift Insert: string("\033[2~") \ No newline at end of file diff --git a/acconfig.h b/acconfig.h new file mode 100644 index 0000000..fbd577c --- /dev/null +++ b/acconfig.h @@ -0,0 +1,8 @@ +/* Define to your system's socket descriptor type. */ +#undef SOCKET_TYPE + +/* Define this to use the -lncurses or -lcurses support. */ +#undef USE_CURSES + +/* Define this to use the -lslang support. */ +#undef USE_SLANG diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..6cb567b --- /dev/null +++ b/config.guess @@ -0,0 +1,1087 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 +# Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# Please send patches to the Autoconf mailing list . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# Use $HOST_CC if defined. $CC may point to a cross-compiler +if test x"$CC_FOR_BUILD" = x; then + if test x"$HOST_CC" != x; then + CC_FOR_BUILD="$HOST_CC" + else + if test x"$CC" != x; then + CC_FOR_BUILD="$CC" + else + CC_FOR_BUILD=cc + fi + fi +fi + + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .globl main + .ent main +main: + .frame \$30,0,\$26,0 + .prologue 0 + .long 0x47e03d80 # implver $0 + lda \$2,259 + .long 0x47e20c21 # amask $2,$1 + srl \$1,8,\$2 + sll \$2,2,\$2 + sll \$0,3,\$0 + addl \$1,\$0,\$0 + addl \$2,\$0,\$0 + ret \$31,(\$26),1 + .end main +EOF + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy + case "$?" in + 7) + UNAME_MACHINE="alpha" + ;; + 15) + UNAME_MACHINE="alphaev5" + ;; + 14) + UNAME_MACHINE="alphaev56" + ;; + 10) + UNAME_MACHINE="alphapca56" + ;; + 16) + UNAME_MACHINE="alphaev6" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:NetBSD:*:*) + echo m68k-cbm-netbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + arm32:NetBSD:*:*) + echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + SR2?01:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:NetBSD:*:*) + echo m68k-atari-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:NetBSD:*:*) + echo m68k-sun-netbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:NetBSD:*:*) + echo m68k-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + macppc:NetBSD:*:*) + echo powerpc-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ + -o ${TARGET_BINARY_INTERFACE}x = x ] ; then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + sed 's/^ //' << EOF >$dummy.c + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + ($CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + rm -f $dummy.c $dummy + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*T3E:*:*:*) + echo t3e-cray-unicosmk${UNAME_RELEASE} + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp3[0-9][05]:NetBSD:*:*) + echo m68k-hp-netbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | i?86:BSD/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + if test -x /usr/bin/objformat; then + if test "elf" = "`/usr/bin/objformat`"; then + echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` + exit 0 + fi + fi + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:NetBSD:*:*) + echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + # uname on the ARM produces all sorts of strangeness, and we need to + # filter it out. + case "$UNAME_MACHINE" in + armv*) UNAME_MACHINE=$UNAME_MACHINE ;; + arm* | sa110*) UNAME_MACHINE="arm" ;; + esac + + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_help_string=`cd /; ld --help 2>&1` + ld_supported_emulations=`echo $ld_help_string \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;; + i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;; + sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; + armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; + m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;; + elf32ppc) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unkown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;; + esac + + if test "${UNAME_MACHINE}" = "alpha" ; then + sed 's/^ //' <$dummy.s + .globl main + .ent main + main: + .frame \$30,0,\$26,0 + .prologue 0 + .long 0x47e03d80 # implver $0 + lda \$2,259 + .long 0x47e20c21 # amask $2,$1 + srl \$1,8,\$2 + sll \$2,2,\$2 + sll \$0,3,\$0 + addl \$1,\$0,\$0 + addl \$2,\$0,\$0 + ret \$31,(\$26),1 + .end main +EOF + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy + case "$?" in + 7) + UNAME_MACHINE="alpha" + ;; + 15) + UNAME_MACHINE="alphaev5" + ;; + 14) + UNAME_MACHINE="alphaev56" + ;; + 10) + UNAME_MACHINE="alphapca56" + ;; + 16) + UNAME_MACHINE="alphaev6" + ;; + esac + + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >$dummy.c </dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + else + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" + test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:5:7*) + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent.*II' >/dev/null) && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) && UNAME_MACHINE=i585 + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}${UNAME_VERSION}-sysv${UNAME_RELEASE} + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:*:6*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..2436b45 --- /dev/null +++ b/config.sub @@ -0,0 +1,1215 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ + | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v) + basic_machine=$basic_machine-unknown + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[34567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ + | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* \ + | f301-* | armv*-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* ) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigaos | amigados) + basic_machine=m68k-cbm + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | *MiNT) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + os=-msdos + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-corel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + np1) + basic_machine=np1-gould + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc | sparcv9) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -*MiNT) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-corel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..81e081e --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,7 @@ + +man_MANS = scs2ascii.1\ + tn5250.1 + +EXTRA_DIST = rfc1205.txt\ + $(man_MANS) + diff --git a/doc/rfc1205.txt b/doc/rfc1205.txt new file mode 100644 index 0000000..30f1f13 --- /dev/null +++ b/doc/rfc1205.txt @@ -0,0 +1,675 @@ + + + + + + +Network Working Group P. Chmielewski +Request for Comments: 1205 IBM Corporation + February 1991 + + + 5250 Telnet Interface + +Status of this Memo + + This RFC is being distributed in order to document the interface to + the IBM 5250 Telnet implementation. This information is being + provided for hosts on the Internet that want to support the 5250 work + station data stream within the Telnet protocol. This memo provides + information for the Internet community. It does not specify any + standard. Distribution of this memo is unlimited. + +1. Introduction + + This RFC describes the interface to the IBM 5250 Telnet + implementation. The purpose of this memo is to describe the details + of the interface so that a person wanting to implement a client + Telnet which emulates an IBM 5250 work station would be able to do + so. This memo does not describe all of the 5250 commands, aid codes, + and other information specific to the 5250 data stream. That + information is contained in the IBM 5250 Information Display System, + Functions Reference Manual, IBM publication number SA21-9247. + Corrections and additions to this manual are documented in this RFC + in section 5. + +2. Telnet Options + + No new Telnet options are defined for 5250 mode of operation. + However, to enable 5250 mode, both the client and server must agree + to at least support the Binary, End-Of-Record (EOR), and Terminal- + Type Telnet options. The complete list of 5250 terminal types is + maintained in the Assigned Numbers RFC and includes the following: + + IBM-5555-C01 24 x 80 Double-Byte Character Set color display + IBM-5555-B01 24 x 80 Double-Byte Character Set (DBCS) + IBM-3477-FC 27 x 132 color display + IBM-3477-FG 27 x 132 monochrome display + IBM-3180-2 27 x 132 monochrome display + IBM-3179-2 24 x 80 color display + IBM-3196-A1 24 x 80 monochrome display + IBM-5292-2 24 x 80 color display + IBM-5291-1 24 x 80 monochrome display + IBM-5251-11 24 x 80 monochrome display + + + + +Chmielewski [Page 1] + +RFC 1205 5250 Telnet Interface February 1991 + + + An example of a typical negotiation process to establish 5250 mode of + operation is shown below. In this example, the server initiates the + negotiation by sending the DO TERMINAL-TYPE request. + + Server: IAC DO TERMINAL-TYPE + Client: IAC WILL TERMINAL-TYPE + Server: IAC SB TERMINAL-TYPE SEND IAC SE + Client: IAC SB TERMINAL-TYPE IS IBM-5251-11 IAC SE + (The client has specified its terminal-type is an IBM-5251-11) + + Server: IAC DO END-OF-RECORD + Client: IAC WILL END-OF-RECORD + Server: IAC WILL END-OF-RECORD + Client: IAC DO END-OF-RECORD + (The server and client have both agreed to transmit EORs) + + Server: IAC DO TRANSMIT-BINARY + Client: IAC WILL TRANSMIT-BINARY + Server: IAC WILL TRANSMIT-BINARY + Client: IAC DO TRANSMIT-BINARY + (The server and client have both agreed to binary transmission) + +3. Data Stream Format + + The actual data stream that is exchanged between the client and + server is composed of a header followed by the 5250 work station data + stream. For information about the 5250 work station data stream + refer to the IBM 5250 Information Display System, Functions Reference + Manual (SA21-9247). The header which prefixes the 5250 data stream + was originally designed for the 5250 Display Station Pass-Through + (DSPT) application. 5250 DSPT is an application similar to Telnet + which runs on the IBM AS/400, System/36, and System/38 over an SNA + network. This header is designed to be variable in length and is + composed of two parts. The first, fixed part is always 6 octets long + and has the following format: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Logical Record Length | Record Type | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Logical Record Length: 16 bits + + This field indicates the length, in octets, of this logical record + including the header length. The length is calculated BEFORE + + + +Chmielewski [Page 2] + +RFC 1205 5250 Telnet Interface February 1991 + + + doubling any IAC characters in the data stream. The length does + not include the that is appended to the end of the data + stream to mark the end of this logical record. The length is + specified with the most significant octet first. For example, a + length of 36 (decimal) would be specified as '0024'X. + + Record Type: 16 bits + + This field indicates the SNA record type. It should always be set + to '12A0'X to indicate the General Data Stream (GDS) record type. + + Reserved: 16 bits + + This field is currently not used. + + The second part of the header is designed to be variable in length. + The length of this variable part is specified in the first octet. + Currently this portion of the header will always be 4 octets long and + has the following format: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | |E|A| | | |S|T|H| | | + | Var Hdr Len |R|T| | | |R|R|L| | Opcode | + | |R|N| | | |Q|Q|P| | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Var Hdr Len: 8 bits + + The length, in octets, of the variable portion of the header. + Currently this is always '04'X. + + Flags: 16 bits + + Bit 0: ERR This bit is set to indicate a data stream + output error. The negative response code + is sent as data following the opcode field. + Bit 1: ATN This bit is set to indicate that the 5250 + attention key was pressed. + Bits 2-4: * These bits are reserved (set to zero). + Bit 5: SRQ This bit is set to indicate that the 5250 + System Request key was pressed. + Bit 6: TRQ This bit is set to indicate that the 5250 + Test Request key was pressed. + Bit 7: HLP This bit is set to indicate the Help in + Error State function. The error code is + sent as data following the header and is + + + +Chmielewski [Page 3] + +RFC 1205 5250 Telnet Interface February 1991 + + + a four digit packed decimal number. For + example, an error code of '0005'X indicates + the operator attempted to type in an area of + the display that is not enabled for input. + Bits 8-15: * These bits are reserved (set to zero). + + Opcode: 8 bits + + This field contains the operation code. It is set to indicate the + type of operation requested by the sender. The following are the + valid values: + + '00'X: No Operation + '01'X: Invite Operation + '02'X: Output Only + '03'X: Put/Get Operation + '04'X: Save Screen Operation + '05'X: Restore Screen Operation + '06'X: Read Immediate Operation + '07'X: Reserved + '08'X: Read Screen Operation + '09'X: Reserved + '0A'X: Cancel Invite Operation + '0B'X: Turn On Message Light + '0C'X: Turn Off Message Light + + The actual 5250 work station data stream will immediately follow the + opcode field in the header and will be terminated by the + pair. For some operations the header will be immediately followed by + an without any 5250 work station data stream in between. + For example, the following request to turn on the message light could + be sent by the server: + + 000A 12A0 0000 0400 000B FFEF + | | | | | | | + | | | | | | End Of Record marker + | | | | | | + | | | | | Opcode = Turn On Message Light ('0B'X) + | | | | | + | | | | Flags = '0000'X + | | | | + | | | Variable Header Length = '04'X + | | | + | | Reserved - Set to '0000'X + | | + | Record Type = General Data Stream ('12A0'X) + | + Logical Record Length = '000A'X for this record + + + +Chmielewski [Page 4] + +RFC 1205 5250 Telnet Interface February 1991 + + + In this example the requested operation is indicated by the opcode + and there is no associated work station data stream. + +4. Data Flow Examples + + The following examples illustrate the flow of data between the client + and server for some of the more common operations. These examples + are intended to show the order in which the logical records are sent + between the client and server and the content of those records. The + hex representation of the records which are exchanged between the + client and server is shown. The way in which a client implements the + various operations will differ between implementations and those + details are not discussed here. In these examples, when the value of + a field is dependent on the length of the screen data for a + particular logical record, it will be represented as 'LLLL'. + +4.1 Query Device Example + + A Query command may be sent by the server system in order to + determine the attributes of the device it is talking to. When a + client receives a Query command, it must send the Query Reply back to + the server. See section 5 for a complete description of the format + for the Query command and Query Reply. + + Server: Sends Write Structured 001112A0 00000400 000304F3 0005D970 + Field Query command. 00FFEF + + Client: Responds with a Query 004712A0 00000400 00000000 88003AD9 + Reply, in this case, 70800600 01030000 00000000 00000000 + for a 3180-2. 00000000 00000001 F3F1F8F0 F0F0F202 + 00000061 50000100 00000018 11000000 + 00000000 000000FF EF + + +4.2 Cancel Invite Example + + The server will send a Cancel Invite when it needs to reverse the + normal flow direction. When a client receives a Cancel Invite, it + should reply with a Cancel Invite and not send any user data until + the server has once again "invited" the work station. A work station + is said to be "invited" when the server has sent a read command to + the client. The Cancel Invite flow is as follows: + + Server: Sends header with the 000A12A0 00000400 000AFFEF + Opcode = Cancel Invite. + + Client: Sends header with the 000A12A0 00000400 000AFFEF + Opcode = Cancel Invite + + + +Chmielewski [Page 5] + +RFC 1205 5250 Telnet Interface February 1991 + + + to indicate that the + work station is no + longer invited. + +4.3 System Request Example + + The 5250 System Request operation is invoked when a client wants to + interrupt the server job to perform some function. The typical + scenario would be for a user to press the system request key, or + whatever key is mapped to a system request key, which would cause the + client Telnet to initiate the following flow: + + Client: Sends header with the 000A12A0 00000404 0000FFEF + System Request bit set. + + Note: It is possible for a client to include user data in this + record following the header. This data would be interpreted by the + server as an option to be selected from the system request menu. If + this were the case, the server would not send the system request menu + and the flow would continue based on the option selected. For this + example, the client does not send any user data and the flow would + continue as follows: + + Server: Sends header with the 000A12A0 00000400 000AFFEF + Opcode = Cancel Invite. + + Client: Sends header with the 000A12A0 00000400 000AFFEF + Opcode = Cancel Invite + to indicate that the + work station is no + longer invited. + + Server: Sends Save (Immediate) 000C12A0 00000400 00040402 FFEF + command with + Opcode = Save Screen. + + Client: Sends the screen image LLLL12A0 00000400 00040412 + to be saved. FFEF + + Server: Sends System Request LLLL12A0 00000400 0003 + menu with FFEF + Opcode = Put/Get. + + Client: Sends User Input to LLLL12A0 00000400 0000 + the Sys Req menu. FFEF + + Note: What happens next will depend on the System Request option + selected by the user. After any System Request processing has + + + +Chmielewski [Page 6] + +RFC 1205 5250 Telnet Interface February 1991 + + + completed, the server will continue with the following restore + operation: + + Server: Sends the saved LLLL12A0 00000400 00050412 + screen to be restored, FFEF + Opcode = Restore Screen. + + (No reply is necessary from the client) + + Server: Sends Read Modified 000E12A0 00000400 00010452 0000FFEF + Data Tag (MDT) command, + opcode = Invite. + + At this point the client would "invite" the workstation and enter the + state that it was in prior to the System Request key being hit. + +5. 5250 Data Stream Enhancements + + This section is intended to be used as an addendum to the IBM 5250 + Information Display System, Functions Reference Manual. Described + here are enhancements to the 5250 data stream which are not yet + documented in the current version of that manual. The current + version of that manual at the time of this writing has the IBM + publication number SA21-9247-6. Also described in this section are + corrections to erroneous information contained in SA21-9247-6. + Listed below are the specific corrections and enhancements, with an + approximate page number reference to the above manual. + +5.1 Errors or Inconsistencies in SA21-9247-6 + + The Insert Cursor (IC) order on pages 2-136 and 2-137 is incorrectly + listed with a value of Hex 03; the correct value is Hex 13. + + On page 2-137, the listed "Restrictions" for the Insert Cursor, + Repeat to Address, and Set Buffer Address orders should be updated to + describe how Row and Column values must be valid for the current + display screen size (either 24 x 80 or 27 x 132). + +5.2 Enhancements to Existing 5250 Data Stream Commands/Orders + + A new flag is added to the second byte of the Control Character on + page 2-40. This flag is used to specify whether the cursor should be + moved or not moved at the end of the Write to Display processing. + Bit 1 of the second byte, which was previously reserved, will now be + used for this flag. If bit 1 is a 0, the cursor continues to be + moved to the system IC address on a Lock-to-Unlock keyboard + transition. If bit 1 is a 1, the cursor is not moved. + + + + +Chmielewski [Page 7] + +RFC 1205 5250 Telnet Interface February 1991 + + + A new Field Control Word (FCW) will be added on page 2-65 to indicate + an entry field contains transparent data. This means the entry field + contents are sent from the display screen directly to the host at + read time with no formatting. Therefore, an entry field can contain + any values (Hex 00 to Hex FF). A transparent field is indicated by a + Hex 84xx FCW, where xx is any value. Note: unpredictable results + will occur if a field is defined as both signed numeric and a + transparent field. + + The Read Immediate, Read Input Fields, and Read MDT Fields commands + have been enhanced to include support for transparent fields (page + 2-5). If a transparent FCW is found for an input field, the field + data is not formatted (for example, nulls are not converted to + blanks). + + The restriction listed for the Set Buffer Address (SBA) order (page + 2-138) on the column address equal to zero is no longer always the + case. A reference to Start of Field (SF) row 1/column 1 field + support should be made. A note should be added in SF to describe Row + 1/Column 1 field support. A Row 1/Column 1 field is defined by a SBA + of row 1/column 0, followed by an SF. For a Row 1/Column 1 input + field, the first input-capable position is row 1/column 1. If the SF + defines an input field, the screen attribute is not allowed to be + nondisplay. Writing of the screen attribute is suppressed for a Row + 1/Column 1 field and the attribute discarded. + +5.3 New 5250 Data Stream Commands/Orders + + The Read MDT Fields Alternate input command has been added. It is + the same as the Read MDT Fields command except: + + - The command is indicated by a X'82' + - Leading and embedded nulls within the field remain as nulls + + The Read MDT Fields Immediate Alternate input command has been added. + It is the same as the Read MDT Fields Alternate command except: + + - The command is indicated by a X'83' + - The command is an immediate read command like Read Immediate; + therefore, no control characters follow the command byte, + field data is returned immediately, and the aid code is X'00'. + + The Move Cursor order (MC) has been added (page 2-137). The MC order + moves the cursor to the location specified by the two bytes following + the order. Byte 1 gives the row address and byte 2 gives the column + address. The MC order is useful when the cursor is to be moved + without affecting the system IC address. The MC order is unaffected + by the Write to Display control character values including the "Leave + + + +Chmielewski [Page 8] + +RFC 1205 5250 Telnet Interface February 1991 + + + Cursor" flag (CC1 bit 1). If more than one MC or IC are found in the + data stream, the cursor will move to the address specified in the + last MC or IC. + + Restrictions: + + A parameter error will be posted when: + - There are fewer then two bytes following the order. + - The row address is zero or greater than the number of + rows on the display screen. + - The column address is zero or greater than the number of + columns on the display screen. + + Format: + + Move Cursor Order Byte 1 Byte 2 + + X'14' Row Address Column Address + + Results: + + The address specified by the MC order is used to move the + cursor when the Write to Display is completed. + + The Transparent Data order (TD) has been added (page 2-137). The TD + order is followed by two length bytes and transparent data. The + transparent data is written to the display screen at the current + display address; any values (Hex 00 to Hex FF) are allowed in the + transparent data. All length values are valid as long as the end of + the display screen is not overwritten. + + Restrictions: + + A parameter error will be posted when: + - There are fewer then two bytes following the order. + - There are fewer bytes in the data stream then specified in the + length field. + - Attempting to write beyond the end of the display screen. + + Format: + + TD Order Bytes 1 and 2 Bytes 3 to ? + + X'10' Length of transparent Transparent data + data (not counting + length bytes) + + + + + +Chmielewski [Page 9] + +RFC 1205 5250 Telnet Interface February 1991 + + + Results: + The transparent data is written to the display. + + The Query command is a new input command (page 2-5) and is used by + the server to obtain information on the functional capabilities of + the client 5250 display. When the client receives a Query command, + the client sends a Query Reply describing its capabilities back to + the server. + + The Query command must follow an Escape ('04'X) and Write Structured + Field command ('F3'X). The format of the Query command is as + follows: + + Byte Value Description + ====== ======= ======================== + 0-1 X'0005' Length of command + 2 X'D9' Command Class + 3 X'70' Command Type - Query + 4 X'00' Flag Byte + Bit 0: B'0' - Query Command + Bit 1-7: - Reserved (set to zero) + + The format of the Query Reply is as follows: + + Byte Value Description + ===== ======== =================================== + 0-1 X'0000' Cursor Row/Column (set to zero) + 2 X'88' Inbound Write Structured Field Aid + 3-4 X'003A' Length of Query Reply + 5 X'D9' Command Class + 6 X'70' Command Type - Query + 7 X'80' Flag Byte + Bit 0: B'1' - Query Reply + Bit 1-7: - Reserved (set to zero) + 8-9 Controller Hardware Class + X'0001' - Local Twinax Controller + X'0061' - Local ASCII Controller + X'0101' - SDLC/X.21/X.25 Twinax Controller + (5394 emulating a 5294) + X'0103' - SDLC/X.21/X.25 Twinax Controller (5394) + X'0200' - PC DOS non-DBCS WSF + X'0300' - OS/2 non-DBCS WSF + X'0400' - PC DOS DBCS WSF + X'0500' - OS/2 DBCS WSF + X'0600' - Other WSF or any other 5250 Emulator + 10-12 Controller Code Level + X'010300' - For example, Version 1 Rel 3.0 + 13-28 X'00' Reserved (set to zero) + + + +Chmielewski [Page 10] + +RFC 1205 5250 Telnet Interface February 1991 + + + 29 Device Type + X'01' - 5250 Display or 5250 Emulation + 30-33 C'cccc' Device Type (e.g. 3180 for 3180 Mod 2) + 34-36 C'ccc' Device Model (e.g. 002 for 3180 Mod 2) + 37 Keyboard ID + X'02' - Standard Keyboard + X'82' - G Keyboard + 38 X'00' Extended Keyboard ID + 39 X'00' Reserved + 40-43 X'xxxxxxxx' Display Serial Number + 44-45 Maximum number of input fields + X'0100' - Typically = 256 input fields + 46-48 X'00' Reserved (set to zero) + 49-53 Controller/Display Capability + Bit 0-1: B'00' - No Row 1/Col 1 support + B'01' - Row 1/Col 1 support + Bit 2: B'0' - No Read MDT Alternate Command support + B'1' - Read MDT Alternate Command support + Bit 3: B'0' - Display does not have PA1/PA2 support + B'1' - Display does have PA1/PA2 support + Bit 4: B'0' - Display does not have PA3 support + B'1' - Display does have PA3 support + Bit 5: B'0' - Display does not have Cursor Select support + B'1' - Display does have Cursor Select support + Bit 6: B'0' - Display does not have Move Cursor Order support + B'1' - Display does have Move Cursor Order support + Bit 7: B'0' - No Read MDT Immediate Alt Command support + B'1' - Read MDT Immediate Alt Command support + 50 + Bit 0-3: B'0001' - 24 x 80 Screen Size + B'0011' - Capable of 24 x 80 and 27 x 132 + Bit 4: B'0' - No light pen support + B'1' - Light pen support + Bit 5: B'0' - No Mag Stripe Reader support + B'1' - Mag Stripe Reader support + Bit 6-7: B'00' - Mono display + B'01' - 5292/3179 style color, including color PCs + 51 X'00' - Reserved + 52 + Bit 0-2: B'000' - No Double Byte Character Set (DBCS) + capability + B'001' - Presentation screen DBCS capability only + Bit 3-7: B'00000' - Reserved + 53 + Bit 0-2: B'000' - No graphics capability + B'001' - 5292-2 style graphics + Bit 3-7: B'00000' - Reserved + 54-60 X'00' Reserved (set to zero) + + + +Chmielewski [Page 11] + +RFC 1205 5250 Telnet Interface February 1991 + + +6. References + + 1. IBM, "IBM 5250 Information Display System, Functions + Reference Manual", SA21-9247-6, March 1987. + + 2. Postel, J. and J. Reynolds, "Telnet Protocol Specification", + RFC 854, USC/Information Sciences Institute, May 1983. + + 3. Postel, J. and J. Reynolds, "Telnet Option Specifications", + RFC 855, USC/Information Sciences Institute, May 1983. + + 4. Postel, J. and J. Reynolds, "Telnet Binary Transmission", + RFC 856, USC/Information Sciences Institute, May 1983. + + 5. VanBokkeln, J., "Telnet Terminal-Type Option", RFC 1091, + FTP Software, Inc., February 1989. + + 6. Postel, J. and J. Reynolds, "Telnet End of Record Option", + RFC 885, USC/Information Sciences Institute, December 1983. + +Security Considerations + + Security issues are not discussed in this memo. + +Author's Address + + Paul Chmielewski + IBM Corporation + Highway 52 and 37 Street North West + Rochester, Minnesota 55901 + + Phone: (507) 253-6315 + + EMail: paulc@rchland.iinus1.ibm.com + + + + + + + + + + + + + + + + + +Chmielewski [Page 12] + \ No newline at end of file diff --git a/doc/scs2ascii.1 b/doc/scs2ascii.1 new file mode 100644 index 0000000..9ad62c4 --- /dev/null +++ b/doc/scs2ascii.1 @@ -0,0 +1,55 @@ +'\" t +.ig +Man page for scs2ascii. + +Copyright (C) 1999 Carey Evans. + +You can redistribute and/or modify this document under the terms of +the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) +any later version. + +This document is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.. +.TH TN5250 1 "23 Mar 1999" +.SH NAME +scs2ascii \- convert IBM SCS printer data into ASCII +.SH SYNOPSIS +.B scs2ascii +.SH DESCRIPTION +This program handles the conversion from an SCS print stream from an +AS/400 printer emulation to something suitable for sending to lpr. +It is currently only intended for use by +.BR tn5250 . +.SH "SEE ALSO" +.BR tn5250 (1) +.SH COPYRIGHT +.B scs2ascii +is copyright +.if t \(co +1997, 1998, 1999 Michael Madore. This manpage is copyright +.if t \(co +1999 Carey Evans. +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +.PP +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +.SH AUTHORS +.B scs2ascii +was written by Michael Madore +.RI < mmadore@blarg.net >. +This manual page was written by Carey Evans +.RI < c.evans@clear.net.nz >. diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..e843669 --- /dev/null +++ b/install-sh @@ -0,0 +1,250 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/ltconfig b/ltconfig new file mode 100644 index 0000000..65ec6f6 --- /dev/null +++ b/ltconfig @@ -0,0 +1,3017 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +echo=echo +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec "$SHELL" "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi + +if test "X${echo_test_string+set}" != "Xset"; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running ltconfig again with it. + ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf "%s\n"' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.3 +TIMESTAMP=" (1.385.2.181 1999/07/02 15:49:11)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "${COLLECT_NAMES+set}" != set; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4*) + # PIC is the default for these OSes. + ;; + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + case "$host_os" in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then they + # create non-PIC objects. So, if there were any warnings, we assume that + # PIC is not supported. + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 + need_locks=warn + fi +else + need_locks=no +fi + +if test "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. + +case "$host_os" in +cygwin* | mingw*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case "$host_os" in + aix3* | aix4*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + 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)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + 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~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $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~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' + + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + for symbol in `cat $export_symbols`; do + echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + 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~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $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~ + $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~ + $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~ + $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~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + fi + ;; + + solaris*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case "$host_os" in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + 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)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + 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' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$with_gcc" = yes; then + 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' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + 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' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3* | osf4*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + 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' + else + allow_undefined_flag=' -expect_unresolved \*' + 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' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case "$host_os" in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + # archive_cmds='$LD -G -z text -h $soname -o $lib$libobjs$deplibs' + archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1596: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +file_magic_cmd= +file_magic_test_file= +deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [regex]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +case "$host_os" in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4*) + version_type=linux + # AIX has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + 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' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +bsdi4*) + version_type=linux + library_names_spec='${libname}.so$major ${libname}.so' + soname_spec='${libname}.so' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + finish_cmds='PATH="\$PATH:/sbin" OBJFORMAT="'"$objformat"'" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so.$major' + library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' + case "$host_os" in + irix5*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case "$LD" in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case "$host_vendor" in + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + 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]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac +fi + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2170: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2207: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2251: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2288: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2333: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2395: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo $progname:2405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2433: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2506: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + esac + + case "$lt_cv_dlopen_self" in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case "$lt_cv_dlopen_self_static" in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ + file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case "$var" in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi + +### BEGIN LIBTOOL CONFIG +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "${COLLECT_NAMES+set}" != set; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..ae10cad --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,3975 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# Parse our command line options once, thoroughly. +while test $# -gt 0 +do + arg="$1" + shift + + case "$arg" in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + execute_dlfiles) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case "$mode" in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # Accept any command-line options. + case "$arg" in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + esac + + case "$user_target" in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly in scan + # sets, so we specify it separately. + case "$lastarg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case "$user_target" in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case "$libobj" in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case "$libobj" in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $pic_flag -DPIC $srcfile" + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if test -z "$pic_flag" && test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + # Now arrange that obj and lo_libobj become the same file + $show "$LN_S $obj $lo_libobj" + if $run $LN_S $obj $lo_libobj; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + command="$base_compile $srcfile" + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + C_compiler="$CC" # save it, to compile generated C sources + CC="$nonopt" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (!dll) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case "$prev" in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case "$arg" in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case "$arg" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # We need an absolute path. + case "$dir" in + [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + *) + lib_linked=no + ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + ;; + + *.la) + # Make sure we only generate libraries of the form `libNAME.la'. + case "$outputname" in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + dependency_libs="$deplibs" + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case "$current" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case "$deplibs_check_method" in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case "$potliblink" in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) incase we are running --disable-static + for obj in $libobjs; do + oldobj=`$echo "X$obj" | $Xsed -e "$lo2o"` + if test ! -f $oldobj; then + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case "$output" in + *.lo) + if test -n "$objs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + $show "$LN_S $obj $libobj" + $run $LN_S $obj $libobj || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + # Anything else should be a program. + *) + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + # Create the binary in the object directory, then wrap it. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case "$dlsyms" in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case "$host" in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case "$0" in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + link_against_libtool_libs='$link_against_libtool_libs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname' + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (cd \"\$thisdir\" && eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname$exeext' + progdir=\"\$thisdir/$objdir\" +" + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + *-*-cygwin* | *-*-mingw | *-*-os2*) + # win32 systems need to use the prog path for dll + # lookup to work + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place incase we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + obj=`$echo "X$oldobj" | $Xsed -e "$o2lo"` + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case "$output" in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case "$arg" in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case "$file" in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case "$file" in + *.a | *.lib) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case "$destfile" in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.o | *.obj) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case "$file" in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case "$file" in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + +MODE must be one of the following: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/missing b/missing new file mode 100755 index 0000000..cbe2b0e --- /dev/null +++ b/missing @@ -0,0 +1,188 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`configure.in'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`configure.in'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`configure.in'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in` + if test -z "$files"; then + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` + test -z "$files" || files="$files.in" + else + files=`echo "$files" | sed -e 's/:/ /g'` + fi + test -z "$files" && files="config.h.in" + touch $files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print \ + | sed 's/^\(.*\).am$/touch \1.in/' \ + | sh + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..679bbd5 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 1999/09/14 18:06:28 jasonf Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/src/.lclintrc b/src/.lclintrc new file mode 100644 index 0000000..8e28a97 --- /dev/null +++ b/src/.lclintrc @@ -0,0 +1,14 @@ ++unixlib ++matchanyintegral ++trytorecover +-retvalbool +-retvalint ++charintliteral +-observertrans +-statictrans +-external-prefix "tn5250_" +-type-prefix "Tn5250" +-predboolint ++boolint ++charint +-redef diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..f2b0716 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,71 @@ +## Process this file with automake to produce Makefile.in + +lib_LTLIBRARIES = lib5250.la + +bin_PROGRAMS = scs2ascii\ + tn5250 + +noinst_PROGRAMS = portsnoop + +bin_SCRIPTS = xt5250 + +lib5250_la_SOURCES = buffer.c\ + cursesterm.c\ + debug.c\ + display.c\ + field.c\ + formattable.c\ + printsession.c\ + record.c\ + session.c\ + slangterm.c\ + stream.c\ + telnetstr.c\ + utility.c\ + version.c + +lib5250_la_LIBADD = @with_extra_libs@ + +tn5250_SOURCES = tn5250.c + +tn5250_LDADD = @with_extra_libs@ lib5250.la + +scs2ascii_SOURCES = scs2ascii.c + +scs2ascii_LDADD = @with_extra_libs@ lib5250.la + +pkginclude_HEADERS = buffer.h\ + codes5250.h\ + config.h\ + cursesterm.h\ + debug.h\ + display.h\ + field.h\ + formattable.h\ + printsession.h\ + record.h\ + scs.h\ + session.h\ + slangterm.h\ + stream.h\ + terminal.h\ + transmaps.h\ + utility.h + +include_HEADERS = tn5250.h + +portsnoop_SOURCES = portsnoop.c\ + utility.c + +EXTRA_DIST = .lclintrc\ + xt5250\ + transmaps + +lclint: + @echo "lint checking with lclint... " + @( lclint tn5250.c $(lib5250_la_SOURCES) > lclint.err 2>&1 ; \ + retval=$$? ; \ + echo "`grep -c :.*:.*: lclint.err` errors." ; \ + exit $$retval ) + +.PHONY: lclint diff --git a/src/buffer.c b/src/buffer.c new file mode 100644 index 0000000..294b666 --- /dev/null +++ b/src/buffer.c @@ -0,0 +1,64 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" +#include +#include +#include +#include +#include "buffer.h" +#include "utility.h" + +#define BUFFER_DELTA 128 + +void tn5250_buffer_init(Tn5250Buffer * This) +{ + This->len = This->allocated = 0; + This->data = NULL; +} + +void tn5250_buffer_free(Tn5250Buffer * This) +{ + if (This->data != NULL) + free(This->data); + This->data = NULL; + This->len = This->allocated = 0; +} + +void tn5250_buffer_append_byte(Tn5250Buffer * This, unsigned char b) +{ + if (This->len + 1 >= This->allocated) { + if (This->data == NULL) { + This->allocated = BUFFER_DELTA; + This->data = (unsigned char *) malloc(This->allocated); + } else { + This->allocated += BUFFER_DELTA; + This->data = (unsigned char *) realloc(This->data, This->allocated); + } + } + TN5250_ASSERT (This->data != NULL); + This->data[This->len++] = b; +} + +void tn5250_buffer_append_data(Tn5250Buffer * This, unsigned char *data, int len) +{ + while (len--) + tn5250_buffer_append_byte(This, *data++); +} + +/* vi:set sts=3 sw=3 autoindent: */ diff --git a/src/buffer.h b/src/buffer.h new file mode 100644 index 0000000..67e9051 --- /dev/null +++ b/src/buffer.h @@ -0,0 +1,48 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef BUFFER_H +#define BUFFER_H + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250Buffer { + unsigned char /*@null@*/ *data; + int len; + int allocated; + }; + + typedef /*@abstract@*/ /*@immutable@*/ struct _Tn5250Buffer Tn5250Buffer; + +/* These don't work like new/destroy */ + extern void tn5250_buffer_init( /*@out@*/ Tn5250Buffer * This); + extern void tn5250_buffer_free(Tn5250Buffer * This); + +#define tn5250_buffer_data(This) \ + ((This)->data ? (This)->data : (unsigned char *)"") +#define tn5250_buffer_length(This) ((This)->len) + + extern void tn5250_buffer_append_byte(Tn5250Buffer * This, unsigned char b); + extern void tn5250_buffer_append_data(Tn5250Buffer * This, unsigned char *data, int len); + +#ifdef __cplusplus +} + +#endif +#endif /* BUFFER_H */ diff --git a/src/codes5250.h b/src/codes5250.h new file mode 100644 index 0000000..0870293 --- /dev/null +++ b/src/codes5250.h @@ -0,0 +1,45 @@ +#ifndef CODES5250_H +#define CODES5250_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Misc */ +#define ESC 0x4 + +/* Commands */ +#define CMD_WRITE_TO_DISPLAY 0x11 +#define CMD_CLEAR_UNIT 0x40 +#define CMD_CLEAR_UNIT_ALTERNATE 0x20 +#define CMD_CLEAR_FORMAT_TABLE 0x50 +#define CMD_READ_MDT_FIELDS 0x52 +#define CMD_READ_IMMEDIATE 0x72 +#define CMD_READ_SCREEN_IMMEDIATE 0x62 +#define CMD_WRITE_STRUCTURED_FIELD 0xF3 +#define CMD_SAVE_SCREEN 0x02 +#define CMD_RESTORE_SCREEN 0x12 +#define CMD_WRITE_ERROR_CODE 0x21 +#define CMD_READ_INPUT_FIELDS 0x42 +#define CMD_ROLL 0x23 + +#define CMD_READ_MDT_FIELDS_ALT 0x82 /* FIXME: */ +#define CMD_READ_MDT_FIELDS_IMMEDIATE_ALT 0x83 /* FIXME: */ + +/* Orders - those tagged FIXME are not implemented: */ +#define SOH 0x01 /* Start of header */ +#define RA 0x02 /* Repeat to address */ +#define EA 0x03 /* Erase to Address on 5494 */ /* FIXME: */ +#define TD 0x10 /* Transparent Data on 5494 */ /* FIXME: */ +#define SBA 0x11 /* Set buffer address */ +#define WEA 0x12 /* Write Extended Attribute on 5494 */ /* FIXME: */ +#define IC 0x13 /* Insert cursor */ +#define MC 0x14 /* Move Cursor on 5494 */ /* FIXME: */ +#define WDSF 0x15 /* Write to Display Structured Field on 5494 */ /* FIXME: */ +#define SF 0x1D /* Start of field */ + +#ifdef __cplusplus +} + +#endif +#endif /* CODES_5250_H */ diff --git a/src/cursesterm.h b/src/cursesterm.h new file mode 100644 index 0000000..a17a27a --- /dev/null +++ b/src/cursesterm.h @@ -0,0 +1,32 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef CURSESTERM_H +#define CURSESTERM_H + +#ifdef __cplusplus +extern "C" { +#endif + + extern Tn5250Terminal /*@null@*/ /*@only@*/ *tn5250_curses_terminal_new(void); + extern int tn5250_curses_terminal_use_underscores(Tn5250Terminal *This, int f) /*@modifies This@*/; + +#ifdef __cplusplus +} +#endif + +#endif /* CURSESTERM_H */ diff --git a/src/debug.c b/src/debug.c new file mode 100644 index 0000000..4d52b46 --- /dev/null +++ b/src/debug.c @@ -0,0 +1,247 @@ +/* tn5250 -- an implentation of the 5250 debug protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" + +#ifndef NDEBUG + +#define _TN5250_TERMINAL_PRIVATE_DEFINED + +#include +#include +#include +#include +#include + +#include "utility.h" +#include "record.h" +#include "buffer.h" +#include "stream.h" +#include "display.h" +#include "terminal.h" +#include "debug.h" + +struct _Tn5250TerminalPrivate { + Tn5250Stream *dbgstream; + Tn5250Terminal *slaveterm; + int keyq; +}; + +typedef struct _Tn5250TerminalPrivate Tn5250TerminalPrivate; + +static int debug_stream_connect(Tn5250Stream * This, const char *to); +static void debug_stream_disconnect(Tn5250Stream * This); +static int debug_stream_handle_receive(Tn5250Stream * This); +static void debug_stream_send_packet(Tn5250Stream * This, int length, + int flowtype, unsigned char flags, unsigned char opcode, + unsigned char *data); + +static void debug_terminal_init(Tn5250Terminal *This); +static void debug_terminal_term(Tn5250Terminal *This); +static void debug_terminal_destroy(Tn5250Terminal /*@only@*/ *This); +static int debug_terminal_width(Tn5250Terminal *This); +static int debug_terminal_height(Tn5250Terminal *This); +static int debug_terminal_flags(Tn5250Terminal *This); +static void debug_terminal_update(Tn5250Terminal *This, Tn5250Display *display); +static void debug_terminal_update_indicators(Tn5250Terminal *This, Tn5250Display *display); +static int debug_terminal_waitevent(Tn5250Terminal *This); +static int debug_terminal_getkey(Tn5250Terminal *This); + +int tn5250_debug_stream_init (Tn5250Stream *This) +{ + This->connect = debug_stream_connect; + This->disconnect = debug_stream_disconnect; + This->handle_receive = debug_stream_handle_receive; + This->send_packet = debug_stream_send_packet; + This->destroy = NULL; /* FIXME: */ + This->debugfile = NULL; + return 0; /* Ok */ +} + +Tn5250Terminal *tn5250_debug_terminal_new (Tn5250Terminal *slave, Tn5250Stream *dbgstream) +{ + Tn5250Terminal *This = tn5250_new(Tn5250Terminal, 1); + if (This != NULL) { + This->conn_fd = -1; + This->init = debug_terminal_init; + This->term = debug_terminal_term; + This->destroy = debug_terminal_destroy; + This->width = debug_terminal_width; + This->height = debug_terminal_height; + This->flags = debug_terminal_flags; + This->update = debug_terminal_update; + This->update_indicators = debug_terminal_update_indicators; + This->waitevent = debug_terminal_waitevent; + This->getkey = debug_terminal_getkey; + + This->data = tn5250_new(Tn5250TerminalPrivate, 1); + if (This->data == NULL) { + free (This); + return NULL; + } + This->data->dbgstream = dbgstream; + This->data->slaveterm = slave; + This->data->keyq = -1; + } + return This; +} + +static int debug_stream_connect(Tn5250Stream * This, const char *to) +{ + This->debugfile = fopen (to, "r"); + if (This->debugfile == NULL) + return -1; + return 0; +} + +static void debug_stream_disconnect(Tn5250Stream * This) +{ + if (This->debugfile != NULL) + fclose (This->debugfile); +} + +static int debug_stream_handle_receive(Tn5250Stream * This) +{ + return 1; +} + +static void debug_stream_send_packet(Tn5250Stream * This, int length, + int flowtype, unsigned char flags, unsigned char opcode, + unsigned char *data) +{ + /* noop */ +} + +static void debug_terminal_init(Tn5250Terminal *This) +{ + (* (This->data->slaveterm->init)) (This->data->slaveterm); +} + +static void debug_terminal_term(Tn5250Terminal *This) +{ + (* (This->data->slaveterm->term)) (This->data->slaveterm); +} + +static void debug_terminal_destroy(Tn5250Terminal /*@only@*/ *This) +{ + (* (This->data->slaveterm->destroy)) (This->data->slaveterm); +} + +static int debug_terminal_width(Tn5250Terminal *This) +{ + return (* (This->data->slaveterm->width)) (This->data->slaveterm); +} + +static int debug_terminal_height(Tn5250Terminal *This) +{ + return (* (This->data->slaveterm->height)) (This->data->slaveterm); +} + +static int debug_terminal_flags(Tn5250Terminal *This) +{ + return (* (This->data->slaveterm->flags)) (This->data->slaveterm); +} + +static void debug_terminal_update(Tn5250Terminal *This, Tn5250Display *display) +{ + (* (This->data->slaveterm->update)) (This->data->slaveterm, display); +} + +static void debug_terminal_update_indicators(Tn5250Terminal *This, Tn5250Display *display) +{ + (* (This->data->slaveterm->update_indicators)) (This->data->slaveterm, display); +} + +/* + * This is a hook for the Tn5250Terminal->waitevent method. + */ +static int debug_terminal_waitevent(Tn5250Terminal *This) +{ + char buf[256]; + int n; + + if (feof (This->data->dbgstream->debugfile)) + return (* (This->data->slaveterm->waitevent)) (This->data->slaveterm); + + while (fgets (buf, sizeof (buf)-2, This->data->dbgstream->debugfile)) { + if (buf[0] != '@') + continue; + + if (!memcmp (buf, "@record ", 8)) { + if (This->data->dbgstream->current_record == NULL) + This->data->dbgstream->current_record = tn5250_record_new (); + for (n = 14; n < 49; n += 2) { + unsigned char b; + + if (isspace (buf[n])) + n++; + if (isspace (buf[n])) + break; + + b = (isdigit (buf[n]) ? (buf[n] - '0') : (tolower (buf[n]) - 'a' + 10)) << 4; + b |= (isdigit (buf[n+1]) ? (buf[n+1] - '0') : (tolower (buf[n+1]) - 'a' + 10)); + tn5250_record_append_byte(This->data->dbgstream->current_record, b); + } + } else if (!memcmp (buf, "@eor", 4)) { + if (This->data->dbgstream->current_record == NULL) + This->data->dbgstream->current_record = tn5250_record_new (); + if (This->data->dbgstream->records == NULL) + This->data->dbgstream->records + = This->data->dbgstream->current_record->prev + = This->data->dbgstream->current_record->next + = This->data->dbgstream->current_record; + else { + This->data->dbgstream->current_record->next = This->data->dbgstream->records; + This->data->dbgstream->current_record->prev = This->data->dbgstream->records->prev; + This->data->dbgstream->current_record->next->prev = This->data->dbgstream->current_record; + This->data->dbgstream->current_record->prev->next = This->data->dbgstream->current_record; + } + This->data->dbgstream->current_record = NULL; + This->data->dbgstream->record_count++; + return TN5250_TERMINAL_EVENT_DATA; + } else if (!memcmp (buf, "@abort", 6)) { + /* It's useful to force a core dump sometimes... */ + abort (); + } else if (!memcmp (buf, "@key ", 5)) { + /* FIXME: */ + (* (This->data->slaveterm->waitevent)) (This->data->slaveterm); + This->data->keyq = atoi (buf + 5); + return TN5250_TERMINAL_EVENT_KEY; + } + } + + /* EOF */ + return (* (This->data->slaveterm->waitevent)) (This->data->slaveterm); +} + +static int debug_terminal_getkey(Tn5250Terminal *This) +{ + int ret = This->data->keyq; + + if (This->data->keyq == -1 && feof (This->data->dbgstream->debugfile)) + ret = (* (This->data->slaveterm->getkey)) (This->data->slaveterm); + else + (* (This->data->slaveterm->getkey)) (This->data->slaveterm); + + This->data->keyq = -1; + return ret; +} + +#endif /* NDEBUG */ + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..5a17e3c --- /dev/null +++ b/src/debug.h @@ -0,0 +1,26 @@ +#ifndef DEBUGH +#define DEBUGH + +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef NDEBUG +extern Tn5250Terminal *tn5250_debug_terminal_new (Tn5250Terminal *slave, Tn5250Stream *dbgstream); +#endif + +#endif /* DEBUG */ diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..6b2939b --- /dev/null +++ b/src/display.c @@ -0,0 +1,338 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" +#include +#include +#include +#include "utility.h" +#include "display.h" + +#ifdef NDEBUG +#define ASSERT_VALID(This) +#else +#define ASSERT_VALID(This) \ + { \ + TN5250_ASSERT ((This) != NULL); \ + TN5250_ASSERT ((This)->cy >= 0); \ + TN5250_ASSERT ((This)->cx >= 0); \ + TN5250_ASSERT ((This)->cy < (This)->h); \ + TN5250_ASSERT ((This)->cx < (This)->w); \ + } +#endif + +Tn5250Display *tn5250_display_new(int width, int height) +{ + int n; + Tn5250Display *This = tn5250_new(Tn5250Display, 1); + + if (This == NULL) + return NULL; + + This->w = width; + This->h = height; + This->cx = This->cy = 0; + This->tcx = This->tcy = 0; + This->disp_indicators = 0; + + This->rows = tn5250_new(unsigned char *, height); + if (This->rows == NULL) { + free(This); + return NULL; + } + for (n = 0; n < height; n++) { + This->rows[n] = tn5250_new(unsigned char, width); + if (This->rows[n] == NULL) { + int i; + for (i = 0; i < n; i++) { + free(This->rows[n]); + } + free(This->rows); + free(This); + return NULL; + } + } + + tn5250_display_clear(This); + return This; +} + +Tn5250Display *tn5250_display_copy(Tn5250Display * dsp) +{ + int n; + Tn5250Display *This = tn5250_new(Tn5250Display, 1); + if (This == NULL) + return NULL; + + ASSERT_VALID(dsp); + + This->w = dsp->w; + This->h = dsp->h; + This->cx = dsp->cx; + This->cy = dsp->cy; + This->tcx = dsp->tcx; + This->tcy = dsp->tcy; + This->disp_indicators = dsp->disp_indicators; + This->rows = tn5250_new(unsigned char *, dsp->h); + if (This->rows == NULL) { + free(This); + return NULL; + } + for (n = 0; n < This->h; n++) { + This->rows[n] = tn5250_new(unsigned char, This->w); + if (This->rows[n] == NULL) { + int i; + for (i = 0; i < n; i++) { + if (This->rows[i] != NULL) /* This is to make lclint happy... */ + free(This->rows[i]); + } + free(This->rows); + free(This); + return NULL; + } + memcpy(This->rows[n], dsp->rows[n], dsp->w); + } + + ASSERT_VALID(This); + return This; +} + +void tn5250_display_destroy(Tn5250Display * This) +{ + int n; + for (n = 0; n < This->h; n++) { + free(This->rows[n]); + } + free(This->rows); + free(This); +} + +/* + * Resize the display (say, to 132 columns ;) + */ +void tn5250_display_set_size(Tn5250Display * This, int rows, int cols) +{ + int r; + for (r = 0; r < This->h; r++) + free(This->rows[r]); + free(This->rows); + + This->rows = tn5250_new(unsigned char *, rows); + TN5250_ASSERT (This->rows != NULL); + + for (r = 0; r < rows; r++) + This->rows[r] = tn5250_new(unsigned char, cols); + + This->h = rows; + This->w = cols; + tn5250_display_clear(This); +} + +void tn5250_display_cursor_set(Tn5250Display * This, int y, int x) +{ + This->cy = y; + This->cx = x; + + ASSERT_VALID(This); +} + +void tn5250_display_clear(Tn5250Display * This) +{ + int r, c; + for (r = 0; r < This->h; r++) { + for (c = 0; c < This->w; c++) { + This->rows[r][c] = 0; + } + } + + This->cx = This->cy = 0; +} + +void tn5250_display_right(Tn5250Display * This, int n) +{ + This->cx += n; + This->cy += (This->cx / This->w); + This->cx = (This->cx % This->w); + This->cy = (This->cy % This->h); + + ASSERT_VALID(This); +} + +void tn5250_display_left(Tn5250Display * This) +{ + This->cx--; + if (This->cx == -1) { + This->cx = This->w - 1; + This->cy--; + if (This->cy == -1) { + This->cy = This->h - 1; + } + } + + ASSERT_VALID(This); +} + +void tn5250_display_up(Tn5250Display * This) +{ + if (--This->cy == -1) + This->cy = This->h - 1; + + ASSERT_VALID(This); +} + +void tn5250_display_down(Tn5250Display * This) +{ + if (++This->cy == This->h) + This->cy = 0; + + ASSERT_VALID(This); +} + +void tn5250_display_goto_ic(Tn5250Display * This) +{ + ASSERT_VALID(This); + + This->cy = This->tcy; + This->cx = This->tcx; + + ASSERT_VALID(This); +} + +void tn5250_display_addch(Tn5250Display * This, unsigned char c) +{ + ASSERT_VALID(This); + + This->rows[This->cy][This->cx] = c; + tn5250_display_right(This, 1); + + ASSERT_VALID(This); +} + +void tn5250_display_mvaddnstr(Tn5250Display * This, int y, int x, + const unsigned char *str, int l) +{ + int ocx = This->cx, ocy = This->cy; + tn5250_display_cursor_set(This, y, x); + for (; l; l--, str++) + tn5250_display_addch(This, *str); + This->cy = ocy; + This->cx = ocx; + + ASSERT_VALID(This); +} + +void tn5250_display_indicator_set(Tn5250Display * This, int inds) +{ + TN5250_LOG(("tn5250_display_indicator_set: setting indicators X'%02X'.\n", inds)); + This->disp_indicators |= inds; +} + +void tn5250_display_indicator_clear(Tn5250Display * This, int inds) +{ + TN5250_LOG(("tn5250_display_indicator_clear: clearing indicators X'%02X'.\n", inds)); + This->disp_indicators &= ~inds; +} + +void tn5250_display_del(Tn5250Display * This, int shiftcount) +{ + int x = This->cx, y = This->cy, fwdx, fwdy, i; + + for (i = 0; i < shiftcount; i++) { + fwdx = x + 1; + fwdy = y; + if (fwdx == This->w) { + fwdx = 0; + fwdy++; + } + This->rows[y][x] = This->rows[fwdy][fwdx]; + x = fwdx; + y = fwdy; + } + This->rows[y][x] = 0x40; + + ASSERT_VALID(This); +} + +void tn5250_display_ins(Tn5250Display * This, unsigned char c, int shiftcount) +{ + int x = This->cx, y = This->cy, i; + unsigned char c2; + + for (i = 0; i < shiftcount; i++) { + c2 = This->rows[y][x]; + This->rows[y][x] = c; + c = c2; + if (++x == This->w) { + x = 0; + y++; + } + } + tn5250_display_right(This, 1); + + ASSERT_VALID(This); +} + +void tn5250_display_set_temp_ic(Tn5250Display * This, int y, int x) +{ + This->tcx = x; + This->tcy = y; + + ASSERT_VALID(This); +} + +void tn5250_display_roll(Tn5250Display * This, int top, int bot, int lines) +{ + int n, c; + + ASSERT_VALID(This); + + if (lines == 0) + return; + + if (lines < 0) { + /* Move text up */ + for (n = top; n <= bot; n++) { + if (n + lines >= top) { + for (c = 0; c < This->w; c++) { + This->rows[n + lines][c] = This->rows[n][c]; + } + } + } + } else { + for (n = bot; n >= top; n--) { + if (n + lines <= bot) { + for (c = 0; c < This->w; c++) { + This->rows[n + lines][c] = This->rows[n][c]; + } + } + } + } + ASSERT_VALID(This); +} + +unsigned char tn5250_display_char_at(Tn5250Display * This, int y, int x) +{ + ASSERT_VALID(This); + TN5250_ASSERT(y >= 0); + TN5250_ASSERT(x >= 0); + TN5250_ASSERT(y < This->h); + TN5250_ASSERT(x < This->w); + return This->rows[y][x]; +} + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..926eaca --- /dev/null +++ b/src/display.h @@ -0,0 +1,86 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef DISPLAY_H +#define DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define TN5250_DISPLAY_IND_INHIBIT 0x0001 +#define TN5250_DISPLAY_IND_MESSAGE_WAITING 0x0002 +#define TN5250_DISPLAY_IND_X_SYSTEM 0x0004 +#define TN5250_DISPLAY_IND_X_CLOCK 0x0008 +#define TN5250_DISPLAY_IND_INSERT 0x0010 + + struct _Tn5250Display { + int w, h; + int cx, cy; /* Cursor Position */ + int tcx, tcy; /* for set_new_ic */ + int disp_indicators; + unsigned char /*@notnull@*/ **rows; + }; + + typedef struct _Tn5250Display Tn5250Display; + +/* Displays */ + extern Tn5250Display /*@only@*/ /*@null@*/ *tn5250_display_new(int width, int height); + extern Tn5250Display /*@only@*/ /*@null@*/ *tn5250_display_copy(Tn5250Display *); + extern void tn5250_display_destroy(Tn5250Display /*@only@*/ * This); + + extern void tn5250_display_set_size(Tn5250Display * This, int rows, int cols); + extern void tn5250_display_cursor_set(Tn5250Display * This, int y, int x); + extern void tn5250_display_clear(Tn5250Display * This) /*@modifies This@*/; + extern void tn5250_display_right(Tn5250Display * This, int n); + extern void tn5250_display_left(Tn5250Display * This); + extern void tn5250_display_up(Tn5250Display * This); + extern void tn5250_display_down(Tn5250Display * This); + extern void tn5250_display_goto_ic(Tn5250Display * This); + + extern void tn5250_display_addch(Tn5250Display * This, unsigned char c); + extern void tn5250_display_mvaddnstr(Tn5250Display * This, int y, int x, + const unsigned char *str, int n); + extern void tn5250_display_del(Tn5250Display * This, int shiftcount); + extern void tn5250_display_ins(Tn5250Display * This, unsigned char c, int shiftcount); + extern void tn5250_display_set_temp_ic(Tn5250Display * This, int y, int x); + extern void tn5250_display_roll(Tn5250Display * This, int top, int bot, int lines); + + extern void tn5250_display_indicator_set(Tn5250Display * This, int inds); + extern void tn5250_display_indicator_clear(Tn5250Display * This, int inds); + extern int tn5250_display_save(Tn5250Display * This); + extern void tn5250_display_restore(Tn5250Display * This); + + extern unsigned char tn5250_display_char_at(Tn5250Display * This, int y, int x); + +#define tn5250_display_width(This) ((This)->w) +#define tn5250_display_height(This) ((This)->h) +#define tn5250_display_cursor_x(This) ((This)->cx) +#define tn5250_display_cursor_y(This) ((This)->cy) +#define tn5250_display_indicators(This) ((This)->disp_indicators) + + /* Useful macros for testing/setting INHIBIT flag */ +#define tn5250_display_inhibited(This) ((tn5250_display_indicators (This) & TN5250_DISPLAY_IND_INHIBIT) != 0) +#define tn5250_display_inhibit(This) (tn5250_display_indicator_set (This, TN5250_DISPLAY_IND_INHIBIT)) +#define tn5250_display_uninhibit(This) \ + (tn5250_display_indicator_clear (This, TN5250_DISPLAY_IND_INHIBIT)) + +#ifdef __cplusplus +} + +#endif +#endif /* DISPLAY_H */ diff --git a/src/field.c b/src/field.c new file mode 100644 index 0000000..6508754 --- /dev/null +++ b/src/field.c @@ -0,0 +1,483 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1999 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* TODO: + * - Why a duplicate 'data' field when we have enough info to get + * this from the display? More prone to error. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "utility.h" +#include "display.h" +#include "field.h" +#include "formattable.h" + +Tn5250Field *tn5250_field_new(Tn5250Display * display) +{ + Tn5250Field *This = tn5250_new(Tn5250Field, 1); + if (This == NULL) + return NULL; + memset(This, 0, sizeof(Tn5250Field)); + This->id = -1; + This->display = display; + return This; +} + +Tn5250Field *tn5250_field_copy(Tn5250Field * This) +{ + Tn5250Field *fld = tn5250_new(Tn5250Field, 1); + if (fld == NULL) + return NULL; + memcpy(fld, This, sizeof(Tn5250Field)); + fld->next = NULL; + fld->prev = NULL; + if (This->data != NULL) { + fld->data = (unsigned char *) malloc(This->length); + if (fld->data == NULL) { + free (fld); + return NULL; + } + memcpy(fld->data, This->data, This->length); + } + return fld; +} + +void tn5250_field_destroy(Tn5250Field * This) +{ + if (This->data != NULL) + free(This->data); + free(This); +} + +#ifndef NDEBUG +void tn5250_field_dump(Tn5250Field * This) +{ + int curchar; + Tn5250Uint16 ffw = This->FFW; + + TN5250_LOG(("tn5250_field_dump: ffw flags = ")); + if ((ffw & TN5250_FIELD_BYPASS) != 0) + TN5250_LOG(("bypass ")); + if ((ffw & TN5250_FIELD_DUP_ENABLE) != 0) + TN5250_LOG(("dup-enable ")); + if ((ffw & TN5250_FIELD_MODIFIED) != 0) + TN5250_LOG(("mdt ")); + if ((ffw & TN5250_FIELD_AUTO_ENTER) != 0) + TN5250_LOG(("auto-enter")); + if ((ffw & TN5250_FIELD_FER) != 0) + TN5250_LOG(("fer ")); + if ((ffw & TN5250_FIELD_MONOCASE) != 0) + TN5250_LOG(("monocase ")); + if ((ffw & TN5250_FIELD_MANDATORY) != 0) + TN5250_LOG(("mandatory ")); + TN5250_LOG(("\ntn5250_field_dump: type = %s\n", tn5250_field_description (This))); + TN5250_LOG(("tn5250_field_dump: adjust = %s\ntn5250_field_dump: data = ", tn5250_field_adjust_description (This))); + + if (This->data != NULL) { + for (curchar = 0; curchar < This->length; curchar++) + TN5250_LOG(("%c", tn5250_ebcdic2ascii(This->data[curchar]))); + TN5250_LOG(("\ntn5250_field_dump: hex = ")); + for (curchar = 0; curchar < This->length; curchar++) + TN5250_LOG(("0x%02X ", This->data[curchar])); + } + TN5250_LOG(("\n")); +} +#endif + +/* + * Determine if the screen position at row ``y'', column ``x'' is contained + * within this field. (A hit-test, in other words.) + */ +int tn5250_field_hit_test(Tn5250Field * This, int y, int x) +{ + int pos = (y * tn5250_display_width(This->display)) + x; + + return (pos >= tn5250_field_start_pos(This) + && pos <= tn5250_field_end_pos(This)); +} + +/* + * Figure out the starting address of this field. + */ +int tn5250_field_start_pos(Tn5250Field * This) +{ + return (This->start_row - 1) * tn5250_display_width(This->display) + + (This->start_col - 1); +} + +/* + * Figure out the ending address of this field. + */ +int tn5250_field_end_pos(Tn5250Field * This) +{ + return tn5250_field_start_pos(This) + tn5250_field_length(This) - 1; +} + +/* + * Figure out the ending row of this field. + * FIXME: This value is ones based. + */ +int tn5250_field_end_row(Tn5250Field * This) +{ + return (tn5250_field_end_pos(This) / tn5250_display_width(This->display)) + + 1; +} + +/* + * Figure out the ending column of this field. + * FIXME: This value is ones based. + */ +int tn5250_field_end_col(Tn5250Field * This) +{ + return (tn5250_field_end_pos(This) % tn5250_display_width(This->display)) + + 1; +} + +/* + * Get a description of this field. + */ +const char *tn5250_field_description(Tn5250Field * This) +{ + switch (This->FFW & TN5250_FIELD_FIELD_MASK) { + case TN5250_FIELD_ALPHA_SHIFT: + return "Alpha Shift"; + case TN5250_FIELD_DUP_ENABLE: + return "Dup Enabled"; + case TN5250_FIELD_ALPHA_ONLY: + return "Alpha Only"; + case TN5250_FIELD_NUM_SHIFT: + return "Numeric Shift"; + case TN5250_FIELD_NUM_ONLY: + return "Numeric Only"; + case TN5250_FIELD_KATA_SHIFT: + return "Katakana"; + case TN5250_FIELD_DIGIT_ONLY: + return "Digits Only"; + case TN5250_FIELD_MAG_READER: + return "Mag Reader I/O Field"; + case TN5250_FIELD_SIGNED_NUM: + return "Signed Numeric"; + default: + return "(?)"; + } +} + +/* + * Get a description of the mandatory fill mode for this field. + */ +const char *tn5250_field_adjust_description (Tn5250Field * This) +{ + switch (This->FFW & TN5250_FIELD_MAND_FILL_MASK) { + case TN5250_FIELD_NO_ADJUST: + return "No Adjust"; + case TN5250_FIELD_MF_RESERVED_1: + return "Reserved 1"; + case TN5250_FIELD_MF_RESERVED_2: + return "Reserved 2"; + case TN5250_FIELD_MF_RESERVED_3: + return "Reserved 3"; + case TN5250_FIELD_MF_RESERVED_4: + return "Reserved 4"; + case TN5250_FIELD_RIGHT_ZERO: + return "Right Adjust, Zero Fill"; + case TN5250_FIELD_RIGHT_BLANK: + return "Right Adjust, Blank Fill"; + case TN5250_FIELD_MANDATORY_FILL: + return "Mandatory Fill"; + default: + return ""; + } +} + +/* + * Return the number of characters in this field up to and + * including the last non-blank or non-null character. + * FIXME: Return value is ones-based. + */ +int tn5250_field_count_eof(Tn5250Field *This) +{ + int count; + unsigned char c; + + if (This->data == NULL) + return 0; + + for (count = This->length; count > 0; count--) { + c = This->data[count - 1]; + if (c != '\0' && c != ' ') + break; + } + return (count); +} + +int tn5250_field_is_full(Tn5250Field *This) +{ + if (This->data == NULL) + return 1; + return (This->data[This->length - 1] != 0); +} + +/* + * Return the number of characters in the this field which + * are to the left oof the specified cursor position. Used + * as an index to insert data when the user types. + */ +int tn5250_field_count_left(Tn5250Field *This, int y, int x) +{ + int pos; + + pos = (y * tn5250_display_width(This->display) + x); + pos -= tn5250_field_start_pos(This); + + TN5250_ASSERT (tn5250_field_hit_test(This, y, x)); + TN5250_ASSERT (pos >= 0); + TN5250_ASSERT (pos < tn5250_field_length(This)); + + return pos; +} + +/* + * This returns the number of characters in the specified field + * which are to the right of the specified cursor position. + */ +int tn5250_field_count_right (Tn5250Field *This, int y, int x) +{ + TN5250_ASSERT(tn5250_field_hit_test(This, y, x)); + return tn5250_field_end_pos (This) - + (y * tn5250_display_width(This->display) + x); +} + +unsigned char tn5250_field_get_char (Tn5250Field *This, int pos) +{ + TN5250_ASSERT (pos >= 0); + TN5250_ASSERT (pos < This->length); + return This->data[pos]; +} + +void tn5250_field_put_char (Tn5250Field *This, int pos, unsigned char c) +{ + TN5250_ASSERT (pos >= 0); + TN5250_ASSERT (pos < tn5250_field_length(This)); + TN5250_LOG(("tn5250_field_put_char: id = %d, pos = %d, c = 0x%02X\n", + This->id, pos, c)); + This->data[pos] = c; +} + +void tn5250_field_process_adjust (Tn5250Field *This, int y, int x) +{ + int i; + int count_left; + + switch (tn5250_field_mand_fill_type(This)) { + case TN5250_FIELD_NO_ADJUST: + TN5250_LOG(("Processing Adjust/Edit: No_Adjust\n")); + i = tn5250_field_count_left (This, y, x); + TN5250_LOG(("Processing Adjust/Edit: No_Adjust, At end.\n")); + for (; i < This->length; i++) + This->data[i] = tn5250_ascii2ebcdic('\0'); + TN5250_LOG(("Processing Adjust/Edit: No_Adjust, At end.\n")); + break; + case TN5250_FIELD_RIGHT_ZERO: + TN5250_LOG(("Processing Adjust/Edit: Right Zero Fill\n")); + /* FIXME: This should be a Tn5250Field method... */ + count_left = tn5250_field_count_left (This, y, x); + tn5250_field_shift_right_fill(This, + count_left, tn5250_ascii2ebcdic('0')); + break; + case TN5250_FIELD_RIGHT_BLANK: + TN5250_LOG(("Processing Adjust/Edit: Right Blank Fill\n")); + count_left = tn5250_field_count_right (This, y, x); + tn5250_field_shift_right_fill(This, + count_left, tn5250_ascii2ebcdic(' ')); + break; + case TN5250_FIELD_MANDATORY_FILL: + TN5250_LOG(("Processing Adjust/Edit: Manditory Fill NOT CODED\n")); + /* FIXME: Implement */ + break; + } + tn5250_field_update_display (This); + tn5250_field_dump (This); +} + +/* + * This updates the display from the contents of the field in + * the format table. + */ +void tn5250_field_update_display (Tn5250Field *This) +{ + tn5250_display_mvaddnstr(This->display, This->start_row - 1, + This->start_col - 1, This->data, + This->length); +} + +/* + * Not sure if this works, but I fixed two typos. -JMF + */ +void tn5250_field_set_minus_zone(Tn5250Field *This) +{ + unsigned char lastchar; + + TN5250_ASSERT(This->length >= 2); + TN5250_LOG(("tn5250_field_set_minus_zone: id = %d\n", This->id)); + + lastchar = This->data[This->length - 2]; + if (tn5250_ebcdic2ascii(lastchar) >= '0' && tn5250_ebcdic2ascii(lastchar) <= '9') + lastchar = 0xD0 | (lastchar & 0x0F); + else { + TN5250_LOG(("Error: Tried to set Zone field for Negative number on non digit.\n")); + } + This->data[This->length - 2] = lastchar; + + tn5250_display_cursor_set(This->display, tn5250_field_end_row(This) - 1, + tn5250_field_end_col(This) - 1); + tn5250_display_addch(This->display, tn5250_ascii2ebcdic('-')); +} + +/* + * Shift characters to the left and fill the balance with `fill_char'. + */ +void tn5250_field_shift_right_fill(Tn5250Field * field, int leftcount, unsigned char fill_char) +{ + int o, n; + + n = tn5250_field_length(field) - 1; + if (tn5250_field_is_num_only(field) || tn5250_field_is_signed_num(field)) + n--; + + if (!tn5250_field_is_fer(field)) + leftcount--; + + for (o = leftcount; o >= 0; o--) { + field->data[n] = field->data[o]; + n--; + } + + /* fill the balance with 'fill_char' */ + for (; n >= 0; n--) + field->data[n] = fill_char; +} + +/* + * Set the MDT flag for this field and for the table which owns it. + */ +void tn5250_field_set_mdt (Tn5250Field *This) +{ + TN5250_ASSERT(This->table != NULL); + + This->FFW |= TN5250_FIELD_MODIFIED; + tn5250_table_set_mdt(This->table); +} + +/* + * Destroy all fields in a field list. + */ +Tn5250Field *tn5250_field_list_destroy(Tn5250Field * list) +{ + Tn5250Field *iter, *next; + if ((iter = list) != NULL) { + /*@-usereleased@*/ + do { + next = iter->next; + tn5250_field_destroy(iter); + iter = next; + } while (iter != list); + /*@=usereleased@*/ + } + return NULL; +} + +/* + * Add a field to the end of a list of fields. + */ +Tn5250Field *tn5250_field_list_add(Tn5250Field * list, Tn5250Field * node) +{ + node->prev = node->next = NULL; + + if (list == NULL) { + node->next = node->prev = node; + return node; + } + node->next = list; + node->prev = list->prev; + node->prev->next = node; + node->next->prev = node; + return list; +} + +/* + * Remove a field from a list of fields. + */ +Tn5250Field *tn5250_field_list_remove(Tn5250Field * list, Tn5250Field * node) +{ + if (list == NULL) + return NULL; + if (list->next == list && list == node) { + node->next = node->prev = NULL; + return NULL; + } + if (list == node) + list = list->next; + + node->next->prev = node->prev; + node->prev->next = node->next; + node->prev = node->next = NULL; + return list; +} + +/* + * Find a field by its numeric id. + */ +Tn5250Field *tn5250_field_list_find_by_id(Tn5250Field * list, int id) +{ + Tn5250Field *iter; + + if ((iter = list) != NULL) { + do { + if (iter->id == id) + return iter; + iter = iter->next; + } while (iter != list); + } + return NULL; +} + +/* + * Copy all fields in a list to another list. + */ +Tn5250Field *tn5250_field_list_copy(Tn5250Field * This) +{ + Tn5250Field *new_list = NULL, *iter, *new_field; + if ((iter = This) != NULL) { + do { + new_field = tn5250_field_copy(iter); + if (new_field != NULL) + new_list = tn5250_field_list_add(new_list, new_field); + iter = iter->next; + } while (iter != This); + } + return new_list; +} + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/field.h b/src/field.h new file mode 100644 index 0000000..a3fc21e --- /dev/null +++ b/src/field.h @@ -0,0 +1,175 @@ +#ifndef FIELD_H +#define FIELD_H + +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1999 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250Field { + struct _Tn5250Field /*@dependent@*/ /*@null@*/ *next; + struct _Tn5250Field /*@dependent@*/ /*@null@*/ *prev; + int id; + struct _Tn5250Display /*@dependent@*/ *display; + struct _Tn5250Table /*@dependent@*/ *table; + + Tn5250Uint16 FFW; + Tn5250Uint16 FCW; + unsigned char attribute; + unsigned char /*@null@*/ *data; + int start_row; + int start_col; + int length; + }; + + typedef struct _Tn5250Field Tn5250Field; + +/* Field Formats (Byte one) */ +#define TN5250_FIELD_BYPASS 0x2000 +#define TN5250_FIELD_DUP_ENABLE 0x1000 +#define TN5250_FIELD_MODIFIED 0x0800 +#define TN5250_FIELD_ALPHA_SHIFT 0x0000 /* 000 */ +#define TN5250_FIELD_ALPHA_ONLY 0x0100 /* 100 */ +#define TN5250_FIELD_NUM_SHIFT 0x0200 /* 010 */ +#define TN5250_FIELD_NUM_ONLY 0x0300 /* 011 */ +#define TN5250_FIELD_KATA_SHIFT 0x0400 /* 001 */ +#define TN5250_FIELD_DIGIT_ONLY 0x0500 /* 101 */ +#define TN5250_FIELD_MAG_READER 0x0600 /* 110 */ +#define TN5250_FIELD_SIGNED_NUM 0x0700 /* 111 */ +#define TN5250_FIELD_FIELD_MASK 0x0700 /* 111 */ + +/* Field Formats (Byte two) */ +#define TN5250_FIELD_AUTO_ENTER 0x0080 +#define TN5250_FIELD_FER 0x0040 +#define TN5250_FIELD_MONOCASE 0x0020 +#define TN5250_FIELD_RESERVED 0x0001 +#define TN5250_FIELD_MANDATORY 0x0008 +#define TN5250_FIELD_NO_ADJUST 0x0000 +#define TN5250_FIELD_MF_RESERVED_1 0x0001 +#define TN5250_FIELD_MF_RESERVED_2 0x0002 +#define TN5250_FIELD_MF_RESERVED_3 0x0003 +#define TN5250_FIELD_MF_RESERVED_4 0x0004 +#define TN5250_FIELD_RIGHT_ZERO 0x0005 +#define TN5250_FIELD_RIGHT_BLANK 0x0006 +#define TN5250_FIELD_MANDATORY_FILL 0x0007 +#define TN5250_FIELD_MAND_FILL_MASK 0x0007 + +/* Manipulate fields */ + extern Tn5250Field /*@only@*/ /*@null@*/ *tn5250_field_new(Tn5250Display /*@dependent@*/ * display); + extern Tn5250Field /*@only@*/ /*@null@*/ *tn5250_field_copy(Tn5250Field * This); + extern void tn5250_field_destroy(Tn5250Field /*@only@*/ * This); + + extern int tn5250_field_hit_test(Tn5250Field * This, int y, int x); + extern int tn5250_field_start_pos(Tn5250Field * This); + extern int tn5250_field_end_pos(Tn5250Field * This); + extern int tn5250_field_end_row(Tn5250Field * This); + extern int tn5250_field_end_col(Tn5250Field * This); + extern const char *tn5250_field_description(Tn5250Field * This); + extern const char *tn5250_field_adjust_description(Tn5250Field * This); + + extern int tn5250_field_count_eof(Tn5250Field * This); + extern int tn5250_field_is_full(Tn5250Field * This); + extern int tn5250_field_count_left(Tn5250Field * This, int y, int x); + extern int tn5250_field_count_right(Tn5250Field * This, int y, int x); + extern unsigned char tn5250_field_get_char(Tn5250Field * This, int pos); + extern void tn5250_field_put_char(Tn5250Field *This, int pos, unsigned char c); + extern void tn5250_field_set_minus_zone(Tn5250Field *This); + extern void tn5250_field_process_adjust(Tn5250Field *This, int y, int x); + extern void tn5250_field_shift_right_fill(Tn5250Field * field, int n, unsigned char c); + extern void tn5250_field_update_display(Tn5250Field *This); + extern void tn5250_field_set_mdt(Tn5250Field *This); + +#define tn5250_field_mdt(This) \ + (((This)->FFW & TN5250_FIELD_MODIFIED) != 0) +#define tn5250_field_clear_mdt(This) \ + (void)((This)->FFW &= ~TN5250_FIELD_MODIFIED) +#define tn5250_field_is_bypass(This) \ + (((This)->FFW & TN5250_FIELD_BYPASS) != 0) +#define tn5250_field_is_dup_enable(This) \ + (((This)->FFW & TN5250_FIELD_DUP_ENABLE) != 0) +#define tn5250_field_is_auto_enter(This) \ + (((This)->FFW & TN5250_FIELD_AUTO_ENTER) != 0) +#define tn5250_field_is_fer(This) \ + (((This)->FFW & TN5250_FIELD_FER) != 0) +#define tn5250_field_is_monocase(This) \ + (((This)->FFW & TN5250_FIELD_MONOCASE) != 0) +#define tn5250_field_is_mandatory(This) \ + (((This)->FFW & TN5250_FIELD_MANDATORY) != 0) + +/* Mandatory fill type macros */ +#define tn5250_field_mand_fill_type(This) \ + ((This)->FFW & TN5250_FIELD_MAND_FILL_MASK) +#define tn5250_field_is_no_adjust(This) \ + (tn5250_field_mand_fill_type (This) == TN5250_FIELD_NO_ADJUST) +#define tn5250_field_is_right_zero(This) \ + (tn5250_field_mand_fill_type (This) == TN5250_FIELD_RIGHT_ZERO) +#define tn5250_field_is_right_blank(This) \ + (tn5250_field_mand_fill_type (This) == TN5250_FIELD_RIGHT_BLANK) +#define tn5250_field_is_mand_fill(This) \ + (tn5250_field_mand_fill_type (This) != 0) + +#define tn5250_field_type(This) \ + ((This)->FFW & TN5250_FIELD_FIELD_MASK) +#define tn5250_field_is_alpha_shift(This) \ + (tn5250_field_type (This) == TN5250_FIELD_ALPHA_SHIFT) +#define tn5250_field_is_alpha_only(This) \ + (tn5250_field_type (This) == TN5250_FIELD_ALPHA_ONLY) +#define tn5250_field_is_num_shift(This) \ + (tn5250_field_type (This) == TN5250_FIELD_NUM_SHIFT) +#define tn5250_field_is_num_only(This) \ + (tn5250_field_type (This) == TN5250_FIELD_NUM_ONLY) +#define tn5250_field_is_kata_shift(This) \ + (tn5250_field_type (This) == TN5250_FIELD_KATA_SHIFT) +#define tn5250_field_is_digit_only(This) \ + (tn5250_field_type (This) == TN5250_FIELD_DIGIT_ONLY) +#define tn5250_field_is_mag_reader(This) \ + (tn5250_field_type (This) == TN5250_FIELD_MAG_READER) +#define tn5250_field_is_signed_num(This) \ + (tn5250_field_type (This) == TN5250_FIELD_SIGNED_NUM) + +#define tn5250_field_attribute(This) \ + ((This)->attribute) +#define tn5250_field_start_row(This) \ + ((This)->start_row) +#define tn5250_field_start_col(This) \ + ((This)->start_col) +#define tn5250_field_length(This) \ + ((This)->length) + + +#ifdef NDEBUG +#define tn5250_field_dump(This) (void)0 +#else + extern void tn5250_field_dump(Tn5250Field * This); +#endif + + +/* Manipulate field lists */ + extern Tn5250Field /*@null@*/ *tn5250_field_list_destroy(Tn5250Field /*@null@*/ /*@only@*/ * list); + extern Tn5250Field *tn5250_field_list_add(Tn5250Field /*@null@*/ * list, Tn5250Field /*@dependent@*/ * node); + extern Tn5250Field /*@null@*/ * tn5250_field_list_remove(Tn5250Field /*@null@*/ * list, Tn5250Field * node); + extern Tn5250Field /*@null@*/ /*@observer@*/ * tn5250_field_list_find_by_id(Tn5250Field /*@null@*/ * list, int id); + extern Tn5250Field /*@null@*/ *tn5250_field_list_copy(Tn5250Field /*@null@*/ * list); + +#ifdef __cplusplus +} + +#endif +#endif /* FIELD_H */ diff --git a/src/formattable.c b/src/formattable.c new file mode 100644 index 0000000..281ee26 --- /dev/null +++ b/src/formattable.c @@ -0,0 +1,476 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* TODO: + * - Check to see if This->next_save_id is used before creating a + * new Tn5250TableSaveBuffer. + */ + +#include "config.h" + +#include +#include +#include + +#include "utility.h" +#include "display.h" +#include "field.h" +#include "formattable.h" +#include "ctype.h" +#include "codes5250.h" + +Tn5250Table *tn5250_table_new(Tn5250Display * display) +{ + Tn5250Table *This = tn5250_new(Tn5250Table, 1); + if (This == NULL) + return NULL; + This->curfield = 0; + This->numfields = 0; + This->field_list = NULL; + This->next_save_id = 1; + This->save_buffers = NULL; + This->display = display; + This->MasterMDT = 0; + This->message_line = 25; + return This; +} + +void tn5250_table_destroy(Tn5250Table * This) +{ + Tn5250TableSaveBuffer *iter, *next; + + (void)tn5250_field_list_destroy(This->field_list); + + if ((iter = This->save_buffers) != NULL) { + /*@-usereleased@*/ + do { + next = iter->next; + (void)tn5250_field_list_destroy(iter->fields); + free(iter); + iter = next; + } while (iter != This->save_buffers); + /*@=usereleased@*/ + } + + free (This); +} + +void tn5250_table_add_field(Tn5250Table * This, Tn5250Field * field) +{ + field->id = This->numfields++; + field->table = This; + This->field_list = tn5250_field_list_add(This->field_list, field); +} + +void tn5250_table_set_current_field(Tn5250Table * This, int CurField) +{ + TN5250_LOG(("FormatTable::SetCurField: CurField = %d; This->numfields = %d\n", + CurField, This->numfields)); + + TN5250_ASSERT(CurField == -1 || tn5250_table_field_n(This, CurField) != NULL); + This->curfield = CurField; +} + +int tn5250_table_first_field(Tn5250Table * This) +{ + Tn5250Field *field; + if (This->numfields > 0) { + This->curfield = 0; + field = tn5250_table_field_n(This, This->curfield); + while (field != NULL && tn5250_field_is_bypass(field)) { + if (This->curfield == tn5250_table_field_count(This) - 1) { + This->curfield = -1; + break; + } else + This->curfield++; + field = tn5250_table_field_n(This, This->curfield); + } + } else + This->curfield = -1; + + return (This->curfield); +} + +int tn5250_table_next_field(Tn5250Table * This) +{ + int old_curfield = This->curfield; + Tn5250Field *field; + + TN5250_LOG(("FormatTable::NextField: This->numfields = %d; This->curfield = %d\n", + This->numfields, This->curfield)); + + TN5250_ASSERT(This->curfield != -1); + + if (This->numfields > 0) { + do { + This->curfield = (This->curfield + 1) % This->numfields; + field = tn5250_table_field_n(This, This->curfield); + if (field == NULL) { + This->curfield = -1; + break; + } + } while (tn5250_field_is_bypass(field) && This->curfield != old_curfield); + } else + This->curfield = -1; + + return (This->curfield); +} + +int tn5250_table_next_field2(Tn5250Table * This, int y, int x) +{ + int nx = x, ny = y; + Tn5250Field *field; + if (tn5250_table_field_number(This, y, x) >= 0) + return tn5250_table_next_field(This); + + do { + if (++nx == tn5250_display_width(This->display)) { + nx = 0; + if (++ny == tn5250_display_height(This->display)) + ny = 0; + } + This->curfield = tn5250_table_field_number(This, ny, nx); + } while (This->curfield < 0 && !(x == nx && y == ny)); + + field = tn5250_table_field_n(This, This->curfield); + if (field != NULL) { + if (tn5250_field_is_bypass(field)) + return tn5250_table_next_field(This); + } else + This->curfield = -1; + + return This->curfield; +} + +int tn5250_table_prev_field(Tn5250Table * This) +{ + int old_curfield = This->curfield; + Tn5250Field *field; + + TN5250_LOG(("FormatTable::PrevField: This->numfields = %d; This->curfield = %d\n", + This->numfields, This->curfield)); + + TN5250_ASSERT(This->curfield != -1); + + if (This->numfields > 0) { + do { + if (--This->curfield < 0) + This->curfield = This->numfields - 1; + field = tn5250_table_field_n(This, This->curfield); + } while (field != NULL && tn5250_field_is_bypass(field) + && This->curfield != old_curfield); + } else + This->curfield = -1; + + return (This->curfield); +} + +int tn5250_table_prev_field2(Tn5250Table * This, int y, int x) +{ + int nx = x, ny = y; + Tn5250Field *field; + + if (tn5250_table_field_number(This, y, x) >= 0) + return tn5250_table_prev_field(This); + + do { + if (--x < 0) { + x = tn5250_display_width(This->display) - 1; + if (--y < 0) + y = tn5250_display_height(This->display) - 1; + } + This->curfield = tn5250_table_field_number(This, y, x); + } while (This->curfield < 0 && !(nx == x && ny == y)); + + field = tn5250_table_field_n(This, This->curfield); + if (field != NULL) { + if (tn5250_field_is_bypass(field)) + return tn5250_table_prev_field(This); + } else + This->curfield = -1; + + return This->curfield; +} + +int tn5250_table_field_number(Tn5250Table * This, int y, int x) +{ + Tn5250Field *field; + + field = tn5250_table_field_yx (This, y, x); + return field ? field->id : -1; +} + +Tn5250Field *tn5250_table_field_yx (Tn5250Table *This, int y, int x) +{ + Tn5250Field *iter; + if ((iter = This->field_list) != NULL) { + do { + if (tn5250_field_hit_test(iter, y, x)) + return iter; + iter = iter->next; + } while (iter != This->field_list); + } + return NULL; +} + +int tn5250_table_save(Tn5250Table * This) +{ + Tn5250TableSaveBuffer *buf; + + buf = tn5250_new(Tn5250TableSaveBuffer, 1); + if (buf == NULL) + return -1; /* Out of memory */ + + buf->fields = tn5250_field_list_copy(This->field_list); + if (buf->fields == NULL && This->field_list != NULL) { + free (buf); + return -1; /* Out of memory */ + } + + buf->numfields = This->numfields; + + if (This->save_buffers == NULL) + This->save_buffers = buf->next = buf->prev = buf; + else { + buf->next = This->save_buffers; + buf->prev = This->save_buffers->prev; + buf->next->prev = buf; + buf->prev->next = buf; + } + + if ((buf->id = ++This->next_save_id) == 256) + This->next_save_id = buf->id = 0; + + return buf->id; +} + +void tn5250_table_restore(Tn5250Table * This, int formatnum) +{ + Tn5250TableSaveBuffer *iter; + Tn5250Field *fiter; + + This->MasterMDT = 0; + if ((iter = This->save_buffers) != NULL) { + do { + if (iter->id == formatnum) { + + /* Restore the fields */ + (void)tn5250_field_list_destroy(This->field_list); + This->field_list = iter->fields; + This->numfields = iter->numfields; + + /* Remove the save buffer from the list, destroy it. */ + if (iter->next == iter) + This->save_buffers = NULL; + else { + if (iter == This->save_buffers) + This->save_buffers = This->save_buffers->next; + iter->next->prev = iter->prev; + iter->prev->next = iter->next; + } + free(iter); + + /* Set the master MDT flag if any of the field MDT flags + * are set. HACK: Setting display of each field to our + * display. */ + if ((fiter = This->field_list) != NULL) { + do { + fiter->display = This->display; + if (tn5250_field_mdt (fiter)) + This->MasterMDT = 1; + fiter = fiter->next; + } while (fiter != This->field_list); + } + + return; + } + iter = iter->next; + } while (iter != This->save_buffers); + } +} + +void tn5250_table_clear(Tn5250Table * This) +{ + This->field_list = tn5250_field_list_destroy(This->field_list); + This->numfields = 0; + + This->MasterMDT = 0; + This->message_line = 24; + + This->curfield = 0; + + TN5250_LOG(("FormatTable::Clear: entered.\n")); +} + +void tn5250_table_add_char(Tn5250Table * This, int y, int x, unsigned char Data) +{ + int fieldnum; + int ins_loc; + Tn5250Field *field; + + fieldnum = tn5250_table_field_number(This, y, x); + field = tn5250_field_list_find_by_id(This->field_list, fieldnum); + TN5250_ASSERT(field != NULL); + TN5250_ASSERT(!tn5250_field_is_bypass (field)); + + ins_loc = tn5250_field_count_left(field, y, x); + + tn5250_field_put_char(field, ins_loc, Data); + tn5250_field_set_mdt(field); +} + +void tn5250_table_put_char(Tn5250Table * This, int y, int x, unsigned char Data) +{ + Tn5250Field *field; + int fieldnum; + int ins_loc; + + fieldnum = tn5250_table_field_number(This, y, x); + field = tn5250_field_list_find_by_id(This->field_list, fieldnum); + + TN5250_ASSERT(field != NULL); + TN5250_ASSERT(!tn5250_field_is_bypass (field)); + + ins_loc = tn5250_field_count_left(field, y, x); + tn5250_field_put_char(field, ins_loc, Data); + tn5250_field_set_mdt(field); +} + +void tn5250_table_ins_char(Tn5250Table * This, int y, int x, unsigned char Data) +{ + Tn5250Field *field; + int fieldnum; + int ins_loc; + int shiftcount; + + fieldnum = tn5250_table_field_number(This, y, x); + field = tn5250_field_list_find_by_id(This->field_list, fieldnum); + + TN5250_ASSERT(field != NULL); + TN5250_ASSERT(!tn5250_field_is_bypass (field)); + + ins_loc = tn5250_field_count_left(field, y, x); + shiftcount = tn5250_field_count_right(field, y, x); + + TN5250_LOG(("tn5250_table_ins_char: id = %d, ins_loc = %d, shiftcount = %d\n", + field->id, ins_loc, shiftcount)); + + if (shiftcount > 0) { + memmove(field->data + ins_loc + 1, + field->data + ins_loc, shiftcount); + } + tn5250_field_put_char(field, ins_loc, Data); + tn5250_field_set_mdt(field); +} + +void tn5250_table_del_char(Tn5250Table * This, int y, int x) +{ + Tn5250Field *field; + int fieldnum; + int ins_loc; + int shiftcount; + + fieldnum = tn5250_table_field_number(This, y, x); + field = tn5250_table_field_n(This, fieldnum); + + TN5250_ASSERT(field != NULL); + TN5250_ASSERT(!tn5250_field_is_bypass (field)); + + ins_loc = tn5250_field_count_left(field, y, x); + shiftcount = tn5250_field_count_right(field, y, x); + + TN5250_LOG(("tn5250_table_del_char: id = %d, ins_loc = %d, shiftcount = %d\n", + field->id, ins_loc, shiftcount)); + + if (shiftcount > 0) { + memmove(field->data + ins_loc, + field->data + ins_loc + 1, shiftcount); + } + field->data[ins_loc + shiftcount] = 0x00; + tn5250_field_set_mdt(field); +} + +int tn5250_table_field_exit(Tn5250Table * This, int y, int x) +{ + Tn5250Field *field; + + This->curfield = tn5250_table_field_number (This, y, x); + TN5250_ASSERT(This->curfield >= 0); + field = tn5250_table_field_n (This, This->curfield); + TN5250_ASSERT(field != NULL); + TN5250_ASSERT(!tn5250_field_is_bypass (field)); + + TN5250_LOG(("FormatTable::FieldExit Current Field: %d, Column %d, Row %d\n", + This->curfield, x, y)); + + /* Print the Information about this field for reference */ + TN5250_LOG(("SR %d, SC %d, ER %d, EC %d, Length %d, CountLeft %d, CountRight %d\n", + tn5250_field_start_row(field), + tn5250_field_start_col(field), + tn5250_field_end_row(field), + tn5250_field_end_col(field), + tn5250_field_length(field), + tn5250_field_count_left(field, y, x), + tn5250_field_count_right(field, y, x))); + tn5250_field_dump(field); + + /* Note as you read this code column and Row are numbered as 1 offset + where as X and Y are 0 offset in the upper left corner */ + + /* FIXME: This seems odd... can't we just call tn5250_field_process_adjust? */ + switch (tn5250_field_type(field)) { + case TN5250_FIELD_ALPHA_SHIFT: + TN5250_LOG(("Processing Alpha Shift\n")); + /* accept all characters */ + tn5250_field_process_adjust(field, y, x); + break; + case TN5250_FIELD_ALPHA_ONLY: + TN5250_LOG(("Processing Alpha Only\n")); + tn5250_field_process_adjust(field, y, x); + break; + case TN5250_FIELD_NUM_SHIFT: + TN5250_LOG(("Processing Numeric Shift\n")); + tn5250_field_process_adjust(field, y, x); + break; + case TN5250_FIELD_NUM_ONLY: + TN5250_LOG(("Processing Numberic Only\n")); + tn5250_field_process_adjust(field, y, x); + break; + case TN5250_FIELD_KATA_SHIFT: + TN5250_LOG(("Processing Katakana NOT CODED\n")); + break; + case TN5250_FIELD_DIGIT_ONLY: + TN5250_LOG(("Processing Digit Only\n")); + tn5250_field_process_adjust(field, y, x); + break; + case TN5250_FIELD_MAG_READER: + TN5250_LOG(("Processing Mag Reader NOT CODED\n")); + /* FIXME: Implement */ + break; + case TN5250_FIELD_SIGNED_NUM: + TN5250_LOG(("Processing Signed Numeric\n")); + tn5250_field_shift_right_fill(field, + tn5250_field_count_left(field, y, x), tn5250_ascii2ebcdic(' ')); + tn5250_field_update_display (field); + } + + tn5250_field_set_mdt(field); + return (0); +} + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/formattable.h b/src/formattable.h new file mode 100644 index 0000000..22b818a --- /dev/null +++ b/src/formattable.h @@ -0,0 +1,90 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef FORMATTABLE_H +#define FORMATTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250TableSaveBuffer { + struct _Tn5250TableSaveBuffer /*@dependent@*/ *next; + struct _Tn5250TableSaveBuffer /*@dependent@*/ *prev; + int id; + + int numfields; + Tn5250Field /*@null@*/ *fields; + }; + + typedef struct _Tn5250TableSaveBuffer Tn5250TableSaveBuffer; + + struct _Tn5250Table { + Tn5250Field /*@null@*/ *field_list; + Tn5250Display /*@dependent@*/ *display; + int numfields; + int MasterMDT; + Tn5250TableSaveBuffer /*@null@*/ *save_buffers; + int message_line; + int curfield; + int next_save_id; + }; + + typedef struct _Tn5250Table Tn5250Table; + + extern /*@null@*/ /*@only@*/ Tn5250Table *tn5250_table_new(Tn5250Display /*@dependent@*/ * display); + extern void tn5250_table_destroy(Tn5250Table /*@only@*/ * This); + + extern void tn5250_table_add_field(Tn5250Table * This, Tn5250Field * field); + extern void tn5250_table_set_current_field(Tn5250Table * This, int CurField); + extern int tn5250_table_first_field(Tn5250Table * This); + extern int tn5250_table_next_field(Tn5250Table * This); + extern int tn5250_table_next_field2(Tn5250Table * This, int y, int x); + extern int tn5250_table_prev_field(Tn5250Table * This); + extern int tn5250_table_prev_field2(Tn5250Table * This, int y, int x); + extern int tn5250_table_field_number(Tn5250Table * This, int y, int x); + + extern void tn5250_table_clear(Tn5250Table * This); + extern int tn5250_table_save(Tn5250Table * This); + extern void tn5250_table_restore(Tn5250Table * This, int formatnum); + extern int tn5250_table_field_exit(Tn5250Table * This, int y, int x); + extern void tn5250_table_del_char(Tn5250Table * This, int y, int x); + extern void tn5250_table_ins_char(Tn5250Table * This, int y, int x, unsigned char c); + extern void tn5250_table_add_char(Tn5250Table * This, int y, int x, unsigned char c); + extern void tn5250_table_put_char(Tn5250Table * This, int y, int x, unsigned char cur_order); + extern void tn5250_table_process_adjust(Tn5250Table * This, Tn5250Display * dsp, int y, int x); + + extern Tn5250Field *tn5250_table_field_yx (Tn5250Table *This, int y, int x); + +#define tn5250_table_field_n(This,n) \ + (tn5250_field_list_find_by_id ((This)->field_list, (n))) + +#define tn5250_table_mdt(This) ((This)->MasterMDT) +#define tn5250_table_set_mdt(This) (void) ((This)->MasterMDT = 1) +#define tn5250_table_clear_mdt(This) (void) ((This)->MasterMDT = 0) +#define tn5250_table_set_message_line(This,row) (void) ((This)->message_line = (row)) + +#define tn5250_table_field_count(This) ((This)->numfields) +#define tn5250_table_current_field(This) ((This)->curfield) +#define tn5250_table_mdt(This) ((This)->MasterMDT) +#define tn5250_table_message_line(This) ((This)->message_line) + +#ifdef __cplusplus +} + +#endif +#endif diff --git a/src/portsnoop.c b/src/portsnoop.c new file mode 100644 index 0000000..b00250b --- /dev/null +++ b/src/portsnoop.c @@ -0,0 +1,156 @@ +/* + portsnoop.c - Quick hack so we can inspect the data stream as a man in the middle. + + Run us from inetd. +*/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utility.h" + +int sockfd; +struct sockaddr_in destaddr; +fd_set fdr; +unsigned char buf[1024]; +int buf_len; +u_long arg; +FILE* logfile; + +void log(char d, unsigned char *buf, int len); + +int main(int argc, char **argv) +{ + if(argc != 4) + { + fprintf(stderr,"portsnoop: Syntax is `portsnoop destip destport logfile'.\n"); + exit(255); + } + if((logfile = fopen(argv[3],"w")) == NULL) + { + perror("fopen"); + exit(255); + } + close(2); + dup2(fileno(logfile),2); + if((destaddr.sin_addr.s_addr = inet_addr(argv[1])) == INADDR_NONE) + { + perror("inet_addr"); + exit(255); + } + if((destaddr.sin_port = htons(atoi(argv[2]))) == 0) + { + fprintf(stderr,"portsnoop: Invalid port.\n"); + exit(255); + } + destaddr.sin_family = AF_INET; + + if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) + { + perror("socket"); + exit(255); + } + if(connect(sockfd, (struct sockaddr*)&destaddr, sizeof (struct sockaddr_in)) == -1) + { + perror("connect"); + exit(255); + } + arg = 1; + if(ioctl(sockfd, FIONBIO, &arg) == -1) + { + perror("ioctl"); + exit(255); + } + arg = 1; + if(ioctl(0, FIONBIO, &arg) == -1) + { + perror("ioctl"); + exit(255); + } + + tn5250_settransmap("en"); + + while(1) + { + FD_ZERO(&fdr); + FD_SET(sockfd, &fdr); + FD_SET(0, &fdr); + if(select (sockfd+1, &fdr, NULL, NULL, NULL) == -1) + { + continue; + } + if(FD_ISSET(sockfd, &fdr)) + { + buf_len = recv(sockfd, buf, sizeof(buf), 0); + if(buf_len == -1) + { + perror("recv"); + exit(255); + } + log('<', buf, buf_len); + if (write(1,buf,buf_len) != buf_len) + { + perror("write"); + exit(255); + } + } + if(FD_ISSET(0, &fdr)) + { + buf_len = read(0, buf, sizeof(buf)); + if(buf_len == -1) + { + perror("read"); + exit(255); + } + log('>', buf, buf_len); + if(send(sockfd, buf, buf_len, 0) != buf_len) + { + perror("send"); + exit(255); + } + } + } +} + +void log(char d, unsigned char *buf, int len) +{ + int x; + char hr[17]; + + hr[16] = 0; + if(len == 0) { + fprintf(logfile,"%c closed connection.\n",d); + exit(0); + } + while(len>0) + { + fprintf(logfile,"%c ",d); + for(x=0; x<16; x++) + { + if(x +#include +#include "buffer.h" +#include "record.h" +#include "stream.h" +#include +#include "printsession.h" +#include "utility.h" + +static int tn5250_print_session_waitevent(Tn5250PrintSession * This); + +Tn5250PrintSession *tn5250_print_session_new() +{ + Tn5250PrintSession *This; + + This = tn5250_new(Tn5250PrintSession, 1); + if (This == NULL) + return NULL; + + This->rec = tn5250_record_new(); + if (This->rec == NULL) { + free (This); + return NULL; + } + + This->stream = NULL; + This->printfile = NULL; + This->output_cmd = NULL; + This->conn_fd = -1; + return This; +} + +void tn5250_print_session_destroy(Tn5250PrintSession * This) +{ + if (This->stream != NULL) + tn5250_stream_destroy(This->stream); + if (This->rec != NULL) + tn5250_record_destroy(This->rec); + if (This->output_cmd != NULL) + free(This->output_cmd); + free (This); +} + +void tn5250_print_session_set_fd(Tn5250PrintSession * This, SOCKET_TYPE fd) +{ + This->conn_fd = fd; +} + +void tn5250_print_session_set_stream(Tn5250PrintSession * This, + Tn5250Stream * newstream) +{ + if (This->stream != NULL) + tn5250_stream_destroy (This->stream); + This->stream = newstream; +} + +void tn5250_print_session_set_output_command(Tn5250PrintSession * This, + const char *output_cmd) +{ + if (This->output_cmd != NULL) + free(This->output_cmd); + This->output_cmd = (char *) malloc(strlen(output_cmd) + 1); + if (This->output_cmd != NULL) + strcpy(This->output_cmd, output_cmd); +} + +void tn5250_print_session_get_response_code(Tn5250PrintSession * This, + char *code) +{ + code[0] = tn5250_ebcdic2ascii(This->rec->data[5]); + code[1] = tn5250_ebcdic2ascii(This->rec->data[6]); + code[2] = tn5250_ebcdic2ascii(This->rec->data[7]); + code[3] = tn5250_ebcdic2ascii(This->rec->data[8]); + code[4] = '\0'; +} + +void tn5250_print_session_main_loop(Tn5250PrintSession * This) +{ + int pcount; + int newjob; + char responsecode[5]; + + while (1) { + if (tn5250_print_session_waitevent(This)) { + tn5250_stream_handle_receive(This->stream); + pcount = tn5250_stream_record_count(This->stream); + if (pcount > 0) { + if (This->rec != NULL) + tn5250_record_destroy(This->rec); + This->rec = tn5250_stream_get_record(This->stream); + tn5250_print_session_get_response_code(This, responsecode); + if (strcmp(responsecode, "I902")) { + printf("Could not establish printer session: %s\n", + responsecode); + exit(1); + } else { + printf("Printer session established.\n"); + break; + } + } + } + } + + newjob = 1; + while (1) { + if (tn5250_print_session_waitevent(This)) { + tn5250_stream_handle_receive(This->stream); + pcount = tn5250_stream_record_count(This->stream); + if (pcount > 0) { + if (newjob) { + char *output_cmd; + if ((output_cmd = This->output_cmd) == NULL) + output_cmd = "scs2ascii |lpr"; + This->printfile = popen(output_cmd, "w"); + TN5250_ASSERT(This->printfile != NULL); + newjob = 0; + } + if (This->rec != NULL) + tn5250_record_destroy(This->rec); + This->rec = tn5250_stream_get_record(This->stream); + tn5250_stream_print_complete(This->stream); + if (tn5250_record_length(This->rec) == 0x11) { + printf("Job Complete\n"); + pclose(This->printfile); + newjob = 1; + } else { + while (!tn5250_record_is_chain_end(This->rec)) + fprintf(This->printfile, "%c", tn5250_record_get_byte(This->rec)); + } + } + } + } + +} + +static int tn5250_print_session_waitevent(Tn5250PrintSession * This) +{ + fd_set fdr; + int result = 0; + + FD_ZERO(&fdr); + FD_SET(0, &fdr); + FD_SET(This->conn_fd, &fdr); + select(This->conn_fd + 1, &fdr, NULL, NULL, NULL); + + if (FD_ISSET(This->conn_fd, &fdr)) + result = 1; + + return result; +} diff --git a/src/printsession.h b/src/printsession.h new file mode 100644 index 0000000..21dba72 --- /dev/null +++ b/src/printsession.h @@ -0,0 +1,49 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef PRINTSESSION_H +#define PRINTSESSION_H + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250PrintSession { + Tn5250Stream /*@null@*/ /*@owned@*/ *stream; + Tn5250Record /*@owned@*/ *rec; + int conn_fd; + FILE /*@null@*/ *printfile; + char /*@null@*/ *output_cmd; + }; + + typedef struct _Tn5250PrintSession Tn5250PrintSession; + + extern Tn5250PrintSession /*@only@*/ /*@null@*/ *tn5250_print_session_new(); + extern void tn5250_print_session_destroy(Tn5250PrintSession /*@only@*/ * This); + extern void tn5250_print_session_set_fd(Tn5250PrintSession * This, SOCKET_TYPE fd); + extern void tn5250_print_session_get_response_code(Tn5250PrintSession * This, char /*@out@*/ *code); + extern void tn5250_print_session_set_stream(Tn5250PrintSession * This, Tn5250Stream /*@owned@*/ * s); + extern void tn5250_print_session_set_output_command(Tn5250PrintSession * This, const char *output_cmd); + extern void tn5250_print_session_main_loop(Tn5250PrintSession * This); + +#define tn5250_print_session_stream(This) ((This)->stream) + +#ifdef __cplusplus +} + +#endif +#endif /* PRINTSESSION_H */ diff --git a/src/record.h b/src/record.h new file mode 100644 index 0000000..abb6433 --- /dev/null +++ b/src/record.h @@ -0,0 +1,103 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef RECORD_H +#define RECORD_H + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250Record { + struct _Tn5250Record /*@dependent@*/ *prev; + struct _Tn5250Record /*@dependent@*/ *next; + + unsigned char *data; + int allocated, length; + unsigned char flowtype[2]; + unsigned char flags; + unsigned char opcode; + int cur_pos; + int header_length; + }; + + typedef struct _Tn5250Record Tn5250Record; + +#define TN5250_RECORD_FLOW_DISPLAY 0x00 +#define TN5250_RECORD_FLOW_STARTUP 0x90 +#define TN5250_RECORD_FLOW_SERVERO 0x11 +#define TN5250_RECORD_FLOW_CLIENTO 0x12 + +#define TN5250_RECORD_H_NONE 0 +#define TN5250_RECORD_H_ERR 0x80 +#define TN5250_RECORD_H_ATN 0x40 +#define TN5250_RECORD_H_PRINTER_READY 0x20 +#define TN5250_RECORD_H_FIRST_OF_CHAIN 0x10 +#define TN5250_RECORD_H_LAST_OF_CHAIN 0x08 +#define TN5250_RECORD_H_SRQ 0x04 +#define TN5250_RECORD_H_TRQ 0x02 +#define TN5250_RECORD_H_HLP 0x01 + +#define TN5250_RECORD_OPCODE_NO_OP 0 +#define TN5250_RECORD_OPCODE_INVITE 1 +#define TN5250_RECORD_OPCODE_OUTPUT_ONLY 2 +#define TN5250_RECORD_OPCODE_PUT_GET 3 +#define TN5250_RECORD_OPCODE_SAVE_SCR 4 +#define TN5250_RECORD_OPCODE_RESTORE_SCR 5 +#define TN5250_RECORD_OPCODE_READ_IMMED 6 +#define TN5250_RECORD_OPCODE_READ_SCR 8 +#define TN5250_RECORD_OPCODE_CANCEL_INVITE 10 +#define TN5250_RECORD_OPCODE_MESSAGE_ON 11 +#define TN5250_RECORD_OPCODE_MESSAGE_OFF 12 +#define TN5250_RECORD_OPCODE_PRINT_COMPLETE 1 +#define TN5250_RECORD_OPCODE_CLEAR 2 + + extern Tn5250Record /*@only@*/ *tn5250_record_new(void); + extern void tn5250_record_destroy(Tn5250Record /*@only@*/ * This); + extern void tn5250_record_append_byte(Tn5250Record * This, unsigned char c); + + extern unsigned char tn5250_record_get_byte(Tn5250Record * This); + extern void tn5250_record_unget_byte(Tn5250Record * This); + extern void tn5250_record_set_flow_type(Tn5250Record * This, unsigned char byte1, unsigned char byte2); +#define tn5250_record_set_flags(This,newflags) (void)((This)->flags = (newflags)) +#define tn5250_record_length(This) ((This)->length) + +/* Should these be hidden? */ +#define tn5250_record_set_opcode(This,newop) (void)((This)->opcode = (newop)) +#define tn5250_record_set_header_length(This,newlen) (void)((This)->header_length = (newlen)) +#define tn5250_record_opcode(This) ((This)->opcode) +#define tn5250_record_flow_type(This) (((This)->flowtype[0] << 8) | This->flowtype[1]) + extern int tn5250_record_is_chain_end(Tn5250Record * This); +#define tn5250_record_sys_request(This) (((This)->flags & TN5250_RECORD_H_SRQ) != 0) +#define tn5250_record_attention(This) (((This)->flags & TN5250_RECORD_H_ATN) != 0) + +/* Manipulating lists of records (used in stream.c) */ + extern Tn5250Record /*@null@*/ *tn5250_record_list_add(Tn5250Record /*@null@*/ * list, Tn5250Record /*@dependent@*/ * record); + extern Tn5250Record *tn5250_record_list_remove(Tn5250Record * list, Tn5250Record * record); + extern Tn5250Record *tn5250_record_list_destroy(Tn5250Record /*@only@*/ /*@null@*/ * list); + +#ifdef NDEBUG +#define tn5250_record_dump(This) (void)0 +#else + extern void tn5250_record_dump(Tn5250Record * This); +#endif + +#ifdef __cplusplus +} + +#endif +#endif /* RECORD_H */ diff --git a/src/scs.h b/src/scs.h new file mode 100644 index 0000000..2501566 --- /dev/null +++ b/src/scs.h @@ -0,0 +1,34 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997-1999 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef SCS +#define SCS + +#define NOOP 0x00 +#define TRANSPARENT 0x03 +#define SW 0x2A +#define RFF 0x3A + +#define AVPP 0xC4 +#define AHPP 0xC0 +#define CR 0x0D +#define NL 0x15 +#define RNL 0x06 +#define HT 0x05 +#define FF 0x0C + +#endif diff --git a/src/scs2ascii.c b/src/scs2ascii.c new file mode 100644 index 0000000..afae0f6 --- /dev/null +++ b/src/scs2ascii.c @@ -0,0 +1,595 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997-1999 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" + +#include + +#include "utility.h" +#include "scs.h" + +static void scs2ascii_sic(); +static void scs2ascii_sil(); +static void scs2ascii_sls(); +static void scs2ascii_process34(); +static void scs2ascii_process2b(); +static void scs2ascii_rff(); +static void scs2ascii_noop(); +static void scs2ascii_transparent(); +static void scs2ascii_processd2(); +static void scs2ascii_process03(); +static void scs2ascii_scs(); +static void scs2ascii_ssld(); +static void scs2ascii_process04(); +static void scs2ascii_processd1(); +static void scs2ascii_process06(); +static void scs2ascii_process07(); +static void scs2ascii_processd103(); +static void scs2ascii_stab(); +static void scs2ascii_jtf(); +static void scs2ascii_sjm(); +static void scs2ascii_spps(); +static void scs2ascii_ppm(); +static void scs2ascii_svm(); +static void scs2ascii_spsu(); +static void scs2ascii_sea(); +static void scs2ascii_shm(); +static void scs2ascii_sgea(); +static void scs2ascii_cr(); +static void scs2ascii_nl(); +static void scs2ascii_rnl(); +static void scs2ascii_ht(); +static void scs2ascii_ahpp(); +static void scs2ascii_avpp(); +static void scs2ascii_processd3(); +static void scs2ascii_sto(); +static void scs2ascii_ff(); + +unsigned char curchar; +unsigned char nextchar; +int current_line; +int new_line; +int mpp; +int ccp; + +int main() +{ + tn5250_settransmap("en"); + current_line = 1; + new_line = 1; + mpp = 132; + ccp = 1; + + while (!feof(stdin)) { + curchar = fgetc(stdin); + switch (curchar) { + case TRANSPARENT:{ + scs2ascii_transparent(); + break; + } + case RFF:{ + scs2ascii_rff(); + break; + } + case NOOP:{ + scs2ascii_noop(); + break; + } + case CR:{ + scs2ascii_cr(); + break; + } + case FF:{ + scs2ascii_ff(); + break; + } + case NL:{ + scs2ascii_nl(); + break; + } + case RNL:{ + scs2ascii_rnl(); + break; + } + case HT:{ + scs2ascii_ht(); + break; + } + case 0x34:{ + scs2ascii_process34(); + break; + } + case 0x2B:{ + scs2ascii_process2b(); + break; + } + case 0xFF:{ + /* This is a hack */ + /* Don't know where the 0xFF is coming from */ + break; + } + default:{ + if (new_line) { + new_line = 0; + } + printf("%c", tn5250_ebcdic2ascii(curchar)); + ccp++; + fprintf(stderr, ">%x\n", curchar); + } + } + + } + return (0); +} + +static void scs2ascii_ht() +{ + fprintf(stderr, "HT\n"); +} + +static void scs2ascii_rnl() +{ + fprintf(stderr, "RNL\n"); +} + +static void scs2ascii_nl() +{ + if (!new_line) { + } + printf("\n"); + new_line = 1; + ccp = 1; + fprintf(stderr, "NL\n"); +} + +static void scs2ascii_ff() +{ + printf("\f"); + fprintf(stderr, "FF\n"); +} + +static void scs2ascii_cr() +{ + fprintf(stderr, "CR\n"); +} + +static void scs2ascii_transparent() +{ + + int bytecount; + int loop; + + bytecount = fgetc(stdin); + fprintf(stderr, "TRANSPARENT (%x) = ", bytecount); + for (loop = 0; loop < bytecount; loop++) { + printf("%c", fgetc(stdin)); + } +} + +static void scs2ascii_rff() +{ + fprintf(stderr, "RFF\n"); +} + +static void scs2ascii_noop() +{ + fprintf(stderr, "NOOP\n"); +} + +static void scs2ascii_process34() +{ + + curchar = fgetc(stdin); + switch (curchar) { + case AVPP:{ + scs2ascii_avpp(); + break; + } + case AHPP:{ + scs2ascii_ahpp(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x34 command %x\n", curchar); + } + } +} + +static void scs2ascii_avpp() +{ + fprintf(stderr, "AVPP %d\n", fgetc(stdin)); +} + +static void scs2ascii_ahpp() +{ + int position; + int loop; + + position = fgetc(stdin); + if (ccp > position) { + printf("\r"); + for (loop = 0; loop < position; loop++) { + printf(" "); + } + } else { + for (loop = 0; loop < position - ccp; loop++) { + printf(" "); + } + } + fprintf(stderr, "AHPP %d\n", position); +} + +static void scs2ascii_process2b() +{ + + curchar = fgetc(stdin); + switch (curchar) { + case 0xD1:{ + scs2ascii_processd1(); + break; + } + case 0xD2:{ + scs2ascii_processd2(); + break; + } + case 0xD3:{ + scs2ascii_processd3(); + break; + } + case 0xC8:{ + scs2ascii_sgea(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x2B command %x\n", curchar); + } + } +} + +static void scs2ascii_processd3() +{ + curchar = fgetc(stdin); + nextchar = fgetc(stdin); + + if (nextchar == 0xF6) { + scs2ascii_sto(); + } else { + fprintf(stderr, "ERROR: Unknown 0x2BD3 %x %x", curchar, nextchar); + } +} + +static void scs2ascii_sto() +{ + int loop; + + fprintf(stderr, "STO = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_sgea() +{ + fprintf(stderr, "SGEA = %x %x %x\n", fgetc(stdin), fgetc(stdin), fgetc(stdin)); +} + +static void scs2ascii_processd1() +{ + curchar = fgetc(stdin); + switch (curchar) { + case 0x06:{ + scs2ascii_process06(); + break; + } + case 0x07:{ + scs2ascii_process07(); + break; + } + case 0x03:{ + scs2ascii_processd103(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x2BD1 command %x\n", curchar); + } + } +} + +static void scs2ascii_process06() +{ + curchar = fgetc(stdin); + if (curchar == 0x01) { + fprintf(stderr, "GCGID = %x %x %x %x\n", fgetc(stdin), fgetc(stdin), + fgetc(stdin), fgetc(stdin)); + } else { + fprintf(stderr, "ERROR: Unknown 0x2BD106 command %x\n", curchar); + } +} + +static void scs2ascii_process07() +{ + curchar = fgetc(stdin); + if (curchar == 0x05) { + fprintf(stderr, "FID = %x %x %x %x %x\n", fgetc(stdin), fgetc(stdin), + fgetc(stdin), fgetc(stdin), fgetc(stdin)); + } else { + fprintf(stderr, "ERROR: Unknown 0x2BD107 command %x\n", curchar); + } +} + +static void scs2ascii_processd103() +{ + curchar = fgetc(stdin); + if (curchar == 0x81) { + fprintf(stderr, "SCGL = %x\n", fgetc(stdin)); + } else { + fprintf(stderr, "ERROR: Unknown 0x2BD103 command %x\n", curchar); + } +} + +static void scs2ascii_processd2() +{ + curchar = fgetc(stdin); + nextchar = fgetc(stdin); + + + switch (nextchar) { + case 0x01:{ + scs2ascii_stab(); + break; + } + case 0x03:{ + scs2ascii_jtf(); + break; + } + case 0x0D:{ + scs2ascii_sjm(); + break; + } + case 0x40:{ + scs2ascii_spps(); + break; + } + case 0x48:{ + scs2ascii_ppm(); + break; + } + case 0x49:{ + scs2ascii_svm(); + break; + } + case 0x4c:{ + scs2ascii_spsu(); + break; + } + case 0x85:{ + scs2ascii_sea(); + break; + } + case 0x11:{ + scs2ascii_shm(); + break; + } + default:{ + switch (curchar) { + case 0x03:{ + scs2ascii_process03(); + break; + } + case 0x04:{ + scs2ascii_process04(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x2BD2 command %x\n", curchar); + } + } + } + } + +} + +static void scs2ascii_stab() +{ + int loop; + + fprintf(stderr, "STAB = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_jtf() +{ + int loop; + + fprintf(stderr, "JTF = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_sjm() +{ + int loop; + + fprintf(stderr, "SJM = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_spps() +{ + int width; + int length; + + fprintf(stderr, "SPPS = "); + + width = fgetc(stdin); + width = (width << 8) + fgetc(stdin); + + length = fgetc(stdin); + length = (length << 8) + fgetc(stdin); + + fprintf(stderr, "SPPS (width = %d) (length = %d)\n", width, length); + +} + +static void scs2ascii_ppm() +{ + int loop; + + fprintf(stderr, "PPM = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + + +static void scs2ascii_svm() +{ + int loop; + + fprintf(stderr, "SVM = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_spsu() +{ + int loop; + + fprintf(stderr, "SPSU (%x) = ", curchar); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_sea() +{ + int loop; + + fprintf(stderr, "SEA (%x) = ", curchar); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_shm() +{ + int loop; + + fprintf(stderr, "SHM = "); + for (loop = 0; loop < curchar - 2; loop++) { + nextchar = fgetc(stdin); + fprintf(stderr, " %x", nextchar); + } + fprintf(stderr, "\n"); +} + +static void scs2ascii_process03() +{ + switch (nextchar) { + case 0x45:{ + scs2ascii_sic(); + break; + } + case 0x07:{ + scs2ascii_sil(); + break; + } + case 0x09:{ + scs2ascii_sls(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x2BD203 command %x\n", curchar); + } + } +} + +static void scs2ascii_sic() +{ + curchar = fgetc(stdin); + fprintf(stderr, "SIC = %x\n", curchar); +} + +static void scs2ascii_sil() +{ + curchar = fgetc(stdin); + fprintf(stderr, "SIL = %d", curchar); +} + +static void scs2ascii_sls() +{ + curchar = fgetc(stdin); + fprintf(stderr, "SLS = %d\n", curchar); +} + +static void scs2ascii_process04() +{ + switch (nextchar) { + case 0x15:{ + scs2ascii_ssld(); + break; + } + case 0x29:{ + scs2ascii_scs(); + break; + } + default:{ + fprintf(stderr, "ERROR: Unknown 0x2BD204 command %x\n", curchar); + } + } +} + +static void scs2ascii_ssld() +{ + curchar = fgetc(stdin); + nextchar = fgetc(stdin); + fprintf(stderr, "SSLD = %d %d \n", curchar, nextchar); +} + +static void scs2ascii_scs() +{ + curchar = fgetc(stdin); + if (curchar == 0x00) { + curchar = fgetc(stdin); + fprintf(stderr, "SCS = %d", curchar); + } else { + fprintf(stderr, "ERROR: Unknown 0x2BD20429 command %x\n", curchar); + } +} diff --git a/src/session.h b/src/session.h new file mode 100644 index 0000000..9430726 --- /dev/null +++ b/src/session.h @@ -0,0 +1,101 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef SESSION_H +#define SESSION_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define TN5250_SESSION_AID_F1 0x31 +#define TN5250_SESSION_AID_F2 0x32 +#define TN5250_SESSION_AID_F3 0x33 +#define TN5250_SESSION_AID_F4 0x34 +#define TN5250_SESSION_AID_F5 0x35 +#define TN5250_SESSION_AID_F6 0x36 +#define TN5250_SESSION_AID_F7 0x37 +#define TN5250_SESSION_AID_F8 0x38 +#define TN5250_SESSION_AID_F9 0x39 +#define TN5250_SESSION_AID_F10 0x3A +#define TN5250_SESSION_AID_F11 0x3B +#define TN5250_SESSION_AID_F12 0x3C +#define TN5250_SESSION_AID_F13 0xB1 +#define TN5250_SESSION_AID_F14 0xB2 +#define TN5250_SESSION_AID_F15 0xB3 +#define TN5250_SESSION_AID_F16 0xB4 +#define TN5250_SESSION_AID_F17 0xB5 +#define TN5250_SESSION_AID_F18 0xB6 +#define TN5250_SESSION_AID_F19 0xB7 +#define TN5250_SESSION_AID_F20 0xB8 +#define TN5250_SESSION_AID_F21 0xB9 +#define TN5250_SESSION_AID_F22 0xBA +#define TN5250_SESSION_AID_F23 0xBB +#define TN5250_SESSION_AID_F24 0xBC +#define TN5250_SESSION_AID_CLEAR 0xBD +#define TN5250_SESSION_AID_ENTER 0xF1 +#define TN5250_SESSION_AID_PGUP 0xF4 +#define TN5250_SESSION_AID_PGDN 0xF5 +#define TN5250_SESSION_AID_PRINT 0xF6 +#define TN5250_SESSION_AID_RECORD_BS 0xF8 + +#define TN5250_SESSION_CTL_IC_ULOCK 0x02 +#define TN5250_SESSION_CTL_CLR_BLINK 0x04 +#define TN5250_SESSION_CTL_SET_BLINK 0x08 +#define TN5250_SESSION_CTL_UNLOCK 0x10 +#define TN5250_SESSION_CTL_ALARM 0x20 +#define TN5250_SESSION_CTL_MESSAGE_OFF 0x40 +#define TN5250_SESSION_CTL_MESSAGE_ON 0x80 + +#define TN5250_SESSION_KB_SIZE 100 + +#define TN5250_SESSION_KEY_QUEUE_SIZE 100 + + struct _Tn5250Session { + Tn5250Terminal /*@owned@*/ /*@null@*/ *term; + Tn5250Stream /*@owned@*/ /*@null@*/ *stream; + Tn5250Display /*@owned@*/ *dsp; + Tn5250Display *saved_bufs[256]; + Tn5250Record /*@owned@*/ *record; + Tn5250Table /*@owned@*/ *table; + int pending_insert; + int read_opcode; /* Current read opcode. */ + int invited; + int inhibited; + + /* Queued keystroke ring buffer. */ + int key_queue_head, key_queue_tail; + int key_queue[TN5250_SESSION_KEY_QUEUE_SIZE]; + }; + + typedef struct _Tn5250Session Tn5250Session; + + extern Tn5250Session /*@only@*/ *tn5250_session_new(void); + extern void tn5250_session_destroy(Tn5250Session /*@only@*/ * This); + + extern void tn5250_session_set_terminal(Tn5250Session * This, Tn5250Terminal /*@only@*/ * newterminal); + extern void tn5250_session_set_stream(Tn5250Session * This, Tn5250Stream /*@only@*/ * newstream); +#define tn5250_session_terminal(This) ((This)->term) +#define tn5250_session_stream(This) ((This)->stream) + + extern void tn5250_session_main_loop(Tn5250Session * This); + +#ifdef __cplusplus +} + +#endif +#endif /* SESSION_H */ diff --git a/src/slangterm.c b/src/slangterm.c new file mode 100644 index 0000000..6fbadf9 --- /dev/null +++ b/src/slangterm.c @@ -0,0 +1,688 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" + +#if USE_SLANG +#define _TN5250_TERMINAL_PRIVATE_DEFINED + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SLANG_H +#include +#else +#ifdef HAVE_SLANG_SLANG_H +#include +#endif +#endif +#include "utility.h" +#include "display.h" +#include "buffer.h" +#include "record.h" +#include "stream.h" +#include "terminal.h" +#include "slangterm.h" + +/* Mapping of 5250 colors to curses colors */ +#define A_5250_WHITE 0x100 +#define A_5250_RED 0x200 +#define A_5250_TURQ 0x300 +#define A_5250_YELLOW 0x400 +#define A_5250_PINK 0x500 +#define A_5250_BLUE 0x600 +#define A_5250_BLACK 0x700 +#define A_5250_GREEN 0x800 + +#define A_COLOR_MASK 0xf00 + +#define A_REVERSE 0x1000 +#define A_UNDERLINE 0x2000 +#define A_BLINK 0x4000 +#define A_VERTICAL 0x8000 + +static int attribute_map[] = +{A_5250_GREEN, + A_5250_GREEN | A_REVERSE, + A_5250_WHITE, + A_5250_WHITE | A_REVERSE, + A_5250_GREEN | A_UNDERLINE, + A_5250_GREEN | A_UNDERLINE | A_REVERSE, + A_5250_WHITE | A_UNDERLINE, + 0x00, + A_5250_RED, + A_5250_RED | A_REVERSE, + A_5250_RED | A_BLINK, + A_5250_RED | A_BLINK | A_REVERSE, + A_5250_RED | A_UNDERLINE, + A_5250_RED | A_UNDERLINE | A_REVERSE, + A_5250_RED | A_UNDERLINE | A_BLINK, + 0x00, + A_5250_TURQ | A_VERTICAL, + A_5250_TURQ | A_VERTICAL | A_REVERSE, + A_5250_YELLOW | A_VERTICAL, + A_5250_YELLOW | A_VERTICAL | A_REVERSE, + A_5250_TURQ | A_UNDERLINE | A_VERTICAL, + A_5250_TURQ | A_UNDERLINE | A_REVERSE | A_VERTICAL, + A_5250_YELLOW | A_UNDERLINE | A_VERTICAL, + 0x00, + A_5250_PINK, + A_5250_PINK | A_REVERSE, + A_5250_BLUE, + A_5250_BLUE | A_REVERSE, + A_5250_PINK | A_UNDERLINE, + A_5250_PINK | A_UNDERLINE | A_REVERSE, + A_5250_BLUE | A_UNDERLINE, + 0x00}; + +static void slang_terminal_init(Tn5250Terminal * This); +static void slang_terminal_term(Tn5250Terminal * This); +static void slang_terminal_destroy(Tn5250Terminal /*@only@*/ * This); +static int slang_terminal_width(Tn5250Terminal * This); +static int slang_terminal_height(Tn5250Terminal * This); +static int slang_terminal_flags(Tn5250Terminal * This); +static void slang_terminal_update(Tn5250Terminal * This, + Tn5250Display * dsp); +static void slang_terminal_update_indicators(Tn5250Terminal * This, + Tn5250Display * dsp); +static int slang_terminal_waitevent(Tn5250Terminal * This); +static int slang_terminal_getkey(Tn5250Terminal * This); +static int slang_terminal_get_esc_key(Tn5250Terminal * This, int is_esc); +static void slang_terminal_set_attrs (Tn5250Terminal * This, int attrs); + +struct _Tn5250TerminalPrivate { + int quit_flag; + int last_width, last_height; + int attrs; +}; + +/* + * Create a new curses terminal object. + */ +Tn5250Terminal *tn5250_slang_terminal_new() +{ + Tn5250Terminal *r = tn5250_new(Tn5250Terminal, 1); + if (r != NULL) { + r->data = tn5250_new(struct _Tn5250TerminalPrivate, 1); + if (r->data == NULL) { + free(r); + return NULL; + } + r->data->quit_flag = 0; + r->data->last_width = 0; + r->data->last_height = 0; + r->data->attrs = 0; + + r->conn_fd = -1; + r->init = slang_terminal_init; + r->term = slang_terminal_term; + r->destroy = slang_terminal_destroy; + r->width = slang_terminal_width; + r->height = slang_terminal_height; + r->flags = slang_terminal_flags; + r->update = slang_terminal_update; + r->update_indicators = slang_terminal_update_indicators; + r->waitevent = slang_terminal_waitevent; + r->getkey = slang_terminal_getkey; + } + return r; +} + +static void slang_terminal_init(Tn5250Terminal * This) +{ + SLtt_get_terminfo (); + if (-1 == SLkp_init ()) { + SLang_doerror ("SLkp_init failed."); + exit (255); + } + if (-1 == SLang_init_tty (K_CTRL('Q'), 1, 0)) { + SLang_doerror ("SLang_init_tty failed."); + exit (255); + } + SLang_set_abort_signal (NULL); + if (-1 == SLsmg_init_smg ()) { + SLang_doerror ("SLsmg_init_smg failed."); + exit (255); + } + + SLtt_set_color_fgbg (1, SLSMG_COLOR_BRIGHT_WHITE, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (2, SLSMG_COLOR_RED, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (3, SLSMG_COLOR_BLUE, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (4, SLSMG_COLOR_BRIGHT_BROWN, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (5, SLSMG_COLOR_BRIGHT_MAGENTA, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (6, SLSMG_COLOR_BRIGHT_BLUE, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (7, SLSMG_COLOR_BLACK, SLSMG_COLOR_BLACK); + SLtt_set_color_fgbg (8, SLSMG_COLOR_GREEN, SLSMG_COLOR_BLACK); + + SLsmg_cls (); + SLsmg_refresh (); + This->data->quit_flag = 0; +} + +static void slang_terminal_term(Tn5250Terminal * This) +{ + SLsmg_reset_smg (); + SLang_reset_tty (); +} + +static void slang_terminal_destroy(Tn5250Terminal * This) +{ + if (This->data != NULL) + free(This->data); + free(This); +} + +static int slang_terminal_width(Tn5250Terminal /*@unused@*/ * This) +{ + SLtt_get_screen_size(); + return SLtt_Screen_Cols; +} + +static int slang_terminal_height(Tn5250Terminal /*@unused@*/ * This) +{ + SLtt_get_screen_size(); + return SLtt_Screen_Rows; +} + +static int slang_terminal_flags(Tn5250Terminal /*@unused@*/ * This) +{ + int f = 0; + if (SLtt_Use_Ansi_Colors) + f |= TN5250_TERMINAL_HAS_COLOR; + return f; +} + +static void slang_terminal_update(Tn5250Terminal * This, Tn5250Display * dsp) +{ + int my, mx; + int y, x; + int curs_attr, temp_attr; + unsigned char a = 0x20, c; + + if (This->data->last_width != tn5250_display_width(dsp) + || This->data->last_height != tn5250_display_height(dsp)) { + SLsmg_cls (); + This->data->last_width = tn5250_display_width(dsp); + This->data->last_height = tn5250_display_height(dsp); + slang_terminal_update_indicators(This, dsp); + } + SLsmg_normal_video (); + my = SLtt_Screen_Rows - 1; + mx = SLtt_Screen_Cols - 1; + for (y = 0; y < tn5250_display_height(dsp); y++) { + if (y > my) + break; + + SLsmg_gotorc (y, 0); + for (x = 0; x < tn5250_display_width(dsp); x++) { + c = tn5250_display_char_at(dsp, y, x); + if ((c & 0xe0) == 0x20) { /* ATTRIBUTE */ + a = (c & 0xff); + temp_attr = This->data->attrs; + slang_terminal_set_attrs (This, attribute_map[0]); + SLsmg_write_char (' '); + slang_terminal_set_attrs (This, temp_attr); + } else { /* DATA */ + curs_attr = attribute_map[a - 0x20]; + if (curs_attr == 0x00) { /* NONDISPLAY */ + temp_attr = This->data->attrs; + slang_terminal_set_attrs (This, attribute_map[0]); + SLsmg_write_char (' '); + slang_terminal_set_attrs (This, temp_attr); + } else { + c = tn5250_ebcdic2ascii(c); + if ((c < 0x20 && c > 0x00) || c >= 0x7f) { /* UNPRINTABLE */ + c = ' '; + curs_attr ^= A_REVERSE; + } + if ((curs_attr & A_VERTICAL) != 0) { + curs_attr |= A_UNDERLINE; + curs_attr &= ~A_VERTICAL; + } + /* This is a kludge since vga hardware doesn't support under- + * lining characters. It's pretty ugly. */ + if ((curs_attr & A_UNDERLINE) != 0) { + curs_attr &= ~A_UNDERLINE; + if (c == ' ') + c = '_'; + } + slang_terminal_set_attrs (This, curs_attr); + SLsmg_write_char (c); + } + } /* if ((c & 0xe0) ... */ + } /* for (int x ... */ + } /* for (int y ... */ + + SLsmg_gotorc (tn5250_display_cursor_y(dsp), tn5250_display_cursor_x(dsp)); + SLsmg_refresh(); +} + +static void slang_terminal_update_indicators(Tn5250Terminal * This, Tn5250Display * dsp) +{ + int inds = tn5250_display_indicators(dsp); + char ind_buf[80]; + + memset(ind_buf, ' ', sizeof(ind_buf)); + memcpy(ind_buf, "5250", 4); + if ((inds & TN5250_DISPLAY_IND_MESSAGE_WAITING) != 0) { + memcpy(ind_buf + 23, "MW", 2); + } + if ((inds & TN5250_DISPLAY_IND_INHIBIT) != 0) { + memcpy(ind_buf + 9, "X II", 4); + } else if ((inds & TN5250_DISPLAY_IND_X_CLOCK) != 0) { + memcpy(ind_buf + 9, "X CLOCK", 7); + } else if ((inds & TN5250_DISPLAY_IND_X_SYSTEM) != 0) { + memcpy(ind_buf + 9, "X SYSTEM", 8); + } + if ((inds & TN5250_DISPLAY_IND_INSERT) != 0) { + memcpy(ind_buf + 30, "IM", 2); + } + SLsmg_normal_video (); + SLsmg_gotorc (tn5250_display_height (dsp), 0); + SLsmg_write_nchars (ind_buf, 80); + SLsmg_gotorc (tn5250_display_cursor_y(dsp), tn5250_display_cursor_x(dsp)); + SLsmg_refresh(); +} + +static int slang_terminal_waitevent(Tn5250Terminal * This) +{ + fd_set fdr; + int result = 0; + int sm; + + if (SLang_Error == USER_BREAK) + This->data->quit_flag = 1; + if (This->data->quit_flag) + return TN5250_TERMINAL_EVENT_QUIT; + + FD_ZERO(&fdr); + FD_SET(0, &fdr); + sm = 1; + if (This->conn_fd >= 0) { + FD_SET(This->conn_fd, &fdr); + sm = This->conn_fd + 1; + } + + select(sm, &fdr, NULL, NULL, NULL); + + if (FD_ISSET(0, &fdr)) + result |= TN5250_TERMINAL_EVENT_KEY; + + if (This->conn_fd >= 0 && FD_ISSET(This->conn_fd, &fdr)) + result |= TN5250_TERMINAL_EVENT_DATA; + + return result; +} + +static int slang_terminal_getkey(Tn5250Terminal * This) +{ + unsigned int key; + + if (!SLang_input_pending (0)) + return -1; + + key = SLkp_getkey (); + while (1) { + switch (key) { + case 0x0d: + case 0x0a: + return K_ENTER; + + case 0x1b: + if ((key = slang_terminal_get_esc_key(This, 1)) != SL_KEY_ERR) + return key; + break; + + case K_CTRL('A'): + return K_ATTENTION; + case K_CTRL('B'): + return K_ROLLDN; + case K_CTRL('C'): + return K_SYSREQ; + case K_CTRL('D'): + return K_ROLLUP; + case K_CTRL('E'): + return K_ERASE; + case K_CTRL('F'): + return K_ROLLUP; + case K_CTRL('K'): + return K_FIELDEXIT; + case K_CTRL('L'): + return K_REFRESH; + case K_CTRL('O'): + return K_HOME; + case K_CTRL('P'): + return K_PRINT; + case K_CTRL('R'): + return K_RESET; /* Error Reset */ + case K_CTRL('T'): + return K_TESTREQ; + case K_CTRL('U'): + return K_ROLLDN; + case K_CTRL('X'): + return K_FIELDEXIT; + + case K_CTRL('Q'): + This->data->quit_flag = 1; + return -1; + + case K_CTRL('G'): /* C-g */ + if ((key = slang_terminal_get_esc_key(This, 0)) != SL_KEY_ERR) + return key; + break; + + case SL_KEY_ERR: + if (SLang_Error == USER_BREAK) + This->data->quit_flag = 1; + return -1; + + case 127: + return K_DELETE; + + case SL_KEY_F(1): + return K_F1; + case SL_KEY_F(2): + return K_F2; + case SL_KEY_F(3): + return K_F3; + case SL_KEY_F(4): + return K_F4; + case SL_KEY_F(5): + return K_F5; + case SL_KEY_F(6): + return K_F6; + case SL_KEY_F(7): + return K_F7; + case SL_KEY_F(8): + return K_F8; + case SL_KEY_F(9): + return K_F9; + case SL_KEY_F(10): + return K_F10; + case SL_KEY_F(11): + return K_F11; + case SL_KEY_F(12): + return K_F12; + case SL_KEY_F(13): + return K_F13; + case SL_KEY_F(14): + return K_F14; + case SL_KEY_F(15): + return K_F15; + case SL_KEY_F(16): + return K_F16; + case SL_KEY_F(17): + return K_F17; + case SL_KEY_F(18): + return K_F18; + case SL_KEY_F(19): + return K_F19; + case SL_KEY_F(20): + return K_F20; + case SL_KEY_F(21): + return K_F21; + case SL_KEY_F(22): + return K_F22; + case SL_KEY_F(23): + return K_F23; + case SL_KEY_F(24): + return K_F24; + case SL_KEY_BACKSPACE: + return K_BACKSPACE; + case SL_KEY_IC: + return K_INSERT; + + case SL_KEY_HOME: + case SL_KEY_A1: + return K_HOME; + + case SL_KEY_PPAGE: + case SL_KEY_A3: + return K_ROLLDN; + + case SL_KEY_END: + case SL_KEY_C1: + return K_END; + + case SL_KEY_NPAGE: + case SL_KEY_C3: + return K_ROLLUP; + + case SL_KEY_ENTER: + return K_FIELDEXIT; + + case SL_KEY_UP: + return K_UP; + + case SL_KEY_DOWN: + return K_DOWN; + + case SL_KEY_LEFT: + return K_LEFT; + + case SL_KEY_RIGHT: + return K_RIGHT; + + default: + return key; + } + } +} + +/* + * If a vt100 escape key sequence was introduced (using either + * or ), handle the next key in the sequence. + */ +static int slang_terminal_get_esc_key(Tn5250Terminal * This, + int is_esc) +{ + int y, x, key, display_key; + fd_set fdr; + + y = SLsmg_get_row (); + x = SLsmg_get_column (); + SLsmg_normal_video (); + /* FIXME: This might need to be row 28 */ + SLsmg_gotorc (24, 60); + if (is_esc) + SLsmg_write_string ("Esc "); + else + SLsmg_write_string ("C-g "); + SLsmg_gotorc (y, x); + SLsmg_refresh(); + + FD_ZERO(&fdr); + FD_SET(0, &fdr); + select(1, &fdr, NULL, NULL, NULL); + key = SLkp_getkey (); + + if (isalpha(key)) + key = toupper(key); + + display_key = key; + switch (key) { + + /* Function keys */ + case '1': + key = K_F1; + break; + case '2': + key = K_F2; + break; + case '3': + key = K_F3; + break; + case '4': + key = K_F4; + break; + case '5': + key = K_F5; + break; + case '6': + key = K_F6; + break; + case '7': + key = K_F7; + break; + case '8': + key = K_F8; + break; + case '9': + key = K_F9; + break; + case '0': + key = K_F10; + break; + case '-': + key = K_F11; + break; + case '=': + key = K_F12; + break; + case '!': + key = K_F13; + break; + case '@': + key = K_F14; + break; + case '#': + key = K_F15; + break; + case '$': + key = K_F16; + break; + case '%': + key = K_F17; + break; + case '^': + key = K_F18; + break; + case '&': + key = K_F19; + break; + case '*': + key = K_F20; + break; + case '(': + key = K_F21; + break; + case ')': + key = K_F22; + break; + case '_': + key = K_F23; + break; + case '+': + key = K_F24; + break; + + /* AS/400 strangeness */ + case 'A': + key = K_ATTENTION; + break; + case 'C': + key = K_CLEAR; + break; + case 'D': + key = K_DUPLICATE; + break; + case 'H': + key = K_HELP; + break; + case 'I': + key = K_INSERT; + break; + case 'L': + key = K_REFRESH; + break; + case 'M': + key = K_FIELDMINUS; + break; + case 'P': + key = K_PRINT; + break; + case 'R': + key = K_RESET; + break; + case 'S': + key = K_SYSREQ; + break; + case 'T': + key = K_TOGGLE; + break; + case 'X': + key = K_FIELDEXIT; + break; + + case 127: + key = K_INSERT; + break; /* ESC DEL */ + case SL_KEY_DELETE: + key = K_INSERT; + break; /* ESC DEL, also */ + case K_CTRL('J'): + key = K_NEWLINE; + break; + + case 'Q': + This->data->quit_flag = 1; + key = SL_KEY_ERR; + break; + + default: + SLtt_beep(); + key = SL_KEY_ERR; + break; + } + + /* FIXME: This might need to be row 27 */ + SLsmg_gotorc (24, 64); + if (key == SL_KEY_ERR) + SLsmg_write_string ("???"); + else + SLsmg_write_char (display_key); + SLsmg_gotorc (y, x); + SLsmg_refresh (); + return key; +} + +static void slang_terminal_set_attrs (Tn5250Terminal * This, int attrs) +{ + if (attrs == This->data->attrs) + return; + SLsmg_normal_video (); + SLsmg_set_color ((attrs & A_COLOR_MASK) >> 8); + if ((attrs & A_REVERSE) != 0) + SLsmg_reverse_video (); + /* FIXME: Handle A_BLINK */ + This->data->attrs = attrs; +} + +#else /* USE_SLANG */ + +/* When compiled with -Wall -pedantic: ANSI C forbids empty source file. */ +struct NoSlang { + long dummy; +}; + +#endif /* USE_SLANG */ + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/slangterm.h b/src/slangterm.h new file mode 100644 index 0000000..5932972 --- /dev/null +++ b/src/slangterm.h @@ -0,0 +1,32 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef SLANGTERM_H +#define SLANGTERM_H + +#ifdef __cplusplus +extern "C" { +#endif + + extern Tn5250Terminal /*@only@*/ *tn5250_slang_terminal_new(void); + extern int tn5250_slang_terminal_use_underscores(Tn5250Terminal *, int f); + +#ifdef __cplusplus +} + +#endif +#endif /* SLANGTERM_H */ diff --git a/src/stream.h b/src/stream.h new file mode 100644 index 0000000..a36cc28 --- /dev/null +++ b/src/stream.h @@ -0,0 +1,93 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef STREAM5250_H +#define STREAM5250_H + +#ifdef __cplusplus +extern "C" { +#endif + + struct _Tn5250Stream { + + int (* connect) (struct _Tn5250Stream *This, const char *to); + void (* disconnect) (struct _Tn5250Stream *This); + int (* handle_receive) (struct _Tn5250Stream *This); + void (* send_packet) (struct _Tn5250Stream *This, int length, int flowtype, unsigned char flags, + unsigned char opcode, unsigned char *data); + void (/*@null@*/ * destroy) (struct _Tn5250Stream /*@only@*/ *This); + + Tn5250Record /*@null@*/ *records; + Tn5250Record /*@dependent@*/ /*@null@*/ *current_record; + int record_count; + struct _Tn5250StreamVar /*@null@*/ *environ; + + Tn5250Buffer sb_buf; + + SOCKET_TYPE sockfd; + int status; + char /*@null@*/ *termtype; + char /*@null@*/ *devicename; + int state; + +#ifndef NDEBUG + FILE *debugfile; +#endif + }; + + struct _Tn5250StreamVar { + struct _Tn5250StreamVar *next; + struct _Tn5250StreamVar *prev; + char *name; + char *value; + }; + + typedef struct _Tn5250Stream Tn5250Stream; + typedef struct _Tn5250StreamVar Tn5250StreamVar; + + extern Tn5250Stream /*@only@*/ /*@null@*/ *tn5250_stream_open (const char *to); + extern void tn5250_stream_destroy(Tn5250Stream /*@only@*/ * This); + extern Tn5250Record /*@only@*/ *tn5250_stream_get_record(Tn5250Stream * This); + extern void tn5250_stream_print_complete(Tn5250Stream * This); + extern void tn5250_stream_query_reply(Tn5250Stream * This); + +#define tn5250_stream_connect(This,to) \ + (* (This->connect)) ((This),(to)) +#define tn5250_stream_disconnect(This) \ + (* (This->disconnect)) ((This)) +#define tn5250_stream_handle_receive(This) \ + (* (This->handle_receive)) ((This)) +#define tn5250_stream_send_packet(This,len,flow,flags,opcode,data) \ + (* (This->send_packet)) ((This),(len),(flow),(flags),(opcode),(data)) + +/* This should be a more flexible replacement for different NEW_ENVIRON + * strings. */ + extern void tn5250_stream_setenv(Tn5250Stream * This, const char *name, + const char /*@null@*/ *value); + extern void tn5250_stream_unsetenv(Tn5250Stream * This, const char *name); + extern /*@observer@*/ /*@null@*/ char *tn5250_stream_getenv(Tn5250Stream * This, const char *name); + +#define tn5250_stream_record_count(This) ((This)->record_count) +#define tn5250_stream_socket_handle(This) ((This)->sockfd) + +#ifdef __cplusplus +} + +#endif +#endif + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/terminal.h b/src/terminal.h new file mode 100644 index 0000000..758a2fb --- /dev/null +++ b/src/terminal.h @@ -0,0 +1,140 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef TERMINAL_H +#define TERMINAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Flags */ +#define TN5250_TERMINAL_HAS_COLOR 0x0001 + +/* Events */ +#define TN5250_TERMINAL_EVENT_KEY 0x0001 +#define TN5250_TERMINAL_EVENT_DATA 0x0002 +#define TN5250_TERMINAL_EVENT_QUIT 0x0004 + +/* Key definitions + * These are directly copied from , although the only real + * requirement is that they be unique. CursesTerminal is currently + * broken and relies on them being the same, though. */ + +#define K_CTRL(k) ((k)-0x40) +/* e.g. K_CTRL('X') is curses/ascii key value for Ctrl+X */ + +#define K_FIRST_SPECIAL 0400 /* Coincides with first Curses key. */ + +#define K_ENTER 0x0d +#define K_NEWLINE 0x0a +#define K_TAB 0x09 +#define K_BACKTAB 0541 +#define K_F1 0410+1 +#define K_F2 0410+2 +#define K_F3 0410+3 +#define K_F4 0410+4 +#define K_F5 0410+5 +#define K_F6 0410+6 +#define K_F7 0410+7 +#define K_F8 0410+8 +#define K_F9 0410+9 +#define K_F10 0410+10 +#define K_F11 0410+11 +#define K_F12 0410+12 +#define K_F13 0410+13 +#define K_F14 0410+14 +#define K_F15 0410+15 +#define K_F16 0410+16 +#define K_F17 0410+17 +#define K_F18 0410+18 +#define K_F19 0410+19 +#define K_F20 0410+20 +#define K_F21 0410+21 +#define K_F22 0410+22 +#define K_F23 0410+23 +#define K_F24 0410+24 +#define K_LEFT 0404 +#define K_RIGHT 0405 +#define K_UP 0403 +#define K_DOWN 0402 +#define K_ROLLDN 0523 +#define K_ROLLUP 0522 +#define K_BACKSPACE 0407 +#define K_HOME 0406 +#define K_END 0550 +#define K_INSERT 0513 +#define K_DELETE 0512 +#define K_RESET 0531 +#define K_PRINT 0532 +#define K_HELP 0553 +#define K_SYSREQ 0401 /* curses KEY_BREAK */ +#define K_CLEAR 0515 /* curses KEY_CLEAR */ +#define K_REFRESH 0564 /* curses KEY_REFRESH */ +#define K_FIELDEXIT 0517 /* curses KEY_EOL (clear to EOL) */ +#define K_TESTREQ 0516 /* curses KEY_EOS (as good as any) */ +#define K_TOGGLE 0533 /* curses KEY_LL (as good as any) */ +#define K_ERASE 0514 /* curses KEY_EIC (as good as any) */ +#define K_ATTENTION 0511 /* curses KEY_IL (as good as any) */ +#define K_DUPLICATE 0524 /* curses KEY_STAB (set tab - good as any) */ +#define K_FIELDMINUS 0526 /* curses KEY_CATAB (clear all tabs - g.a.a.) */ +#define K_UNKNOW 0xffff + + struct _Tn5250Terminal { + SOCKET_TYPE conn_fd; + struct _Tn5250TerminalPrivate *data; + + void (*init) (struct _Tn5250Terminal * This); + void (*term) (struct _Tn5250Terminal * This); + void (*destroy) (struct _Tn5250Terminal /*@only@*/ * This); + int (*width) (struct _Tn5250Terminal * This); + int (*height) (struct _Tn5250Terminal * This); + int (*flags) (struct _Tn5250Terminal * This); + void (*update) (struct _Tn5250Terminal * This, Tn5250Display * dsp); + void (*update_indicators) (struct _Tn5250Terminal * This, Tn5250Display * dsp); + int (*waitevent) (struct _Tn5250Terminal * This); + int (*getkey) (struct _Tn5250Terminal * This); + }; + +#ifndef _TN5250_TERMINAL_PRIVATE_DEFINED +#define _TN5250_TERMINAL_PRIVATE_DEFINED + struct _Tn5250TerminalPrivate { + long dummy; + }; +#endif + + typedef struct _Tn5250Terminal Tn5250Terminal; + +/* Useful macros call ``methods'' on the terminal type. */ +#define tn5250_terminal_init(This) (* ((This)->init)) ((This)) +#define tn5250_terminal_term(This) (* ((This)->term)) ((This)) +#define tn5250_terminal_destroy(This) (* ((This)->destroy)) ((This)) +#define tn5250_terminal_width(This) (* ((This)->width)) ((This)) +#define tn5250_terminal_height(This) (* ((This)->height)) ((This)) +#define tn5250_terminal_flags(This) (* ((This)->flags)) ((This)) +#define tn5250_terminal_update(This,b) (* ((This)->update)) ((This),(b)) +#define tn5250_terminal_update_indicators(This,b) \ + (* ((This)->update_indicators)) ((This),(b)) +#define tn5250_terminal_waitevent(This) \ + (* ((This)->waitevent)) ((This)) +#define tn5250_terminal_getkey(This) (* ((This)->getkey)) ((This)) + +#ifdef __cplusplus +} + +#endif +#endif /* TERMINAL_H */ diff --git a/src/tn5250.c b/src/tn5250.c new file mode 100644 index 0000000..acfeab5 --- /dev/null +++ b/src/tn5250.c @@ -0,0 +1,316 @@ +/* + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" +#include +#include +#include +#ifdef HAVE_GETOPT_H +#include +#endif +#include + +#ifdef HAVE_LOCALE_H +#include +#endif + +#include "buffer.h" +#include "record.h" +#include "stream.h" +#include "utility.h" +#include "display.h" +#include "field.h" +#include "formattable.h" +#include "codes5250.h" +#include "terminal.h" +#include "session.h" +#include "printsession.h" +#if USE_CURSES +#include "cursesterm.h" +#endif +#if USE_SLANG +#include "slangterm.h" +#endif +#include "debug.h" + +extern char *version_string; + +char *remotehost; +char *transmapname = "37"; +char *sessionname = NULL; +#if USE_CURSES +int underscores = 0; +#endif +int printsession = 0; +char *transformname = NULL; +char *outputcommand = NULL; +char *termtype = NULL; + +Tn5250PrintSession *printsess = NULL; +Tn5250Session *sess = NULL; +Tn5250Stream *stream = NULL; +Tn5250Terminal *term = NULL; + +/* FIXME: This should be moved into session.[ch] or something. */ +static struct valid_term { + char *name; + char *descr; +} valid_terms[] = { + /* DBCS Terminals not yet supported. + * { "IBM-5555-C01", "DBCS color" }, + * { "IBM-5555-B01", "DBCS monocrome" }, */ + { "IBM-3477-FC", "27x132 color" }, + { "IBM-3477-FG", "27x132 monochrome" }, + { "IBM-3180-2", "27x132 monochrome" }, + { "IBM-3179-2", "24x80 color" }, + { "IBM-3196-A1", "24x80 monochrome" }, + { "IBM-5292-2", "24x80 color" }, + { "IBM-5291-1", "24x80 monochrome" }, + { "IBM-5251-11", "24x80 monochrome" }, + { NULL, NULL } +}; + +static void syntax(void); +static int parse_options(int argc, char *argv[]); + +int main(int argc, char *argv[]) +{ +#ifdef HAVE_SETLOCALE + setlocale (LC_ALL, ""); +#endif + + if (parse_options(argc, argv) < 0) + syntax(); + tn5250_settransmap(transmapname); + + stream = tn5250_stream_open (remotehost); + if (stream == NULL) + goto bomb_out; + + if (printsession) { + printsess = tn5250_print_session_new(); + tn5250_stream_setenv(stream, "TERM", "IBM-3812-1"); + } else { +#ifdef USE_CURSES + term = tn5250_curses_terminal_new(); +#endif +#ifdef USE_SLANG + term = tn5250_slang_terminal_new(); +#endif + if (term == NULL) + goto bomb_out; +#ifdef USE_CURSES + tn5250_curses_terminal_use_underscores(term, underscores); +#endif +#ifndef NDEBUG + /* Shrink-wrap the terminal with the debug terminal, if appropriate. */ + if (strlen (remotehost) >= 6 + && !memcmp (remotehost, "debug:", 6)) { + Tn5250Terminal *dbgterm = tn5250_debug_terminal_new (term, stream); + if (dbgterm == NULL) { + tn5250_terminal_destroy (term); + goto bomb_out; + } + term = dbgterm; + } +#endif + tn5250_terminal_init(term); + sess = tn5250_session_new(); + tn5250_session_set_terminal(sess, term); + + /* Set emulation type to the user-supplied terminal/emulation type, + * if it exists; otherwise, make a guess based on the size of the + * physical tty and whether the terminal supports color. */ + if (termtype == NULL) { + if (tn5250_terminal_width(term) >= 132 && tn5250_terminal_height(term) >= 27) { + if ((tn5250_terminal_flags(term) & TN5250_TERMINAL_HAS_COLOR) != 0) + tn5250_stream_setenv(stream, "TERM", "IBM-3477-FC"); + else + tn5250_stream_setenv(stream, "TERM", "IBM-3477-FG"); + } else { + if ((tn5250_terminal_flags(term) & TN5250_TERMINAL_HAS_COLOR) != 0) + tn5250_stream_setenv(stream, "TERM", "IBM-3179-2"); + else + tn5250_stream_setenv(stream, "TERM", "IBM-5251-11"); + } + } else + tn5250_stream_setenv(stream, "TERM", termtype); + } + + tn5250_stream_setenv(stream, "DEVNAME", sessionname); + tn5250_stream_setenv(stream, "IBMFONT", "12"); + if (transformname != NULL) { + tn5250_stream_setenv(stream, "IBMTRANSFORM", "0"); + tn5250_stream_setenv(stream, "IBMMFRTYPMDL", transformname); + } else + tn5250_stream_setenv(stream, "IBMTRANSFORM", "1"); + + if (printsession) { + tn5250_print_session_set_fd(printsess, tn5250_stream_socket_handle(stream)); + tn5250_print_session_set_stream(printsess, stream); + printf("-%s-\n", outputcommand); + tn5250_print_session_set_output_command(printsess, outputcommand); + tn5250_print_session_main_loop(printsess); + } else { + term->conn_fd = tn5250_stream_socket_handle(stream); + tn5250_session_set_stream(sess, stream); + tn5250_session_main_loop(sess); + } + + errno = 0; + +bomb_out: + if (!printsession) { + if (term != NULL) + tn5250_terminal_term(term); + if (sess != NULL) + tn5250_session_destroy(sess); + else if (stream != NULL) + tn5250_stream_destroy (stream); + } else { + if (printsess != NULL) + tn5250_print_session_destroy(printsess); + if (stream != NULL) + tn5250_stream_destroy (stream); + } + if (errno != 0) + printf("Could not start session: %s\n", strerror(errno)); +#ifndef NDEBUG + tn5250_log_close(); +#endif + exit(0); +} + +static int parse_options(int argc, char *argv[]) +{ + int arg; + while ((arg = getopt(argc, argv, "m:s:t:T:P:uVpy:")) != EOF) { + switch (arg) { + case 'm': + transmapname = optarg; + break; + + case 'P': + outputcommand = optarg; + break; + + case 's': + sessionname = optarg; + break; + +#if USE_CURSES + case 'u': + underscores = 1; + break; +#endif + +#ifndef NDEBUG + case 't': + { + FILE *p; + int n; + + tn5250_log_open(optarg); + /* Log some useful information to the tracefile. */ + tn5250_log_printf("tn5250 version %s, built on %s\n", version_string, + __DATE__); + + /* Get uname -a */ + if ((p = popen ("uname -a", "r")) != NULL) { + char buf[256]; + while ((n = fread (buf, 1, sizeof (buf)-2, p)) > 0) { + fwrite (buf, 1, n, tn5250_logfile); + } + pclose (p); + } + + /* Get TERM. */ + tn5250_log_printf("TERM=%s\n\n", getenv("TERM") ? getenv("TERM") : "(not set)"); + + for (n = 0; n < argc; n ++) + tn5250_log_printf("argv[%d] = %s\n", n, argv[n]); + + tn5250_log_printf("\n"); + } + break; +#endif + + case 'T': + transformname = optarg; + break; + + case 'V': + printf("tn5250 version %s\n\n", version_string); + exit(0); + break; + + case 'p': + printsession = 1; + break; + + case 'y': + { + struct valid_term *p = valid_terms; + while (p->name != NULL && strcmp (p->name, optarg)) + p++; + if (p->name == NULL) + syntax (); + termtype = optarg; + } + break; + + case '?': + case ':': + return -1; + } + } + + if (optind >= argc) + return -1; + remotehost = argv[optind++]; + if (optind != argc) + return -1; + return 0; +} + +static void syntax() +{ + struct valid_term *p; + printf("Usage: tn5250 [options] host[:port]\n" + "Options:\n" + "\t-m map specify translation map\n" + "\t-s name specify session name\n" +#ifndef NDEBUG + "\t-t file specify trace file\n" +#endif +#if USE_CURSES + "\t-u use underscores instead of underline attribute\n" +#endif + "\t-V display version\n" + "\t-y type specify IBM terminal type to emulate.\n"); + + p = valid_terms; + while (p->name) { + printf ("\t\t%s\t%s\n", p->name, p->descr); + p++; + } + printf ("\n"); + exit (255); +} + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/transmaps b/src/transmaps new file mode 100755 index 0000000..2f97e12 --- /dev/null +++ b/src/transmaps @@ -0,0 +1,78 @@ +#!/usr/bin/perl -w + +use strict; + +open MAPS, "> transmaps.h" + or die "transmaps: couldn't write to transmaps.h: $!\n"; + +print MAPS <<__EOT__; +/* transmaps.h was automagically generated by transmaps and GNU recode. + Any changes should be made in transmaps or utility.cc and NOT in this file! + */ + +__EOT__ + +open RECODE, "recode -l|" + or die "transmaps: open recode -l failed: $!\n"; + +my @sets; + +while () { + if (/^EBCDIC.*$/) { + push @sets, [$1, $2 ? $2 : "en"]; + } elsif (/^IBM\d+.*? (ebcdic.*) (ibm0*(\d+))/) { + my @s = ($2, $3); + my @alias = ($1 =~ m/\bebcdic(\w+)\b/g); + push @sets, [@s, @alias]; + } +} + +close RECODE + or die + $! ? "transmaps: close recode -l failed: $!\n" + : "transmaps: recode -l returned $?\n"; + +sub recode { + my $trans = shift; + + open RECODE, "recode -h $trans|" + or die "transmaps: open recode -h $trans failed: $!\n"; + + while () { + print MAPS; + } + + close RECODE + or die + $! ? "transmaps: close recode -h $trans failed: $!\n" + : "transmaps: recode -h $trans returned $?\n"; + + print MAPS "\n"; +} + +my $s; + +foreach $s (@sets) { + my $name = $s->[0]; + + recode("latin1:$name"); + recode("$name:latin1"); +} + +print MAPS <<__EOT__; +/* This is the translation-map index which is scanned in utility.c + */ + +Tn5250TransMap transmaps [] = { +__EOT__ + +foreach $s (@sets) { + my @s = @$s; + my $name = shift @s; + + foreach (@s) { + print MAPS " {\"$_\", ${name}_to_latin1, latin1_to_${name}},\n"; + } +} + +print MAPS " {NULL, NULL, NULL}};\n"; diff --git a/src/transmaps.h b/src/transmaps.h new file mode 100644 index 0000000..a83ee2a --- /dev/null +++ b/src/transmaps.h @@ -0,0 +1,3353 @@ +/* transmaps.h was automagically generated by transmaps and GNU recode. + Any changes should be made in transmaps or utility.cc and NOT in this file! + */ + +/* Conversion table from `latin1' charset to `ebcdic' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdic[256] = +{ + 0, 1, 2, 3, 55, 45, 46, 47, /* 0 - 7 */ + 22, 5, 37, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 60, 61, 50, 38, /* 16 - 23 */ + 24, 25, 63, 39, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 106, 208, 161, 7, /* 120 - 127 */ + 32, 33, 34, 35, 36, 21, 6, 23, /* 128 - 135 */ + 40, 41, 42, 43, 44, 9, 10, 27, /* 136 - 143 */ + 48, 49, 26, 51, 52, 53, 54, 8, /* 144 - 151 */ + 56, 57, 58, 59, 4, 20, 62, 225, /* 152 - 159 */ + 65, 66, 67, 68, 69, 70, 71, 72, /* 160 - 167 */ + 73, 81, 82, 83, 84, 85, 86, 87, /* 168 - 175 */ + 88, 89, 98, 99, 100, 101, 102, 103, /* 176 - 183 */ + 104, 105, 112, 113, 114, 115, 116, 117, /* 184 - 191 */ + 118, 119, 120, 128, 138, 139, 140, 141, /* 192 - 199 */ + 142, 143, 144, 154, 155, 156, 157, 158, /* 200 - 207 */ + 159, 160, 170, 171, 172, 173, 174, 175, /* 208 - 215 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 216 - 223 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 224 - 231 */ + 202, 203, 204, 205, 206, 207, 218, 219, /* 232 - 239 */ + 220, 221, 222, 223, 234, 235, 236, 237, /* 240 - 247 */ + 238, 239, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdic' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdic_to_latin1[256] = +{ + 0, 1, 2, 3, 156, 9, 134, 127, /* 0 - 7 */ + 151, 141, 142, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 157, 133, 8, 135, /* 16 - 23 */ + 24, 25, 146, 143, 28, 29, 30, 31, /* 24 - 31 */ + 128, 129, 130, 131, 132, 10, 23, 27, /* 32 - 39 */ + 136, 137, 138, 139, 140, 5, 6, 7, /* 40 - 47 */ + 144, 145, 22, 147, 148, 149, 150, 4, /* 48 - 55 */ + 152, 153, 154, 155, 20, 21, 158, 26, /* 56 - 63 */ + 32, 160, 161, 162, 163, 164, 165, 166, /* 64 - 71 */ + 167, 168, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 169, 170, 171, 172, 173, 174, 175, /* 80 - 87 */ + 176, 177, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 178, 179, 180, 181, 182, 183, /* 96 - 103 */ + 184, 185, 124, 44, 37, 95, 62, 63, /* 104 - 111 */ + 186, 187, 188, 189, 190, 191, 192, 193, /* 112 - 119 */ + 194, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 195, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 196, 197, 198, 199, 200, 201, /* 136 - 143 */ + 202, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 203, 204, 205, 206, 207, 208, /* 152 - 159 */ + 209, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 210, 211, 212, 213, 214, 215, /* 168 - 175 */ + 216, 217, 218, 219, 220, 221, 222, 223, /* 176 - 183 */ + 224, 225, 226, 227, 228, 229, 230, 231, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 232, 233, 234, 235, 236, 237, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 238, 239, 240, 241, 242, 243, /* 216 - 223 */ + 92, 159, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 244, 245, 246, 247, 248, 249, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicatde' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicatde[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 42, 41, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 35, 120, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 54, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 223, 115, 116, 117, 118, 119, 124, /* 160 - 167 */ + 45, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 85, 65, 66, 67, 74, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 252, 68, 46, 60, 40, 43, 224, 38, /* 208 - 215 */ + 81, 82, 218, 219, 90, 221, 222, 161, /* 216 - 223 */ + 33, 225, 83, 84, 192, 86, 87, 88, /* 224 - 231 */ + 89, 220, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 106, 55, /* 240 - 247 */ + 56, 57, 250, 251, 208, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicatde' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicatde_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 224, 255, 123, 91, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 145, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 209, 197, 198, 199, /* 64 - 71 */ + 200, 201, 196, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 192, 229, 230, /* 80 - 87 */ + 231, 232, 220, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 246, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 124, 96, 58, 35, 167, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 223, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 228, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 252, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 233, 221, 222, 161, /* 216 - 223 */ + 214, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 208, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicatdea' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicatdea[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 220, 42, 41, 59, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 68, 79, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 223, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 123, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 54, 46, 60, 40, 43, 124, 38, /* 208 - 215 */ + 81, 82, 218, 219, 91, 221, 222, 106, /* 216 - 223 */ + 224, 225, 83, 84, 127, 86, 87, 88, /* 224 - 231 */ + 89, 252, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 74, 55, /* 240 - 247 */ + 56, 57, 250, 251, 90, 253, 254, 85, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicatdea' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicatdea_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 209, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 123, 197, 198, 199, /* 64 - 71 */ + 200, 201, 246, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 255, 229, 230, /* 80 - 87 */ + 231, 232, 252, 220, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 223, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 58, 196, 214, 39, 61, 228, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 91, 221, 222, 145, /* 216 - 223 */ + 224, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 233, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdiccafr' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdiccafr[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 42, 41, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 35, 32, 39, 61, 255, /* 120 - 127 */ + 128, 47, 40, 99, 180, 101, 102, 103, /* 128 - 135 */ + 71, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 57, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 73, 202, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 45, 52, 116, 206, 207, 119, 120, /* 160 - 167 */ + 161, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 90, 181, 182, 183, /* 176 - 183 */ + 224, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 100, 65, 98, 67, 68, 69, 70, 104, /* 192 - 199 */ + 88, 113, 114, 115, 204, 205, 117, 118, /* 200 - 207 */ + 89, 184, 46, 60, 235, 43, 33, 38, /* 208 - 215 */ + 81, 253, 218, 251, 252, 221, 222, 223, /* 216 - 223 */ + 74, 225, 66, 84, 85, 238, 239, 72, /* 224 - 231 */ + 208, 192, 82, 83, 236, 237, 86, 87, /* 232 - 239 */ + 48, 49, 50, 51, 203, 53, 54, 55, /* 240 - 247 */ + 56, 106, 250, 219, 220, 234, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdiccafr' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdiccafr_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 124, 214, 255, 123, 91, 147, 215, 125, /* 32 - 39 */ + 130, 93, 92, 213, 146, 161, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 162, 245, 246, 247, /* 48 - 55 */ + 248, 145, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 226, 195, 196, 197, 198, 136, /* 64 - 71 */ + 231, 152, 224, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 234, 235, 227, 228, 238, 239, /* 80 - 87 */ + 200, 208, 180, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 131, 192, 133, 134, 135, /* 96 - 103 */ + 199, 137, 249, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 201, 202, 203, 163, 206, 207, 166, /* 112 - 119 */ + 167, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 132, 181, 182, 183, /* 176 - 183 */ + 209, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 233, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 153, 244, 204, 205, 164, 165, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 251, 252, 221, 222, 223, /* 216 - 223 */ + 184, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 253, 212, 236, 237, 229, 230, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 219, 220, 217, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicccc' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicccc[256] = +{ + 0, 1, 2, 3, 55, 45, 46, 47, /* 0 - 7 */ + 22, 5, 37, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 60, 61, 50, 38, /* 16 - 23 */ + 24, 25, 63, 39, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 79, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 106, 208, 161, 7, /* 120 - 127 */ + 4, 6, 8, 9, 10, 20, 21, 23, /* 128 - 135 */ + 26, 27, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 32, 33, 34, 35, 36, 40, 41, 42, /* 144 - 151 */ + 43, 44, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 48, 49, 51, 52, 53, 54, 56, 57, /* 160 - 167 */ + 58, 59, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 128, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 144, 81, 82, 83, 84, 85, 86, 87, /* 208 - 215 */ + 88, 89, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 160, 225, 98, 99, 100, 101, 102, 103, /* 224 - 231 */ + 104, 105, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 112, 113, 114, 115, 116, 117, 118, 119, /* 240 - 247 */ + 120, 62, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicccc' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicccc_to_latin1[256] = +{ + 0, 1, 2, 3, 128, 9, 129, 127, /* 0 - 7 */ + 130, 131, 132, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 133, 134, 8, 135, /* 16 - 23 */ + 24, 25, 136, 137, 28, 29, 30, 31, /* 24 - 31 */ + 144, 145, 146, 147, 148, 10, 23, 27, /* 32 - 39 */ + 149, 150, 151, 152, 153, 5, 6, 7, /* 40 - 47 */ + 160, 161, 22, 162, 163, 164, 165, 4, /* 48 - 55 */ + 166, 167, 168, 169, 20, 21, 249, 26, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 93, /* 72 - 79 */ + 38, 209, 210, 211, 212, 213, 214, 215, /* 80 - 87 */ + 216, 217, 33, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 226, 227, 228, 229, 230, 231, /* 96 - 103 */ + 232, 233, 124, 44, 37, 95, 62, 63, /* 104 - 111 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 112 - 119 */ + 248, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 192, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 208, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 224, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicdkno' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicdkno[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 74, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 69, 224, 41, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 70, 81, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 56, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 252, 115, 116, 90, 118, 119, 120, /* 160 - 167 */ + 45, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 87, 65, 66, 67, 68, 91, 123, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 86, 35, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 124, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 208, 192, 88, /* 224 - 231 */ + 89, 117, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 106, 57, 250, 251, 161, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicdkno' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicdkno_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 209, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 224, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 145, 249, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 91, 123, 199, /* 64 - 71 */ + 200, 201, 35, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 124, 217, 226, 227, 228, 208, 192, /* 80 - 87 */ + 231, 232, 164, 197, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 248, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 233, 165, 166, /* 112 - 119 */ + 167, 96, 58, 198, 216, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 252, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 230, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 229, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 161, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicdknoa' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicdknoa[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 69, 42, 41, 59, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 70, 79, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 106, 120, /* 160 - 167 */ + 121, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 91, 123, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 56, 46, 60, 40, 43, 81, 38, /* 208 - 215 */ + 124, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 85, 90, 127, 88, /* 224 - 231 */ + 89, 86, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 74, 57, 250, 251, 252, 253, 254, 87, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicdknoa' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicdknoa_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 209, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 91, 123, 199, /* 64 - 71 */ + 200, 201, 248, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 214, 217, 226, 227, 228, 233, 255, /* 80 - 87 */ + 231, 232, 229, 197, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 145, /* 112 - 119 */ + 167, 168, 58, 198, 216, 39, 61, 230, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdices' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdices[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 91, 224, 41, 59, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 49, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 45, 74, 116, 117, 118, 119, 120, /* 160 - 167 */ + 161, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 115, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 123, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 106, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdices' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdices_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 35, 36, 147, 215, 208, /* 32 - 39 */ + 212, 93, 224, 213, 146, 161, 210, 129, /* 40 - 47 */ + 240, 145, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 91, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 241, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 192, 163, 164, 165, 166, /* 112 - 119 */ + 167, 96, 58, 209, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicesa' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicesa[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 34, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 91, 42, 41, 59, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 115, 79, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 74, 116, 117, 118, 106, 120, /* 160 - 167 */ + 121, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 123, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 127, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 49, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicesa' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicesa_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 34, 35, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 255, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 91, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 123, 163, 164, 165, 145, /* 112 - 119 */ + 167, 168, 58, 209, 64, 39, 61, 241, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicess' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicess[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 35, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 224, 41, 59, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 49, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 45, 74, 116, 117, 118, 119, 120, /* 160 - 167 */ + 161, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 115, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 123, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 106, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicess' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicess_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 35, 91, 147, 215, 208, /* 32 - 39 */ + 212, 93, 224, 213, 146, 161, 210, 129, /* 40 - 47 */ + 240, 145, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 241, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 192, 163, 164, 165, 166, /* 112 - 119 */ + 167, 96, 58, 209, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicfise' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicfise[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 69, 42, 41, 95, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 68, 33, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 54, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 252, 115, 116, 90, 118, 119, 74, /* 160 - 167 */ + 117, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 85, 65, 66, 67, 123, 91, 70, 71, /* 192 - 199 */ + 72, 224, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 86, 120, 46, 60, 40, 43, 124, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 73, 225, 83, 84, 192, 208, 87, 88, /* 224 - 231 */ + 89, 121, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 106, 55, /* 240 - 247 */ + 56, 57, 250, 251, 161, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicfise' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicfise_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 124, 255, 35, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 145, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 123, 91, 198, 199, /* 64 - 71 */ + 200, 224, 167, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 192, 208, 230, /* 80 - 87 */ + 231, 232, 164, 197, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 246, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 168, 165, 166, /* 112 - 119 */ + 209, 233, 58, 196, 214, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 252, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 228, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 229, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 201, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 161, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicfisea' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicfisea[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 69, 42, 41, 59, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 68, 79, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 106, 120, /* 160 - 167 */ + 121, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 123, 91, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 54, 46, 60, 40, 43, 124, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 127, 90, 87, 88, /* 224 - 231 */ + 89, 86, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 74, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 85, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicfisea' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicfisea_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 33, 34, 35, 36, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 209, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 123, 91, 198, 199, /* 64 - 71 */ + 200, 201, 246, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 255, 233, 230, /* 80 - 87 */ + 231, 232, 229, 197, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 145, /* 112 - 119 */ + 167, 168, 58, 196, 214, 39, 61, 228, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 224, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicfr' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicfr[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 42, 41, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 116, 88, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 57, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 45, 115, 123, 117, 118, 119, 90, /* 160 - 167 */ + 161, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 74, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 120, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 89, 176, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 124, 225, 83, 84, 85, 86, 87, 224, /* 224 - 231 */ + 208, 192, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 106, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicfr' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicfr_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 35, 91, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 161, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 145, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 176, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 124, 208, 167, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 249, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 123, 164, 165, 166, /* 112 - 119 */ + 192, 96, 58, 163, 224, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 209, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 233, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 231, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicibm' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicibm[256] = +{ + 0, 1, 2, 3, 55, 45, 46, 47, /* 0 - 7 */ + 22, 5, 37, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 60, 61, 50, 38, /* 16 - 23 */ + 24, 25, 63, 39, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 173, 224, 189, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 161, 7, /* 120 - 127 */ + 32, 33, 34, 35, 36, 21, 6, 23, /* 128 - 135 */ + 40, 41, 42, 43, 44, 9, 10, 27, /* 136 - 143 */ + 48, 49, 26, 51, 52, 53, 54, 8, /* 144 - 151 */ + 56, 57, 58, 59, 4, 20, 62, 225, /* 152 - 159 */ + 65, 66, 67, 68, 69, 70, 71, 72, /* 160 - 167 */ + 73, 81, 82, 83, 84, 85, 86, 87, /* 168 - 175 */ + 88, 89, 98, 99, 100, 101, 102, 103, /* 176 - 183 */ + 104, 105, 112, 113, 114, 115, 116, 117, /* 184 - 191 */ + 118, 119, 120, 128, 138, 139, 140, 141, /* 192 - 199 */ + 142, 143, 144, 154, 155, 156, 157, 158, /* 200 - 207 */ + 159, 160, 170, 171, 172, 74, 174, 175, /* 208 - 215 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 216 - 223 */ + 184, 185, 186, 187, 188, 106, 190, 191, /* 224 - 231 */ + 202, 203, 204, 205, 206, 207, 218, 219, /* 232 - 239 */ + 220, 221, 222, 223, 234, 235, 236, 237, /* 240 - 247 */ + 238, 239, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicibm' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicibm_to_latin1[256] = +{ + 0, 1, 2, 3, 156, 9, 134, 127, /* 0 - 7 */ + 151, 141, 142, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 157, 133, 8, 135, /* 16 - 23 */ + 24, 25, 146, 143, 28, 29, 30, 31, /* 24 - 31 */ + 128, 129, 130, 131, 132, 10, 23, 27, /* 32 - 39 */ + 136, 137, 138, 139, 140, 5, 6, 7, /* 40 - 47 */ + 144, 145, 22, 147, 148, 149, 150, 4, /* 48 - 55 */ + 152, 153, 154, 155, 20, 21, 158, 26, /* 56 - 63 */ + 32, 160, 161, 162, 163, 164, 165, 166, /* 64 - 71 */ + 167, 168, 213, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 169, 170, 171, 172, 173, 174, 175, /* 80 - 87 */ + 176, 177, 33, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 178, 179, 180, 181, 182, 183, /* 96 - 103 */ + 184, 185, 229, 44, 37, 95, 62, 63, /* 104 - 111 */ + 186, 187, 188, 189, 190, 191, 192, 193, /* 112 - 119 */ + 194, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 195, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 196, 197, 198, 199, 200, 201, /* 136 - 143 */ + 202, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 203, 204, 205, 206, 207, 208, /* 152 - 159 */ + 209, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 210, 211, 212, 91, 214, 215, /* 168 - 175 */ + 216, 217, 218, 219, 220, 221, 222, 223, /* 176 - 183 */ + 224, 225, 226, 227, 228, 93, 230, 231, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 232, 233, 234, 235, 236, 237, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 238, 239, 240, 241, 242, 243, /* 216 - 223 */ + 92, 159, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 244, 245, 246, 247, 248, 249, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 255, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicit' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicit[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 42, 41, 95, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 116, 120, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 50, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 236, 115, 123, 117, 118, 119, 124, /* 160 - 167 */ + 57, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 74, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 88, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 89, 176, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 192, 225, 83, 84, 85, 86, 87, 224, /* 224 - 231 */ + 208, 90, 234, 235, 161, 237, 238, 239, /* 232 - 239 */ + 48, 49, 106, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 121, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicit' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicit_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 35, 91, 147, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 145, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 168, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 176, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 192, 208, 233, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 242, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 123, 164, 165, 166, /* 112 - 119 */ + 124, 249, 58, 163, 167, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 236, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 209, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 224, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 231, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 161, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicpt' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicpt[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 42, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 67, 43, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 53, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 88, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 45, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 208, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 84, 65, 66, 123, 68, 69, 70, 224, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 180, 36, 46, 60, 40, 124, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 71, 225, 83, 192, 85, 86, 87, 161, /* 224 - 231 */ + 89, 41, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 106, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicpt' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicpt_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 35, 209, 147, 215, 125, /* 32 - 39 */ + 212, 233, 92, 124, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 145, 246, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 123, 196, 197, 198, 224, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 192, 228, 229, 230, /* 80 - 87 */ + 161, 232, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 245, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 96, 58, 195, 213, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 231, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 208, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 227, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 180, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 199, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicuk' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicuk[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 74, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 116, 224, 41, 59, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 115, 91, 117, 118, 106, 120, /* 160 - 167 */ + 45, 58, 170, 171, 95, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 35, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 36, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicuk' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicuk_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 192, 209, 147, 215, 208, /* 32 - 39 */ + 212, 93, 224, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 36, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 163, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 91, 164, 165, 145, /* 112 - 119 */ + 167, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ebcdicus' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ebcdicus[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 224, 41, 59, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 161, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 61, 74, 116, 117, 118, 106, 120, /* 160 - 167 */ + 45, 58, 170, 171, 95, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 35, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 115, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ebcdicus' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ebcdicus_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 192, 91, 147, 215, 208, /* 32 - 39 */ + 212, 93, 224, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 161, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 209, 163, 164, 165, 145, /* 112 - 119 */ + 167, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm037' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm037[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 186, 224, 187, 176, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 161, 255, /* 120 - 127 */ + 33, 47, 40, 42, 35, 54, 46, 55, /* 128 - 135 */ + 60, 52, 38, 41, 48, 51, 58, 32, /* 136 - 143 */ + 59, 53, 44, 37, 39, 62, 63, 56, /* 144 - 151 */ + 49, 57, 61, 36, 43, 45, 34, 50, /* 152 - 159 */ + 65, 170, 74, 177, 159, 178, 106, 181, /* 160 - 167 */ + 189, 180, 154, 138, 95, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 71, 156, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 221, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm037' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm037_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 143, 128, 158, 132, 155, 147, 138, 148, /* 32 - 39 */ + 130, 139, 131, 156, 146, 157, 134, 129, /* 40 - 47 */ + 140, 152, 159, 141, 137, 145, 133, 135, /* 48 - 55 */ + 151, 153, 142, 144, 136, 154, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 229, /* 64 - 71 */ + 231, 241, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 33, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 181, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 94, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 91, 93, 175, 168, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm038' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm038[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 32, 208, 161, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 61, 115, 116, 117, 118, 106, 120, /* 160 - 167 */ + 45, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 35, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 36, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 41, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm038' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm038_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 124, 214, 255, 192, 209, 147, 215, 208, /* 32 - 39 */ + 212, 233, 224, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 161, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 145, /* 112 - 119 */ + 167, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm274' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm274[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 42, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 35, 88, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 57, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 45, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 161, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 41, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 89, 36, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 124, 225, 83, 84, 85, 86, 87, 224, /* 224 - 231 */ + 208, 192, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 106, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm274' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm274_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 123, 209, 147, 215, 125, /* 32 - 39 */ + 212, 192, 92, 213, 146, 161, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 145, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 124, 208, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 249, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 96, 58, 35, 224, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 233, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 231, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm275' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm275[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 90, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 71, 224, 41, 95, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 43, 67, 39, 161, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 88, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 61, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 84, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 53, 65, 66, 124, 68, 69, 70, 91, /* 192 - 199 */ + 72, 74, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 36, 73, 46, 60, 40, 123, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 121, 85, 86, 87, 106, /* 224 - 231 */ + 89, 208, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 192, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm275' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm275_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 214, 255, 35, 208, 147, 215, 125, /* 32 - 39 */ + 212, 93, 224, 123, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 192, 246, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 161, 149, 150, /* 56 - 63 */ + 32, 193, 194, 124, 196, 197, 198, 91, /* 64 - 71 */ + 200, 209, 201, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 168, 228, 229, 230, /* 80 - 87 */ + 145, 232, 36, 199, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 231, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 227, 58, 213, 195, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 245, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 233, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm277' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm277[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 74, 103, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 128, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 158, 224, 159, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 156, 187, 71, 220, 255, /* 120 - 127 */ + 32, 47, 40, 42, 43, 54, 46, 36, /* 128 - 135 */ + 39, 35, 38, 50, 48, 51, 58, 33, /* 136 - 143 */ + 52, 56, 44, 37, 59, 62, 63, 53, /* 144 - 151 */ + 49, 57, 61, 60, 34, 45, 55, 41, /* 152 - 159 */ + 65, 170, 176, 177, 90, 178, 112, 181, /* 160 - 167 */ + 189, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 91, 123, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 124, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 208, 192, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 106, 221, 222, 219, 161, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm277' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm277_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 128, 143, 156, 137, 135, 147, 138, 136, /* 32 - 39 */ + 130, 159, 131, 132, 146, 157, 134, 129, /* 40 - 47 */ + 140, 152, 139, 141, 144, 151, 133, 158, /* 48 - 55 */ + 145, 153, 142, 148, 155, 154, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 125, /* 64 - 71 */ + 231, 241, 35, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 164, 197, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 36, /* 96 - 103 */ + 199, 209, 248, 44, 37, 95, 62, 63, /* 104 - 111 */ + 166, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 96, 58, 198, 216, 39, 61, 34, /* 120 - 127 */ + 64, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 123, 184, 91, 93, /* 152 - 159 */ + 181, 252, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 168, 180, 215, /* 184 - 191 */ + 230, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 229, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 126, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm278' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm278[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 99, 103, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 236, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 181, 224, 159, 95, 109, /* 88 - 95 */ + 81, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 67, 187, 71, 220, 255, /* 120 - 127 */ + 45, 47, 40, 35, 46, 55, 42, 36, /* 128 - 135 */ + 39, 53, 38, 33, 48, 51, 58, 32, /* 136 - 143 */ + 52, 54, 44, 37, 59, 62, 63, 56, /* 144 - 151 */ + 49, 57, 61, 60, 43, 50, 34, 41, /* 152 - 159 */ + 65, 170, 176, 177, 90, 178, 204, 74, /* 160 - 167 */ + 189, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 123, 91, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 124, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 192, 208, 156, 72, /* 224 - 231 */ + 84, 121, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 106, 225, /* 240 - 247 */ + 112, 221, 222, 219, 161, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm278' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm278_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 143, 139, 158, 131, 135, 147, 138, 136, /* 32 - 39 */ + 130, 159, 134, 156, 146, 128, 132, 129, /* 40 - 47 */ + 140, 152, 157, 141, 144, 137, 145, 133, /* 48 - 55 */ + 151, 153, 142, 148, 155, 154, 149, 150, /* 56 - 63 */ + 32, 160, 226, 123, 224, 225, 227, 125, /* 64 - 71 */ + 231, 241, 167, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 96, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 164, 197, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 35, 192, 193, 195, 36, /* 96 - 103 */ + 199, 209, 246, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 233, 58, 196, 214, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 93, /* 152 - 159 */ + 181, 252, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 163, 165, 183, 169, 91, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 168, 180, 215, /* 184 - 191 */ + 228, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 166, 242, 243, 245, /* 200 - 207 */ + 229, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 126, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 64, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm280' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm280[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 177, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 181, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 144, 72, 81, 95, 109, /* 88 - 95 */ + 221, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 68, 187, 84, 88, 255, /* 120 - 127 */ + 41, 47, 40, 42, 61, 32, 46, 55, /* 128 - 135 */ + 60, 52, 38, 54, 48, 51, 58, 35, /* 136 - 143 */ + 36, 50, 44, 37, 59, 62, 63, 56, /* 144 - 151 */ + 49, 45, 33, 34, 43, 57, 39, 53, /* 152 - 159 */ + 65, 170, 176, 123, 159, 178, 205, 124, /* 160 - 167 */ + 189, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 74, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 192, 69, 66, 70, 67, 71, 156, 224, /* 224 - 231 */ + 208, 90, 82, 83, 161, 85, 86, 87, /* 232 - 239 */ + 140, 73, 106, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 121, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm280' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm280_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 133, 154, 155, 143, 144, 147, 138, 158, /* 32 - 39 */ + 130, 128, 131, 156, 146, 153, 134, 129, /* 40 - 47 */ + 140, 152, 145, 141, 137, 159, 139, 135, /* 48 - 55 */ + 151, 157, 142, 148, 136, 132, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 123, 225, 227, 229, /* 64 - 71 */ + 92, 241, 176, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 93, 234, 235, 125, 237, 238, 239, /* 80 - 87 */ + 126, 223, 233, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 242, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 249, 58, 163, 167, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 91, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 181, 236, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 35, 165, 183, 169, 64, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 168, 180, 215, /* 184 - 191 */ + 224, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 166, 243, 245, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 96, 250, 255, /* 216 - 223 */ + 231, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm281' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm281[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 224, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 118, 42, 41, 59, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 115, 74, 117, 91, 106, 120, /* 160 - 167 */ + 45, 58, 170, 171, 95, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 35, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 116, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 36, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm281' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm281_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 192, 224, 147, 215, 208, /* 32 - 39 */ + 212, 93, 92, 213, 146, 168, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 163, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 165, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 209, 164, 91, 145, /* 112 - 119 */ + 167, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 36, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm284' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm284[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 187, 127, 105, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 186, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 189, 255, /* 120 - 127 */ + 41, 47, 40, 42, 36, 54, 46, 55, /* 128 - 135 */ + 60, 35, 38, 33, 48, 51, 58, 32, /* 136 - 143 */ + 52, 49, 44, 37, 39, 62, 63, 56, /* 144 - 151 */ + 53, 57, 45, 59, 43, 61, 34, 50, /* 152 - 159 */ + 65, 170, 176, 177, 159, 178, 73, 181, /* 160 - 167 */ + 161, 180, 154, 138, 95, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 123, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 71, 156, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 106, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 221, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm284' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm284_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 143, 139, 158, 137, 132, 147, 138, 148, /* 32 - 39 */ + 130, 128, 131, 156, 146, 154, 134, 129, /* 40 - 47 */ + 140, 145, 159, 141, 144, 152, 133, 135, /* 48 - 55 */ + 151, 153, 142, 155, 136, 157, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 229, /* 64 - 71 */ + 231, 166, 91, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 93, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 35, 241, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 96, 58, 209, 64, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 181, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 94, 33, 175, 126, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm285' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm285[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 74, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 177, 224, 187, 186, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 161, 255, /* 120 - 127 */ + 33, 47, 40, 42, 35, 54, 46, 55, /* 128 - 135 */ + 60, 36, 38, 41, 48, 51, 58, 32, /* 136 - 143 */ + 52, 53, 44, 37, 39, 62, 63, 56, /* 144 - 151 */ + 49, 57, 61, 59, 43, 45, 34, 50, /* 152 - 159 */ + 65, 170, 176, 91, 159, 178, 106, 181, /* 160 - 167 */ + 189, 180, 154, 138, 95, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 71, 156, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 221, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm285' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm285_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 143, 128, 158, 132, 137, 147, 138, 148, /* 32 - 39 */ + 130, 139, 131, 156, 146, 157, 134, 129, /* 40 - 47 */ + 140, 152, 159, 141, 144, 145, 133, 135, /* 48 - 55 */ + 151, 153, 142, 155, 136, 154, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 229, /* 64 - 71 */ + 231, 241, 36, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 33, 163, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 181, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 91, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 94, 93, 175, 168, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm290' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm290[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 224, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 165, 42, 41, 59, 109, /* 88 - 95 */ + 121, 47, 98, 99, 100, 101, 102, 103, /* 96 - 103 */ + 104, 105, 166, 44, 37, 172, 62, 63, /* 104 - 111 */ + 112, 113, 114, 115, 116, 117, 118, 119, /* 112 - 119 */ + 120, 45, 58, 35, 79, 39, 61, 255, /* 120 - 127 */ + 128, 129, 130, 131, 132, 133, 134, 135, /* 128 - 135 */ + 136, 137, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 145, 146, 147, 148, 149, 150, 151, /* 144 - 151 */ + 152, 153, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 162, 74, 164, 91, 106, 167, /* 160 - 167 */ + 168, 169, 170, 171, 95, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 163, 46, 60, 40, 43, 32, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 36, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm290' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm290_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 123, 224, 108, 215, 125, /* 32 - 39 */ + 212, 93, 92, 213, 107, 121, 210, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 211, 126, 110, 111, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 163, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 165, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 98, 99, 100, 101, 102, 103, /* 96 - 103 */ + 104, 105, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 112, 113, 114, 115, 116, 117, 118, 119, /* 112 - 119 */ + 120, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 129, 130, 131, 132, 133, 134, 135, /* 128 - 135 */ + 136, 137, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 145, 146, 147, 148, 149, 150, 151, /* 144 - 151 */ + 152, 153, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 175, 162, 209, 164, 91, 106, 167, /* 160 - 167 */ + 168, 169, 170, 171, 109, 173, 174, 161, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 36, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm297' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm297[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 177, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 68, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 144, 72, 181, 95, 109, /* 88 - 95 */ + 160, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 81, 187, 84, 189, 255, /* 120 - 127 */ + 42, 47, 40, 32, 54, 45, 46, 55, /* 128 - 135 */ + 60, 52, 38, 33, 48, 51, 58, 35, /* 136 - 143 */ + 36, 57, 44, 37, 59, 62, 63, 56, /* 144 - 151 */ + 49, 53, 41, 34, 43, 61, 39, 50, /* 152 - 159 */ + 65, 170, 176, 123, 159, 178, 221, 90, /* 160 - 167 */ + 161, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 74, 143, 234, 250, 190, 121, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 124, 69, 66, 70, 67, 71, 156, 224, /* 224 - 231 */ + 208, 192, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 106, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm297' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm297_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 131, 139, 155, 143, 144, 147, 138, 158, /* 32 - 39 */ + 130, 154, 128, 156, 146, 133, 134, 129, /* 40 - 47 */ + 140, 152, 159, 141, 137, 153, 132, 135, /* 48 - 55 */ + 151, 145, 142, 148, 136, 157, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 64, 225, 227, 229, /* 64 - 71 */ + 92, 241, 176, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 123, 234, 235, 125, 237, 238, 239, /* 80 - 87 */ + 236, 223, 167, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 249, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 181, 58, 163, 224, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 91, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 96, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 35, 165, 183, 169, 93, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 126, 180, 215, /* 184 - 191 */ + 233, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 232, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 166, 250, 255, /* 216 - 223 */ + 231, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm420' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm420[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 36, 42, 41, 59, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 35, 79, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 65, 55, 74, 116, 117, 118, 106, 120, /* 160 - 167 */ + 121, 58, 170, 171, 95, 202, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 160, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 115, 46, 60, 40, 43, 32, 224, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 38, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 161, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm420' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm420_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 123, 91, 147, 224, 125, /* 32 - 39 */ + 212, 93, 92, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 161, /* 48 - 55 */ + 248, 249, 169, 94, 211, 126, 149, 150, /* 56 - 63 */ + 32, 160, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 209, 163, 164, 165, 145, /* 112 - 119 */ + 167, 168, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 193, 247, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 148, 202, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 215, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm423' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm423[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 35, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 48 - 55 */ + 56, 57, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 32, 209, 210, 211, 212, 213, 214, 215, /* 64 - 71 */ + 216, 217, 225, 226, 227, 228, 229, 230, /* 72 - 79 */ + 231, 232, 233, 242, 243, 244, 245, 246, /* 80 - 87 */ + 247, 248, 249, 74, 42, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 116, 120, 39, 61, 34, /* 120 - 127 */ + 196, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 70, 106, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 194, 45, 115, 123, 117, 118, 119, 124, /* 160 - 167 */ + 161, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 240, 234, 178, 179, 224, 181, 182, 183, /* 176 - 183 */ + 208, 185, 186, 187, 188, 250, 190, 191, /* 184 - 191 */ + 192, 193, 220, 195, 128, 197, 198, 199, /* 192 - 199 */ + 200, 201, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 184, 65, 66, 67, 68, 69, 144, 71, /* 208 - 215 */ + 72, 73, 218, 219, 160, 180, 40, 177, /* 216 - 223 */ + 221, 36, 46, 60, 222, 43, 33, 38, /* 224 - 231 */ + 236, 235, 223, 237, 81, 82, 238, 239, /* 232 - 239 */ + 176, 241, 83, 84, 252, 86, 251, 88, /* 240 - 247 */ + 89, 254, 189, 253, 255, 87, 41, 85, /* 248 - 255 */ +}; + +/* Conversion table from `ibm423' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm423_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 230, 127, 35, 225, 147, 231, 125, /* 32 - 39 */ + 222, 254, 92, 229, 146, 161, 226, 129, /* 40 - 47 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 48 - 55 */ + 56, 57, 169, 148, 227, 126, 149, 150, /* 56 - 63 */ + 32, 209, 210, 211, 212, 213, 144, 215, /* 64 - 71 */ + 216, 217, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 236, 237, 242, 243, 255, 245, 253, /* 80 - 87 */ + 247, 248, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 123, 164, 165, 166, /* 112 - 119 */ + 124, 96, 58, 163, 167, 39, 61, 34, /* 120 - 127 */ + 196, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 214, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 220, 168, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 240, 223, 178, 179, 221, 181, 182, 183, /* 176 - 183 */ + 208, 185, 186, 187, 188, 250, 190, 191, /* 184 - 191 */ + 192, 193, 160, 195, 128, 197, 198, 199, /* 192 - 199 */ + 200, 201, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 184, 65, 66, 67, 68, 69, 70, 71, /* 208 - 215 */ + 72, 73, 218, 219, 194, 224, 228, 234, /* 216 - 223 */ + 180, 74, 75, 76, 77, 78, 79, 80, /* 224 - 231 */ + 81, 82, 177, 233, 232, 235, 238, 239, /* 232 - 239 */ + 176, 241, 83, 84, 85, 86, 87, 88, /* 240 - 247 */ + 89, 90, 189, 246, 244, 251, 249, 252, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm424' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm424[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 90, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 186, 224, 187, 176, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 79, 208, 161, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 41, 140, 141, 142, 143, /* 136 - 143 */ + 59, 119, 44, 37, 172, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 45, 158, 117, /* 152 - 159 */ + 116, 61, 74, 177, 159, 178, 106, 181, /* 160 - 167 */ + 189, 180, 170, 138, 95, 202, 175, 188, /* 168 - 175 */ + 144, 120, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 36, 139, 183, 184, 185, 38, /* 184 - 191 */ + 35, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 115, 46, 60, 40, 43, 32, 191, /* 208 - 215 */ + 81, 82, 58, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 55, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 33, 118, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 225, /* 240 - 247 */ + 56, 57, 174, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm424' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm424_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 214, 233, 255, 192, 186, 147, 191, 208, /* 32 - 39 */ + 212, 139, 224, 213, 146, 157, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 225, /* 48 - 55 */ + 248, 249, 218, 144, 211, 161, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 162, 46, 60, 40, 43, 124, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 33, 36, 42, 41, 59, 172, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 209, 160, 159, 234, 145, /* 112 - 119 */ + 177, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 140, 141, 142, 143, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 184, 158, 164, /* 152 - 159 */ + 181, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 138, 148, 202, 250, 174, /* 168 - 175 */ + 94, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 91, 93, 175, 168, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm500' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm500[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 187, 208, 161, 255, /* 120 - 127 */ + 41, 47, 40, 42, 35, 54, 46, 55, /* 128 - 135 */ + 60, 36, 38, 32, 48, 51, 58, 33, /* 136 - 143 */ + 52, 53, 44, 37, 59, 62, 63, 56, /* 144 - 151 */ + 49, 57, 61, 39, 43, 45, 34, 50, /* 152 - 159 */ + 65, 170, 176, 177, 159, 178, 106, 181, /* 160 - 167 */ + 189, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 190, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 158, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 172, 105, 237, 238, 235, 239, 236, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 174, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 71, 156, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 140, 73, 205, 206, 203, 207, 204, 225, /* 240 - 247 */ + 112, 221, 222, 219, 220, 141, 142, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm500' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm500_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 139, 143, 158, 132, 137, 147, 138, 155, /* 32 - 39 */ + 130, 128, 131, 156, 146, 157, 134, 129, /* 40 - 47 */ + 140, 152, 159, 141, 144, 145, 133, 135, /* 48 - 55 */ + 151, 153, 142, 148, 136, 154, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 229, /* 64 - 71 */ + 231, 241, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 240, 253, 254, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 230, 184, 198, 164, /* 152 - 159 */ + 181, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 208, 221, 222, 174, /* 168 - 175 */ + 162, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 168, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 242, 243, 245, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 249, 250, 255, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 214, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm870' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm870[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 121, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 106, 208, 161, 255, /* 120 - 127 */ + 128, 47, 98, 68, 100, 160, 102, 103, /* 128 - 135 */ + 71, 105, 138, 139, 140, 253, 142, 143, /* 136 - 143 */ + 183, 32, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 73, 114, 154, 155, 156, 184, 158, 205, /* 152 - 159 */ + 65, 61, 52, 116, 159, 118, 119, 181, /* 160 - 167 */ + 189, 58, 170, 171, 172, 202, 174, 175, /* 168 - 175 */ + 144, 177, 178, 179, 190, 120, 182, 176, /* 176 - 183 */ + 157, 185, 186, 187, 188, 45, 180, 38, /* 184 - 191 */ + 35, 101, 66, 237, 99, 55, 70, 104, /* 192 - 199 */ + 88, 113, 221, 115, 54, 117, 51, 207, /* 200 - 207 */ + 39, 36, 46, 238, 235, 43, 236, 191, /* 208 - 215 */ + 41, 82, 254, 219, 252, 173, 250, 89, /* 216 - 223 */ + 42, 69, 40, 84, 67, 86, 87, 72, /* 224 - 231 */ + 223, 81, 234, 83, 33, 85, 60, 239, /* 232 - 239 */ + 48, 49, 50, 206, 203, 53, 204, 225, /* 240 - 247 */ + 56, 57, 222, 251, 220, 141, 218, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm870' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm870_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 145, 236, 255, 192, 209, 147, 191, 208, /* 32 - 39 */ + 226, 216, 224, 213, 146, 189, 210, 129, /* 40 - 47 */ + 240, 241, 242, 206, 162, 245, 204, 197, /* 48 - 55 */ + 248, 249, 169, 148, 238, 161, 149, 150, /* 56 - 63 */ + 32, 160, 194, 228, 131, 225, 198, 136, /* 64 - 71 */ + 231, 152, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 233, 217, 235, 227, 237, 229, 230, /* 80 - 87 */ + 200, 223, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 196, 132, 193, 134, 135, /* 96 - 103 */ + 199, 137, 124, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 201, 153, 203, 163, 205, 165, 166, /* 112 - 119 */ + 181, 96, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 253, 142, 143, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 184, 158, 164, /* 152 - 159 */ + 133, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 221, 174, 175, /* 168 - 175 */ + 183, 177, 178, 179, 190, 167, 182, 144, /* 176 - 183 */ + 157, 185, 186, 187, 188, 168, 180, 215, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 246, 159, 243, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 254, 219, 252, 202, 250, 232, /* 216 - 223 */ + 92, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 212, 214, 195, 211, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 222, 251, 220, 141, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm871' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm871[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 172, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 174, 190, 158, 236, 109, /* 88 - 95 */ + 140, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 142, 187, 156, 204, 255, /* 120 - 127 */ + 34, 47, 40, 58, 36, 61, 46, 55, /* 128 - 135 */ + 60, 42, 38, 43, 45, 51, 35, 59, /* 136 - 143 */ + 52, 53, 44, 37, 33, 62, 63, 56, /* 144 - 151 */ + 49, 57, 54, 32, 39, 48, 41, 50, /* 152 - 159 */ + 65, 170, 176, 177, 159, 178, 106, 181, /* 160 - 167 */ + 189, 180, 154, 138, 186, 202, 175, 188, /* 168 - 175 */ + 144, 143, 234, 250, 224, 160, 182, 179, /* 176 - 183 */ + 157, 218, 155, 139, 183, 184, 185, 171, /* 184 - 191 */ + 100, 101, 98, 102, 99, 103, 90, 104, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 124, 105, 237, 238, 235, 239, 95, 191, /* 208 - 215 */ + 128, 253, 254, 251, 252, 173, 192, 89, /* 216 - 223 */ + 68, 69, 66, 70, 67, 71, 208, 72, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 121, 73, 205, 206, 203, 207, 161, 225, /* 240 - 247 */ + 112, 221, 222, 219, 220, 141, 74, 223, /* 248 - 255 */ +}; + +/* Conversion table from `ibm871' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm871_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 155, 148, 128, 142, 132, 147, 138, 156, /* 32 - 39 */ + 130, 158, 137, 139, 146, 140, 134, 129, /* 40 - 47 */ + 157, 152, 159, 141, 144, 145, 154, 135, /* 48 - 55 */ + 151, 153, 131, 143, 136, 133, 149, 150, /* 56 - 63 */ + 32, 160, 226, 228, 224, 225, 227, 229, /* 64 - 71 */ + 231, 241, 254, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 198, 36, 42, 41, 59, 214, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 195, 197, /* 96 - 103 */ + 199, 209, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 248, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 240, 58, 35, 208, 39, 61, 34, /* 120 - 127 */ + 216, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 171, 187, 96, 253, 123, 177, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 170, 186, 125, 184, 93, 164, /* 152 - 159 */ + 181, 246, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 161, 191, 64, 221, 91, 174, /* 168 - 175 */ + 162, 163, 165, 183, 169, 167, 182, 188, /* 176 - 183 */ + 189, 190, 172, 124, 175, 168, 92, 215, /* 184 - 191 */ + 222, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 126, 242, 243, 245, /* 200 - 207 */ + 230, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 185, 251, 252, 249, 250, 255, /* 216 - 223 */ + 180, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 94, 210, 211, 213, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 220, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm880' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm880[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 45, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 35, 32, 39, 61, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 119, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 225, 118, 106, 120, /* 160 - 167 */ + 121, 58, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 36, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 117, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 41, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm880' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm880_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 124, 214, 255, 123, 209, 147, 215, 125, /* 32 - 39 */ + 212, 233, 224, 213, 146, 96, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 126, 149, 150, /* 56 - 63 */ + 32, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 166, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 225, 165, 145, /* 112 - 119 */ + 167, 168, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 160, 161, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 173, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 187, 188, 189, 190, 191, /* 184 - 191 */ + 192, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 202, 203, 204, 205, 206, 207, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 164, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm905' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm905[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 252, 236, 185, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 175, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 104, 220, 182, 95, 109, /* 88 - 95 */ + 218, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 72, 143, 179, 204, 255, /* 120 - 127 */ + 128, 47, 40, 34, 35, 65, 102, 103, /* 128 - 135 */ + 91, 71, 138, 139, 140, 141, 142, 124, /* 136 - 143 */ + 183, 106, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 49, 173, 154, 155, 156, 157, 158, 50, /* 152 - 159 */ + 61, 54, 52, 177, 159, 51, 207, 181, /* 160 - 167 */ + 189, 58, 170, 171, 172, 202, 174, 32, /* 168 - 175 */ + 144, 33, 234, 250, 190, 160, 41, 176, /* 176 - 183 */ + 121, 36, 186, 187, 188, 184, 180, 38, /* 184 - 191 */ + 100, 101, 98, 46, 99, 55, 70, 74, /* 192 - 199 */ + 116, 113, 114, 115, 120, 117, 118, 119, /* 200 - 207 */ + 208, 105, 237, 238, 235, 43, 123, 191, /* 208 - 215 */ + 90, 253, 254, 251, 127, 57, 39, 89, /* 216 - 223 */ + 68, 69, 66, 223, 67, 60, 239, 192, /* 224 - 231 */ + 84, 81, 82, 83, 88, 85, 86, 87, /* 232 - 239 */ + 48, 73, 205, 206, 203, 53, 161, 225, /* 240 - 247 */ + 56, 221, 222, 219, 224, 178, 45, 42, /* 248 - 255 */ +}; + +/* Conversion table from `ibm905' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm905_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 175, 177, 131, 132, 185, 147, 191, 222, /* 32 - 39 */ + 130, 182, 255, 213, 146, 254, 195, 129, /* 40 - 47 */ + 240, 152, 159, 165, 162, 245, 161, 197, /* 48 - 55 */ + 248, 221, 169, 148, 229, 160, 149, 150, /* 56 - 63 */ + 32, 133, 226, 228, 224, 225, 198, 137, /* 64 - 71 */ + 123, 241, 199, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 233, 234, 235, 232, 237, 238, 239, /* 80 - 87 */ + 236, 223, 216, 136, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 194, 196, 192, 193, 134, 135, /* 96 - 103 */ + 91, 209, 145, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 201, 202, 203, 200, 205, 206, 207, /* 112 - 119 */ + 204, 184, 58, 214, 143, 39, 61, 220, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 124, /* 136 - 143 */ + 176, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 164, /* 152 - 159 */ + 181, 246, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 153, 174, 64, /* 168 - 175 */ + 183, 163, 253, 125, 190, 167, 93, 144, /* 176 - 183 */ + 189, 36, 186, 187, 188, 168, 180, 215, /* 184 - 191 */ + 231, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 244, 126, 242, 243, 166, /* 200 - 207 */ + 208, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 96, 251, 92, 249, 250, 227, /* 216 - 223 */ + 252, 247, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 178, 212, 35, 210, 211, 230, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 179, 219, 34, 217, 218, 127, /* 248 - 255 */ +}; + +/* Conversion table from `latin1' charset to `ibm918' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const latin1_to_ibm918[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 64, 79, 127, 123, 91, 108, 80, 125, /* 32 - 39 */ + 77, 93, 92, 78, 107, 96, 75, 97, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 122, 94, 76, 126, 110, 111, /* 56 - 63 */ + 124, 193, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 209, 210, 211, 212, 213, 214, /* 72 - 79 */ + 215, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 233, 74, 224, 90, 95, 109, /* 88 - 95 */ + 106, 129, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 145, 146, 147, 148, 149, 150, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 169, 192, 187, 208, 161, 255, /* 120 - 127 */ + 128, 47, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 45, 44, 37, 59, 62, 63, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 65, 61, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 58, 170, 171, 172, 202, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 32, 188, 189, 190, 191, /* 184 - 191 */ + 35, 160, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 39, 36, 46, 60, 40, 43, 33, 38, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 42, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 41, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 34, /* 248 - 255 */ +}; + +/* Conversion table from `ibm918' charset to `latin1' charset. + Generated mechanically by GNU recode 3.4. + + The recoding should be reversible. + */ + +unsigned char const ibm918_to_latin1[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 0 - 7 */ + 8, 9, 10, 11, 12, 13, 14, 15, /* 8 - 15 */ + 16, 17, 18, 19, 20, 21, 22, 23, /* 16 - 23 */ + 24, 25, 26, 27, 28, 29, 30, 31, /* 24 - 31 */ + 187, 214, 255, 192, 209, 147, 215, 208, /* 32 - 39 */ + 212, 233, 224, 213, 146, 145, 210, 129, /* 40 - 47 */ + 240, 241, 242, 243, 244, 245, 246, 247, /* 48 - 55 */ + 248, 249, 169, 148, 211, 161, 149, 150, /* 56 - 63 */ + 32, 160, 194, 195, 196, 197, 198, 199, /* 64 - 71 */ + 200, 201, 91, 46, 60, 40, 43, 33, /* 72 - 79 */ + 38, 216, 217, 226, 227, 228, 229, 230, /* 80 - 87 */ + 231, 232, 93, 36, 42, 41, 59, 94, /* 88 - 95 */ + 45, 47, 130, 131, 132, 133, 134, 135, /* 96 - 103 */ + 136, 137, 96, 44, 37, 95, 62, 63, /* 104 - 111 */ + 151, 152, 153, 162, 163, 164, 165, 166, /* 112 - 119 */ + 167, 168, 58, 35, 64, 39, 61, 34, /* 120 - 127 */ + 128, 97, 98, 99, 100, 101, 102, 103, /* 128 - 135 */ + 104, 105, 138, 139, 140, 141, 142, 143, /* 136 - 143 */ + 144, 106, 107, 108, 109, 110, 111, 112, /* 144 - 151 */ + 113, 114, 154, 155, 156, 157, 158, 159, /* 152 - 159 */ + 193, 126, 115, 116, 117, 118, 119, 120, /* 160 - 167 */ + 121, 122, 170, 171, 172, 202, 174, 175, /* 168 - 175 */ + 176, 177, 178, 179, 180, 181, 182, 183, /* 176 - 183 */ + 184, 185, 186, 124, 188, 189, 190, 191, /* 184 - 191 */ + 123, 65, 66, 67, 68, 69, 70, 71, /* 192 - 199 */ + 72, 73, 173, 203, 204, 205, 206, 207, /* 200 - 207 */ + 125, 74, 75, 76, 77, 78, 79, 80, /* 208 - 215 */ + 81, 82, 218, 219, 220, 221, 222, 223, /* 216 - 223 */ + 92, 225, 83, 84, 85, 86, 87, 88, /* 224 - 231 */ + 89, 90, 234, 235, 236, 237, 238, 239, /* 232 - 239 */ + 48, 49, 50, 51, 52, 53, 54, 55, /* 240 - 247 */ + 56, 57, 250, 251, 252, 253, 254, 127, /* 248 - 255 */ +}; + +/* This is the translation-map index which is scanned in utility.cc + */ + +Tn5250TransMap transmaps[] = +{ + {"en", ebcdic_to_latin1, latin1_to_ebcdic}, + {"atde", ebcdicatde_to_latin1, latin1_to_ebcdicatde}, + {"atdea", ebcdicatdea_to_latin1, latin1_to_ebcdicatdea}, + {"cafr", ebcdiccafr_to_latin1, latin1_to_ebcdiccafr}, + {"ccc", ebcdicccc_to_latin1, latin1_to_ebcdicccc}, + {"dkno", ebcdicdkno_to_latin1, latin1_to_ebcdicdkno}, + {"dknoa", ebcdicdknoa_to_latin1, latin1_to_ebcdicdknoa}, + {"es", ebcdices_to_latin1, latin1_to_ebcdices}, + {"esa", ebcdicesa_to_latin1, latin1_to_ebcdicesa}, + {"ess", ebcdicess_to_latin1, latin1_to_ebcdicess}, + {"fise", ebcdicfise_to_latin1, latin1_to_ebcdicfise}, + {"fisea", ebcdicfisea_to_latin1, latin1_to_ebcdicfisea}, + {"fr", ebcdicfr_to_latin1, latin1_to_ebcdicfr}, + {"ibm", ebcdicibm_to_latin1, latin1_to_ebcdicibm}, + {"it", ebcdicit_to_latin1, latin1_to_ebcdicit}, + {"pt", ebcdicpt_to_latin1, latin1_to_ebcdicpt}, + {"uk", ebcdicuk_to_latin1, latin1_to_ebcdicuk}, + {"us", ebcdicus_to_latin1, latin1_to_ebcdicus}, + {"37", ibm037_to_latin1, latin1_to_ibm037}, + {"cpca", ibm037_to_latin1, latin1_to_ibm037}, + {"cpnl", ibm037_to_latin1, latin1_to_ibm037}, + {"cpus", ibm037_to_latin1, latin1_to_ibm037}, + {"cpwt", ibm037_to_latin1, latin1_to_ibm037}, + {"38", ibm038_to_latin1, latin1_to_ibm038}, + {"int", ibm038_to_latin1, latin1_to_ibm038}, + {"274", ibm274_to_latin1, latin1_to_ibm274}, + {"be", ibm274_to_latin1, latin1_to_ibm274}, + {"275", ibm275_to_latin1, latin1_to_ibm275}, + {"br", ibm275_to_latin1, latin1_to_ibm275}, + {"277", ibm277_to_latin1, latin1_to_ibm277}, + {"cpdk", ibm277_to_latin1, latin1_to_ibm277}, + {"cpno", ibm277_to_latin1, latin1_to_ibm277}, + {"278", ibm278_to_latin1, latin1_to_ibm278}, + {"cpfi", ibm278_to_latin1, latin1_to_ibm278}, + {"cpse", ibm278_to_latin1, latin1_to_ibm278}, + {"280", ibm280_to_latin1, latin1_to_ibm280}, + {"cpit", ibm280_to_latin1, latin1_to_ibm280}, + {"281", ibm281_to_latin1, latin1_to_ibm281}, + {"jpe", ibm281_to_latin1, latin1_to_ibm281}, + {"284", ibm284_to_latin1, latin1_to_ibm284}, + {"cpes", ibm284_to_latin1, latin1_to_ibm284}, + {"285", ibm285_to_latin1, latin1_to_ibm285}, + {"cpgb", ibm285_to_latin1, latin1_to_ibm285}, + {"290", ibm290_to_latin1, latin1_to_ibm290}, + {"jpkana", ibm290_to_latin1, latin1_to_ibm290}, + {"297", ibm297_to_latin1, latin1_to_ibm297}, + {"cpfr", ibm297_to_latin1, latin1_to_ibm297}, + {"420", ibm420_to_latin1, latin1_to_ibm420}, + {"cpar1", ibm420_to_latin1, latin1_to_ibm420}, + {"423", ibm423_to_latin1, latin1_to_ibm423}, + {"cpgr", ibm423_to_latin1, latin1_to_ibm423}, + {"424", ibm424_to_latin1, latin1_to_ibm424}, + {"cphe", ibm424_to_latin1, latin1_to_ibm424}, + {"500", ibm500_to_latin1, latin1_to_ibm500}, + {"cpbe", ibm500_to_latin1, latin1_to_ibm500}, + {"cpch", ibm500_to_latin1, latin1_to_ibm500}, + {"870", ibm870_to_latin1, latin1_to_ibm870}, + {"cproece", ibm870_to_latin1, latin1_to_ibm870}, + {"cpyu", ibm870_to_latin1, latin1_to_ibm870}, + {"871", ibm871_to_latin1, latin1_to_ibm871}, + {"cpis", ibm871_to_latin1, latin1_to_ibm871}, + {"880", ibm880_to_latin1, latin1_to_ibm880}, + {"cyrillic", ibm880_to_latin1, latin1_to_ibm880}, + {"905", ibm905_to_latin1, latin1_to_ibm905}, + {"cptr", ibm905_to_latin1, latin1_to_ibm905}, + {"918", ibm918_to_latin1, latin1_to_ibm918}, + {"cpar2", ibm918_to_latin1, latin1_to_ibm918}, + {NULL, NULL, NULL}}; diff --git a/src/utility.c b/src/utility.c new file mode 100644 index 0000000..d54dd80 --- /dev/null +++ b/src/utility.c @@ -0,0 +1,179 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" + +#ifdef WIN32 +#include +#endif + +#include +#include +#include +#include +#include +#include +#include "utility.h" + +static unsigned char const /*@null@*/ *ebcdicmap = NULL; +static unsigned char const /*@null@*/ *asciimap = NULL; + +struct _Tn5250TransMap { + char *mapname; + unsigned char const *ebcdicmap; + unsigned char const *asciimap; +}; + +typedef struct _Tn5250TransMap Tn5250TransMap; + +#include "transmaps.h" + +unsigned char tn5250_ascii2ebcdic(unsigned char ascii) +{ + TN5250_ASSERT (asciimap != NULL); + return (asciimap[ascii]); +} + +unsigned char tn5250_ebcdic2ascii(unsigned char ebcdic) +{ + TN5250_ASSERT (ebcdicmap != NULL); + switch (ebcdic) { + case 0x1C: + return '*'; + case 0: + return ' '; + default: + return ebcdicmap[ebcdic]; + } +} + +void tn5250_settransmap(char *map) +{ + Tn5250TransMap *t; + for (t = transmaps; t->mapname; t++) { + if (strcmp(t->mapname, map) == 0) { + asciimap = t->asciimap; + ebcdicmap = t->ebcdicmap; + break; + } + } + if (!t->mapname) { +#ifndef WIN32 + printf("Invalid mapname: %s\n" + "Try one out of:\n ", map); + for (t = transmaps; t->mapname; t++) { + printf("%s ", t->mapname); + } + printf("\n"); +#else + char msg[1024] = "Invalid map name, try one of:\r\n"; + for (t = transmaps; t->mapname; t++) { + strcat(msg, t->mapname); + if ((t + 1)->mapname) + strcat(msg, ", "); + } + MessageBox(NULL, msg, "tn5250", MB_ICONEXCLAMATION); +#endif + exit(1); + } + /* ebcdicmap[0] = ' '; */ +} + +int tn5250_printable(unsigned char data) +{ + int printable; + + if (data == 0x00) + printable = 1; + else if ((data >= 0x1C) && (data <= 0xFF)) + printable = 1; + else + printable = 0; + + return (printable); + +} + +int tn5250_attribute(unsigned char data) +{ + return ((data & 0xE0) == 0x20); +} + +int tn5250_isnumeric(char data) +{ + char list[] = "0123456789 +-,."; + int rc; + + rc = 0; + if (strchr(list, data)) + rc = 1; + + return (rc); + +} + + +#ifndef NDEBUG +FILE *tn5250_logfile = NULL; + +void tn5250_log_open(const char *fname) +{ + if (tn5250_logfile != NULL) + fclose(tn5250_logfile); + tn5250_logfile = fopen(fname, "w"); + if (tn5250_logfile == NULL) { + perror(fname); + exit(1); + } +#ifndef WIN32 + /* Set file mode to 0600 since it may contain passwords. */ + fchmod(fileno(tn5250_logfile), 0600); +#endif + setbuf(tn5250_logfile, NULL); +} + +void tn5250_log_close() +{ + if (tn5250_logfile != NULL) { + fclose(tn5250_logfile); + tn5250_logfile = NULL; + } +} + +void tn5250_log_printf(const char *fmt,...) +{ + va_list vl; + if (tn5250_logfile != NULL) { + va_start(vl, fmt); + vfprintf(tn5250_logfile, fmt, vl); + va_end(vl); + } +} + +void tn5250_log_assert(int val, char const *expr, char const *file, int line) +{ + if (!val) { + tn5250_log_printf("\nAssertion %s failed at %s, line %d.\n", expr, file, line); + fprintf (stderr,"\nAssertion %s failed at %s, line %d.\n", expr, file, line); + abort (); + } +} + +#endif /* NDEBUG */ + +/* vi:set cindent sts=3 sw=3: */ diff --git a/src/utility.h b/src/utility.h new file mode 100644 index 0000000..3d42829 --- /dev/null +++ b/src/utility.h @@ -0,0 +1,64 @@ +/* tn5250 -- an implentation of the 5250 telnet protocol. + * Copyright (C) 1997 Michael Madore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef UTILITY_H +#define UTILITY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if SIZEOF_SHORT == 2 + typedef unsigned short Tn5250Uint16; + typedef signed short Tn5250Sint16; +#elif SIZEOF_INT == 2 + typedef unsigned int Tn5250Uint16; + typedef signed int Tn5250Sint16; +#else + ACK! Need a 16-bit type! +#endif + +/* Idea shamelessly stolen from GTK+ */ +#define tn5250_new(type,count) (type *)malloc (sizeof (type) * (count)) + + unsigned char tn5250_ascii2ebcdic(unsigned char ascii); + unsigned char tn5250_ebcdic2ascii(unsigned char ebcdic); + void tn5250_settransmap(char *map); + int tn5250_printable(unsigned char data); + int tn5250_attribute(unsigned char data); + int tn5250_isnumeric(char data); + +#define TN5250_MAKESTRING(expr) #expr +#ifndef NDEBUG + void tn5250_log_open(const char *fname); + void tn5250_log_printf(const char *fmt,...); + void tn5250_log_close(void); + void tn5250_log_assert(int val, char const *expr, char const *file, int line); +#define TN5250_LOG(args) tn5250_log_printf args +#define TN5250_ASSERT(expr) \ + tn5250_log_assert((expr), TN5250_MAKESTRING(expr), __FILE__, __LINE__) + +extern FILE * tn5250_logfile; +#else +#define TN5250_LOG(args) +#endif + +#ifdef __cplusplus +} + +#endif +#endif /* UTILITY_H */ diff --git a/src/version.c b/src/version.c new file mode 100644 index 0000000..d98c2ae --- /dev/null +++ b/src/version.c @@ -0,0 +1,4 @@ + +#include "config.h" + +char *version_string = VERSION; diff --git a/src/xt5250 b/src/xt5250 new file mode 100755 index 0000000..86e1d27 --- /dev/null +++ b/src/xt5250 @@ -0,0 +1,2 @@ +#!/bin/sh +xterm -name "xt5250" -bg black -fg white -tn xterm-5250 -e tn5250 "$@" & diff --git a/tn5250-48x48.png b/tn5250-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa2a06fe6c576fcc5315e9ad418a7de159dafc7 GIT binary patch literal 1406 zcmV-^1%djBP)5Hv4l_0GYNq13-OHC=d%AyMwMM5{O zx)YJ&A{1Nv141S4+(?liS#+Va6qM&if^?Bxf^;D^DJhM~EfwB0oZRPP=FXjW-%IlP z8u~no%bnlf`JQv;o_l8C`t`2?Km)Yk zAXe2Os3erct%wyskiefULHL1zKNKeth^%lBx6#omL_$vq&FZG6zN)fetsnpN>67iW zJ~%kIwYAlg!IX0D+y@1P1n&GU>h*dX>T+|c+wO0h9f$Wk-(^ez$N?s(v(u2o^ibvK z(W5E(D=QCXX1-Zjd2sjcou7ZYSJyPZ09YIC!?vu3l|Z0@4dl+K-j2ie%z=%$-<4lth!lV#=5 z{Lr%zw}08L*VlkoCJ#00j$%_X#x)d}JGS#~Zo4b5I|-{1d;p zEl-C4b`L>K!!#Kg(7=hnCI{a-bsCoE`sxqI zve694zu)2#`HT)&12kP8Uw{E?non|$4e+pO<|O}E&3k6>%|SoU*56xPF*^eiv04OM zlEzIH$tJS`U6UJ_!X*a?3pDc_Xp;L9fWgcOb8Pvduj-ah4^AxVpo0z7Zq~BVthQ8J z|KlGn5vT%lX%OHnd`g9({KpPE+g07Fu8b^bjk($x%E%0Z+z5sRaHHt)9TkRpHvjVD z>cioVM^Wu&4e%soqnSZ!OQ8m+E!Eb4S*tL_9KG34#3UlNqrQxhY%=qXw$57M%w(}c zM&_yM!G=n*3zd~#rs}|MXG1AN`Hbdh3m=E+jiI*l(?%@?8*2BmJlE)D{v*)tWl_?a z-o4C&1Mg+k9pt%I7y@>+q2A7+)Pkj>vM6jQWhi|icwYz3dSFPzRzI$L{K0=t3BQEe z9sHMvi3Cu887j^pN5YWpeZIYr=;o#{pnls>A^!`8M643h8%CrIu=^z;ruJT@y5~P; zJ&28oqUdG)gyVzyikJOg#DMFs0nz4VeLjH*;YZ|x&9w{Kf(S65euhldvy7P2fG9UUDT8=IY-y>{)| z;^N}$?CkjXc)ect&x;o?o;hQoUI z0&FY7)YO+RPJRy}V&k49WWCi*Ok8Nq{+CJrSgc$Ll=lrv*8>5U4ouBg1mpk9VnROV zv(kShEiN9UC9NH=Mey-nXl+fwqyrUKK||Z^g{dHD-)N*HrjpA&#kmx~6?Y7+qe_M( z$<_OJe<9HV$T^oHXuneNSVe5SG%1~;^we c #B6B6B4", +", c #B6B2B4", +"' c #B2B2AC", +") c #AEAEAC", +"! c #AAAAAC", +"~ c #A6A6A4", +"{ c #A2A2A4", +"] c #A2A29C", +"^ c #9E9E9C", +"/ c #9A9A9C", +"( c #969694", +"_ c #92928C", +": c #8E8E8C", +"< c #8A8A8C", +"[ c #424244", +"} c #CAC6C4", +"| c #C2BEBC", +"1 c #B2B2B4", +"2 c #A6A2A4", +"3 c #A29EA4", +"4 c #929294", +"5 c #C2C6C4", +"6 c #7A7A74", +"7 c #4A4A4C", +"8 c #4E4E4C", +"9 c #464A44", +"0 c #464644", +"a c #3D3D3D", +"b c #404040", +"c c #7A7A7C", +"d c #020204", +"e c #060604", +"f c #000000", +"g c #E7E7E7", +"h c #979797", +"i c #BCBCBC", +"j c #B7B6B4", +"k c #C3C2C2", +"l c #191919", +"m c #7E7E84", +"n c #767674", +"o c #080808", +"p c #010103", +"q c #027204", +"r c #02CE04", +"s c #129614", +"t c #0BB20C", +"u c #005600", +"v c #02A604", +"w c #06C20C", +"x c #022604", +"y c #727274", +"z c #129A14", +"A c #1A7A1C", +"B c #025C04", +"C c #026C04", +"D c #028C02", +"E c #06BD0C", +"F c #0A220C", +"G c #727674", +"H c #6E6E6C", +"I c #061304", +"J c #6A6A6C", +"K c #BABEBC", +"L c #12A614", +"M c #007001", +"N c #006300", +"O c #016B02", +"P c #005C00", +"Q c #05AA05", +"R c #666A64", +"S c #666664", +"T c #626264", +"U c #5E5E5C", +"V c #AEB2B4", +"W c #625E64", +"X c #565654", +"Y c #565A54", +"Z c #525654", +"` c #A2A6A4", +" . c #525254", +".. c #4A4E4C", +"+. c #4E4A4C", +"@. c #D7D7D7", +"#. c #9F9F9F", +"$. c #BFBFBF", +"%. c #B7B7B7", +"&. c #A7A7A7", +"*. c #8F8F8F", +"=. c #7F7F7F", +"-. c #6E726C", +";. c #56565C", +">. c #4E524C", +". . . + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ ", +"# $ $ % & & * * = - - - ; > , ' ' ) ) ! ! ~ ! ~ { ] ] ^ ^ / / / ( ( ( _ _ : : < < < + + + . # [ ", +"# $ } $ & & * * | = = - ; > , 1 , ' ) ) ! ~ ! ~ ~ 2 2 ^ 3 ^ / / / ( ( 4 4 : _ : < < < + + . # [ ", +"+ $ $ % % 5 * | = = - - - ; > , 1 1 ) ) ) ! ~ ~ 2 { ] ] ^ ^ / / ( ( ( ( 4 _ : : < < < + + + 6 [ ", +". $ } [ [ [ [ [ [ 7 8 7 9 0 [ a a a a a a b a a a a a a a a a a a a a a a a a a a a a a # # c [ ", +". $ 5 [ d d d d d e d d d d d e d d d d d d d d d d d d d e d d d f f f f f f f f f f f # # 6 [ ", +"+ $ * [ d d d d d d d d d d d e d e d g h g i j d g k l d d d d d d d f f f f f f f f f m c n [ ", +". % * [ d d d d d d d d d d d f f f f f f f f f f o d d d d d d p f f f f f f f f f f f . c n [ ", +". % * [ d d d d d d d d d d d f f f f f f f f f f f f q r r r r s t s u u t q v v w f f . c n [ ", +". & = [ d d d d d d d d d d d f f f f f f f f f f f f d d d d d f x d e d d d d d d d d # 6 y [ ", +". * = [ d d d d d d d d d d d f f f f f f f f f f f f q r z t s A u u B C t q D E v f f m n y [ ", +". * - [ d d d d d d d d d d d f f f f f f f f f f f f d d d d d e f F d d d d d x f e d . n y [ ", +". * - [ d d d d d d d d d d d f f f f f f f f f f f f q r r s t r r s B q t q D E r f f . G H [ ", +". = - [ d d d d d d d d d d d f f f f f f f f f f f f d d d d d d e d d d d d d d d d d # y H [ ", +". - - [ d d d d d d d d d d d f f f f f f f f f f d d d d d d e d d d d d d d d d d I f # H H [ ", +". = > [ d d d d d f f f f d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . y J [ ", +". K > [ d d d d f L r r M r N O O N O O N N O P M u d u D Q Q Q D d d d d d d d d d d d # H J [ ", +". - > [ d d d f f d d d f d d d d d d d f f f f f f d d d d d d d d d d d d d d d d d d . J R [ ", +"# - 1 [ d d d f f L r L M r r M M r r d N N O P M u f f f f f f f d d d d d d d d d d d . J S [ ", +". ; ' [ d d d d f d d d d d f d d d d d f f f f f f d d d d d d d d d d d d d d d d d d # H S [ ", +". > 1 [ d d f f f L L r L r r L L r r L N N O P M u d u D Q Q Q D d d d d d d d d d d d # J S [ ", +"# 1 ) [ d d d f d d f f f f f d d d d d f f f f f f d d d d d d d d d d d d d d d d d d . J T [ ", +". ' ) [ d d d d d L L r L r N N O P M u N N O P M u d u D Q Q Q D d d d d d d d d d d d # S T [ ", +"# 1 ) [ d d d d f d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . T U [ ", +"# V ! [ d d d f f L L r L r r L L r r L N N O P M u d u D Q Q Q D d d d d d d d d d d d . T U [ ", +"m ) ! [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # T U [ ", +"# ) ! [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . W U [ ", +"# ! ~ [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # T @ [ ", +"# ! ~ [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # U @ [ ", +"# ! ] [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . U X [ ", +"# ! { [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . @ X [ ", +"c ~ ] [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # @ X [ ", +"c ~ { [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . Y Z [ ", +"# ` ^ [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # X .[ ", +"c { ^ [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d m @ .[ ", +"c { / [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . .8 [ ", +"c { / [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . .8 [ ", +"6 ^ / [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # .8 [ ", +"c ^ / [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d . 8 ..[ ", +"6 / ( [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # .+.[ ", +"6 ^ ( [ d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d # 8 7 [ ", +"6 / _ [ f @.#.$.d d d d d d d d d d d d d d f f f f %.$.&.$.*.=.&.@.=.f @.=.$.=.$.=.@.f . 8 7 [ ", +"n / _ [ d d d d d d d d d d d d d d d d d d f f f f f f f f f f f f f f f f f f f f f f # +.0 [ ", +"-.( 4 0 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # . 7 0 [ ", +"J ( : 4 : : < < + + + . . # # c c c n n G y -.H H J J S S S T T U U @ @ @ ;.X Z .>.8 7 7 7 0 0 ", +"S 4 4 : : < : < < + . . # . # # c 6 n n y y H -.J H J R S T T T T U U @ Y X Z .>.8 >.8 7 7 0 0 ", +"T ( 4 4 : < < < + + . . # # c c c n n n G y H H J R J S S T T U U U @ @ @ X X . .8 8 ..7 7 0 0 ", +"@ 4 4 : : : < < + + + . . . # # c c n n y y -.H H J J R S S T T T U U @ @ ;.X X . .8 7 ..7 0 0 "}; diff --git a/tn5250-62x48.png b/tn5250-62x48.png new file mode 100644 index 0000000000000000000000000000000000000000..70ce80897f794a87a6f5fc33225a6d8b82429199 GIT binary patch literal 1528 zcmV>du`z0EkE_1%R2E8HuH3rIb=iM2IMkW7}9n@^8Bv+n#NG z+Bk2vpSaL84FHND+-x@IznqWbxT75rjgOC)N+kfs z82g(}Vm>f>TB%g(?sG7^c=4h>rY)14>mtm;42hy>b#?XN@5jcpF`boK13-6uPt!VU z$z1Fk0Kn|*Y)NYi832N%4vQRypS5oPMEKOHH*I-q>&fEcH(Ogz?%n(C*I$0NHGfp^ zpE>i^0X-Bqu~VI*&di)V4`51>F;Ns50B6sh1#tcP_4KW+@jS1GAN`N$lqThRqFaSf z?>WW0ySoQ}6^0=I`a)watDIPyXibL4H@%%|1Hfx@C!5s}7XUy{dj11X?|AjE>TM(D zT-721W?>c{5cNK60a(bMcDO+w=;q^aOlxD%TnW=x24Mps06l@|Sq?a1&W9;Gs{i+{ ze-6yS|I=@k!{eKtx9L57yoni@F%2K%A9>Ach;ytzJYlv&{?q_4yE@-Nx-cP882d0J z)B^+nnh3Q9BAj^dWcYUop!uyuoy_|o|7EO{b)haIEU^I4;+|!IpcxEx0REcanhcwh zAwhd-Dq+L8Z*A4~`ShQIUR8Lq*>574y|09*h*LkH@-+!I~G1h89h*qo1b%n#! zq8=b1lyDc!#xeeG(&9UGpx!eiL`3@W8$h~sLT*Va8m1O?02cUQIv{9&!_@%rH~gL7 z8y%=)1>Ia%H>qFB2wU&dFl7+|7t?hj9n1w*WOmSS^FZ0c5g@Q|cXOSW4YExc0l+EX zc|Wc@AqSEiCd+9CK%Ey2!?a=iI`&6hrKsa3_2oB`1B;aFR$&;0#W7VFyC`-mOltX> zZiVU3YlpgvQ;T|*^$vzQfJ3>ypRNx=n6@yryf3_(cA%awz$s6UdFYLL--MBDZ<;@) z8DIv7Y$5_d`)b-xA~0I-S=`YgImr7-1V-sMy8|Gk;y9$O#!H*shgxAL*fg>*VMgtG zw(#e|bO^homo~Q~rKex%3G%2NJKXY1(h(y}vWspf%#lDHa7O}22xFOl1YBosCk)ta zH%9H);U*#?ai%bdu8-QULaw`m7o=fo|IMf!JKUHvZl_xf9{7BH$d(;umq9_r0@qPdH?b`=`-0x-LE4+M!lksG48buMuF*6g<<;$1Ti}to# z@8q7l?eaUjRqt^>p5;Xfv5E6F`?T(H#h%@-=Nmu(92+}EdwY8$nfjMEYPDLU_F+)h eUm+2PZ2tngf-t(&jpMKY0000 c #A9AAAC", +", c #A6A6A4", +"' c #A3A2A1", +") c #9C9C9C", +"! c #A29EA4", +"~ c #969694", +"{ c #929292", +"] c #8C8C8C", +"^ c #3C3C3C", +"/ c #434344", +"( c #AAA6A4", +"_ c #494A4B", +": c #4E4E4C", +"< c #7A7A7B", +"[ c #020204", +"} c #060604", +"| c #000000", +"1 c #767674", +"2 c #7A7E7C", +"3 c #010102", +"4 c #151517", +"5 c #E7E7E7", +"6 c #979797", +"7 c #191919", +"8 c #111111", +"9 c #080808", +"0 c #010103", +"a c #727274", +"b c #027204", +"c c #02CE04", +"d c #129614", +"e c #0BB20C", +"f c #005600", +"g c #02A604", +"h c #06C20C", +"i c #168C14", +"j c #1A7A1C", +"k c #022604", +"l c #061304", +"m c #129A14", +"n c #025C04", +"o c #026C04", +"p c #028C02", +"q c #06BD0C", +"r c #727674", +"s c #0A220C", +"t c #6E6E6E", +"u c #061A04", +"v c #1A1A1C", +"w c #1A1A1A", +"x c #12A614", +"y c #007001", +"z c #006300", +"A c #016B02", +"B c #005C00", +"C c #05AA05", +"D c #6A6A6B", +"E c #024204", +"F c #646464", +"G c #5E5E5D", +"H c #565654", +"I c #525654", +"J c #515253", +"K c #D7D7D7", +"L c #9F9F9F", +"M c #BFBFBF", +"N c #AFAFAF", +"O c #7F7F7F", +"P c #A7A7A7", +"Q c #8F8F8F", +"R c #6A6E6C", +"..........+++....+..+++..+++.......+++++++......+++++++....++@", +"+#$$#%&&&******===-----;;;;>,,,''')'!)))))~~{{{]{{]]]]]......^", +".##$%%&&&%&**=*=*===--;;;>;>>,,,'''''')))~~~~{{{]{{]]]]]...../", +".$$%%&&&&*****=*==---;-;>;>>((,'''))))))~)~~~~{]~]]]]]...]..+^", +".$%*//^^/^//__:__////^^/^^^^^//^///^/^^^^^/^^//^/^^^^///^<++^[[[[[[[[[[[[||||[[[[[[[[[[[[[[[[[[[[[}[[[[[[[[[[[[[[1att^", +".**>^[[[[[[[[[[[|xccyczAAzAAzzAByf[fpCCCp[[[[[[[[[[[[[[[[1aDD/", +"+==;^[[[[[[[[[[[|[[[|[[[[[[[||||||[[[[[[[[[[[[[[[[[[[[[[[attD^", +".*=>^[[[[[[[[[[[|xcxyccyycc[zzAByf|||||||[E[[[[[[[[[[[[[[aDDD/", +"2==>^[[[[[[[[[[[|[[[[[|[[[[[||||||[[[[[[[[[[[[[[[[[[[[[[[1ttF^", +"+-->^[[[[[[[[[[[|xxcxccxxccxzzAByf[fpCCCp[[[[[[[[[[[[[[[[rDDF/", +".=-'^[[[[[[[[[[[[[|||||[[[[[||||||[[[[[[[[E[[[[[[[[[[[[[[aDFD^", +"2--,^[[[[[[[[[[[[xxcxczzAByfzzAByf[fpCCCp[[[[[[[[[[[[[[[[1DFF/", +"+;;'^[[[[[[[[[[[|[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[aFGF^", +".-;,^[[[[[[[[[[[|xxcxccxxccxzzAByf[fpCCCp[E[[[[[[[[[[[[[[aFFF/", +"+;;!^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1FGG^", +"+;;'^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1F@G/", +"+>,)^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1FGG^", +"+>>)^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[rF@@/", +"<>>)^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1G@@^", +"+(,)^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1G@@/", +"<,,)^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[aG@H^", +"<',~^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1@HH/", +"2,))^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[a@HI^", +"<'!~^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[a@JJ/", +"<''~^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1HJJ^", +"<))~^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1HJJ/", +"<)!]^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1H::^", +"2)){^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1H::/", +"1))]^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1J::^", +"1))]^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[1:__/", +"1)~{^[KLM|||||||||||||||||||||||||KNOMPMQOPKO|KOMOMOK||||aJ__^", +"1~~]^[|||||||||||||||||||||||||||||||||||||||||||||||||||1:__/", +"a~{]_+++++++++++++++++++++++++++++++++++++++++++++++++++++:__^", +"R~]]]]]]].....+.2++<<<111aaattttDDFFFFGFFGGG@@@IHIJJJ:::___/_/", +"F{~{]]]]]].]....++<2<1<1a1atatRDDFDFFFFFGGG@@@I@HJHJ:J::::____", +"G{]~{]].]].]...++++<<<111rraaRtttDRFFFFGFGGG@@@HHHIHJJ::___///", +"G~~]]]]]]....+..++<2