URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/or1k/trunk/uclinux/uC-libc/gtermcap
- from Rev 199 to Rev 1765
- ↔ Reverse comparison
Rev 199 → Rev 1765
/tparam.c
0,0 → 1,330
/* Merge parameters into a termcap entry string. |
Copyright (C) 1985, 1987, 1993 Free Software Foundation, Inc. |
|
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
|
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
|
You should have received a copy of the GNU General Public License |
along with this program; see the file COPYING. If not, write to |
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
/* Emacs config.h may rename various library functions such as malloc. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#else /* not HAVE_CONFIG_H */ |
|
#ifdef __linux__ |
#undef STDC_HEADERS |
#define STDC_HEADERS |
#define HAVE_UNISTD_H |
#if defined(HAVE_STRING_H) || defined(STDC_HEADERS) |
#define bcopy(s, d, n) memcpy ((d), (s), (n)) |
#endif |
#endif |
|
#ifdef STDC_HEADERS |
#include <stdlib.h> |
#include <string.h> |
#else |
char *malloc (); |
char *realloc (); |
#endif |
|
#endif /* not HAVE_CONFIG_H */ |
|
#ifndef NULL |
#define NULL (char *) 0 |
#endif |
|
#ifndef emacs |
static void |
memory_out () |
{ |
write (2, "virtual memory exhausted\n", 25); |
exit (1); |
} |
|
static char * |
xmalloc (size) |
unsigned size; |
{ |
register char *tem = malloc (size); |
|
if (!tem) |
memory_out (); |
return tem; |
} |
|
static char * |
xrealloc (ptr, size) |
char *ptr; |
unsigned size; |
{ |
register char *tem = realloc (ptr, size); |
|
if (!tem) |
memory_out (); |
return tem; |
} |
#endif /* not emacs */ |
|
/* Assuming STRING is the value of a termcap string entry |
containing `%' constructs to expand parameters, |
merge in parameter values and store result in block OUTSTRING points to. |
LEN is the length of OUTSTRING. If more space is needed, |
a block is allocated with `malloc'. |
|
The value returned is the address of the resulting string. |
This may be OUTSTRING or may be the address of a block got with `malloc'. |
In the latter case, the caller must free the block. |
|
The fourth and following args to tparam serve as the parameter values. */ |
|
static char *tparam1 (); |
|
/* VARARGS 2 */ |
char * |
tparam (string, outstring, len, arg0, arg1, arg2, arg3) |
char *string; |
char *outstring; |
int len; |
int arg0, arg1, arg2, arg3; |
{ |
#ifdef NO_ARG_ARRAY |
int arg[4]; |
arg[0] = arg0; |
arg[1] = arg1; |
arg[2] = arg2; |
arg[3] = arg3; |
return tparam1 (string, outstring, len, NULL, NULL, arg); |
#else |
return tparam1 (string, outstring, len, NULL, NULL, &arg0); |
#endif |
} |
|
char *BC; |
char *UP; |
|
static char tgoto_buf[50]; |
|
char * |
tgoto (cm, hpos, vpos) |
char *cm; |
int hpos, vpos; |
{ |
int args[2]; |
if (!cm) |
return NULL; |
args[0] = vpos; |
args[1] = hpos; |
return tparam1 (cm, tgoto_buf, 50, UP, BC, args); |
} |
|
static char * |
tparam1 (string, outstring, len, up, left, argp) |
char *string; |
char *outstring; |
int len; |
char *up, *left; |
register int *argp; |
{ |
register int c; |
register char *p = string; |
register char *op = outstring; |
char *outend; |
int outlen = 0; |
|
register int tem; |
int *old_argp = argp; |
int doleft = 0; |
int doup = 0; |
|
outend = outstring + len; |
|
while (1) |
{ |
/* If the buffer might be too short, make it bigger. */ |
if (op + 5 >= outend) |
{ |
register char *new; |
if (outlen == 0) |
{ |
outlen = len + 40; |
new = (char *) xmalloc (outlen); |
outend += 40; |
bcopy (outstring, new, op - outstring); |
} |
else |
{ |
outend += outlen; |
outlen *= 2; |
new = (char *) xrealloc (outstring, outlen); |
} |
op += new - outstring; |
outend += new - outstring; |
outstring = new; |
} |
c = *p++; |
if (!c) |
break; |
if (c == '%') |
{ |
c = *p++; |
tem = *argp; |
switch (c) |
{ |
case 'd': /* %d means output in decimal. */ |
if (tem < 10) |
goto onedigit; |
if (tem < 100) |
goto twodigit; |
case '3': /* %3 means output in decimal, 3 digits. */ |
if (tem > 999) |
{ |
*op++ = tem / 1000 + '0'; |
tem %= 1000; |
} |
*op++ = tem / 100 + '0'; |
case '2': /* %2 means output in decimal, 2 digits. */ |
twodigit: |
tem %= 100; |
*op++ = tem / 10 + '0'; |
onedigit: |
*op++ = tem % 10 + '0'; |
argp++; |
break; |
|
case 'C': |
/* For c-100: print quotient of value by 96, if nonzero, |
then do like %+. */ |
if (tem >= 96) |
{ |
*op++ = tem / 96; |
tem %= 96; |
} |
case '+': /* %+x means add character code of char x. */ |
tem += *p++; |
case '.': /* %. means output as character. */ |
if (left) |
{ |
/* If want to forbid output of 0 and \n and \t, |
and this is one of them, increment it. */ |
while (tem == 0 || tem == '\n' || tem == '\t') |
{ |
tem++; |
if (argp == old_argp) |
doup++, outend -= strlen (up); |
else |
doleft++, outend -= strlen (left); |
} |
} |
*op++ = tem ? tem : 0200; |
case 'f': /* %f means discard next arg. */ |
argp++; |
break; |
|
case 'b': /* %b means back up one arg (and re-use it). */ |
argp--; |
break; |
|
case 'r': /* %r means interchange following two args. */ |
argp[0] = argp[1]; |
argp[1] = tem; |
old_argp++; |
break; |
|
case '>': /* %>xy means if arg is > char code of x, */ |
if (argp[0] > *p++) /* then add char code of y to the arg, */ |
argp[0] += *p; /* and in any case don't output. */ |
p++; /* Leave the arg to be output later. */ |
break; |
|
case 'a': /* %a means arithmetic. */ |
/* Next character says what operation. |
Add or subtract either a constant or some other arg. */ |
/* First following character is + to add or - to subtract |
or = to assign. */ |
/* Next following char is 'p' and an arg spec |
(0100 plus position of that arg relative to this one) |
or 'c' and a constant stored in a character. */ |
tem = p[2] & 0177; |
if (p[1] == 'p') |
tem = argp[tem - 0100]; |
if (p[0] == '-') |
argp[0] -= tem; |
else if (p[0] == '+') |
argp[0] += tem; |
else if (p[0] == '*') |
argp[0] *= tem; |
else if (p[0] == '/') |
argp[0] /= tem; |
else |
argp[0] = tem; |
|
p += 3; |
break; |
|
case 'i': /* %i means add one to arg, */ |
argp[0] ++; /* and leave it to be output later. */ |
argp[1] ++; /* Increment the following arg, too! */ |
break; |
|
case '%': /* %% means output %; no arg. */ |
goto ordinary; |
|
case 'n': /* %n means xor each of next two args with 140. */ |
argp[0] ^= 0140; |
argp[1] ^= 0140; |
break; |
|
case 'm': /* %m means xor each of next two args with 177. */ |
argp[0] ^= 0177; |
argp[1] ^= 0177; |
break; |
|
case 'B': /* %B means express arg as BCD char code. */ |
argp[0] += 6 * (tem / 10); |
break; |
|
case 'D': /* %D means weird Delta Data transformation. */ |
argp[0] -= 2 * (tem % 16); |
break; |
} |
} |
else |
/* Ordinary character in the argument string. */ |
ordinary: |
*op++ = c; |
} |
*op = 0; |
while (doup-- > 0) |
strcat (op, up); |
while (doleft-- > 0) |
strcat (op, left); |
return outstring; |
} |
|
#ifdef DEBUG |
|
main (argc, argv) |
int argc; |
char **argv; |
{ |
char buf[50]; |
int args[3]; |
args[0] = atoi (argv[2]); |
args[1] = atoi (argv[3]); |
args[2] = atoi (argv[4]); |
tparam1 (argv[1], buf, "LEFT", "UP", args); |
printf ("%s\n", buf); |
return 0; |
} |
|
#endif /* DEBUG */ |
/version.c
0,0 → 1,2
/* Make the library identifiable with the RCS ident command. */ |
static char *version_string = "\n$Version: GNU termcap 1.2.2 $\n"; |
/ChangeLog
0,0 → 1,52
Sat Apr 17 13:50:10 1993 H.J. Lu (hlu@nighthawk) |
|
* modify termcap.c and tparam.c for Linux. |
|
Thu Apr 15 12:45:10 1993 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu) |
|
* Version 1.2. |
|
* tparam.c [!emacs] (xmalloc, xrealloc, memory_out): New functions. |
(tparam1): Use them. |
|
* termcap.c, tparam.c: Use NULL or '\0' where appropriate |
instead of 0. Rename some vars. |
* termcap.c (tgetent): If EOF is reached on termcap file, |
free allocated resources before returning. |
|
* termcap.c (tgetent): Use /etc/termcap if TERMCAP is an entry |
for a term type other than TERM. |
From pjr@jet.UK (Paul J Rippin). |
|
Sat Apr 10 23:55:12 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) |
|
* tparam.c (tparam1): Don't set the 0200 bit on a non-0 character code. |
From junio@twinsun.COM (Junio Hamano). |
|
Tue Dec 8 22:02:15 1992 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu) |
|
* termcap.c, tparam.c: Use HAVE_STRING_H instead of USG. |
|
Thu Dec 3 13:47:56 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu) |
|
* termcap.c, tparam.c [HAVE_CONFIG_H]: Include config.h. |
|
Fri Oct 23 12:35:29 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu) |
|
* termcap.h [__STDC__]: Add consts. From Franc,ois Pinard. |
|
Tue Oct 13 15:52:21 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu) |
|
* Version 1.1. |
|
Tue Sep 29 21:04:39 1992 David J. MacKenzie (djm@geech.gnu.ai.mit.edu) |
|
* termcap.[ch], tparam.c: Fix some lint. |
|
* version.c: New file. |
|
Local Variables: |
mode: indented-text |
left-margin: 8 |
version-control: never |
End: |
/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. |
|
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) 19yy <name of author> |
|
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
|
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
|
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
Also add information on how to contact you by electronic and paper mail. |
|
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
|
Gnomovision version 69, Copyright (C) 19yy name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
|
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
|
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
|
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
|
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/NEWS
0,0 → 1,12
Major changes in release 1.2: |
|
For `%.', only set the high bit on NUL. |
Fix a file descriptor and memory leak. |
Add const in termcap.h prototypes. |
Configuration improvements. |
|
Major changes in release 1.1: |
|
Fix portability problems. |
Improve configuration and installation. |
Fix compiler warnings. |
/termcap.c
0,0 → 1,827
/* Work-alike for termcap, plus extra features. |
Copyright (C) 1985, 1986, 1993 Free Software Foundation, Inc. |
|
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
|
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
|
You should have received a copy of the GNU General Public License |
along with this program; see the file COPYING. If not, write to |
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
/* Emacs config.h may rename various library functions such as malloc. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#else /* not HAVE_CONFIG_H */ |
|
#ifdef __linux__ |
#undef STDC_HEADERS |
#define STDC_HEADERS |
#define HAVE_UNISTD_H |
#define HAVE_SYS_IOCTL_H |
#else |
#if defined(HAVE_STRING_H) || defined(STDC_HEADERS) |
#define bcopy(s, d, n) memcpy ((d), (s), (n)) |
#endif |
#endif |
|
#ifdef STDC_HEADERS |
#include <stdlib.h> |
#include <string.h> |
#else |
char *getenv (); |
char *malloc (); |
char *realloc (); |
#endif |
|
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef _POSIX_VERSION |
#include <fcntl.h> |
#endif |
|
#ifdef HAVE_SYS_IOCTL_H |
#include <stdio.h> |
#include <sys/ioctl.h> |
#endif |
|
#endif /* not HAVE_CONFIG_H */ |
|
#ifndef NULL |
#define NULL (char *) 0 |
#endif |
|
/* BUFSIZE is the initial size allocated for the buffer |
for reading the termcap file. |
It is not a limit. |
Make it large normally for speed. |
Make it variable when debugging, so can exercise |
increasing the space dynamically. */ |
|
#ifndef BUFSIZE |
#ifdef DEBUG |
#define BUFSIZE bufsize |
|
int bufsize = 128; |
#else |
#define BUFSIZE 2048 |
#endif |
#endif |
|
#ifdef TIOCGWINSZ |
#define ADJUST_WIN_EXTENT |
#endif |
|
#ifndef emacs |
static void |
memory_out () |
{ |
write (2, "virtual memory exhausted\n", 25); |
exit (1); |
} |
|
static char * |
xmalloc (size) |
unsigned size; |
{ |
register char *tem = malloc (size); |
|
if (!tem) |
memory_out (); |
return tem; |
} |
|
static char * |
xrealloc (ptr, size) |
char *ptr; |
unsigned size; |
{ |
register char *tem = realloc (ptr, size); |
|
if (!tem) |
memory_out (); |
return tem; |
} |
#endif /* not emacs */ |
|
/* Looking up capabilities in the entry already found. */ |
|
/* The pointer to the data made by tgetent is left here |
for tgetnum, tgetflag and tgetstr to find. */ |
static char *term_entry; |
|
static char *tgetst1 (); |
|
/* Search entry BP for capability CAP. |
Return a pointer to the capability (in BP) if found, |
0 if not found. */ |
|
static char * |
find_capability (bp, cap) |
register char *bp, *cap; |
{ |
for (; *bp; bp++) |
if (bp[0] == ':' |
&& bp[1] == cap[0] |
&& bp[2] == cap[1]) |
return &bp[4]; |
return NULL; |
} |
|
int |
tgetnum (cap) |
char *cap; |
{ |
register char *ptr = find_capability (term_entry, cap); |
if (!ptr || ptr[-1] != '#') |
return -1; |
return atoi (ptr); |
} |
|
int |
tgetflag (cap) |
char *cap; |
{ |
register char *ptr = find_capability (term_entry, cap); |
return ptr && ptr[-1] == ':'; |
} |
|
/* Look up a string-valued capability CAP. |
If AREA is non-null, it points to a pointer to a block in which |
to store the string. That pointer is advanced over the space used. |
If AREA is null, space is allocated with `malloc'. */ |
|
char * |
tgetstr (cap, area) |
char *cap; |
char **area; |
{ |
register char *ptr = find_capability (term_entry, cap); |
if (!ptr || (ptr[-1] != '=' && ptr[-1] != '~')) |
return NULL; |
return tgetst1 (ptr, area); |
} |
|
/* Table, indexed by a character in range 0100 to 0140 with 0100 subtracted, |
gives meaning of character following \, or a space if no special meaning. |
Eight characters per line within the string. */ |
|
static char esctab[] |
= " \007\010 \033\014 \ |
\012 \ |
\015 \011 \013 \ |
"; |
|
/* PTR points to a string value inside a termcap entry. |
Copy that value, processing \ and ^ abbreviations, |
into the block that *AREA points to, |
or to newly allocated storage if AREA is NULL. |
Return the address to which we copied the value, |
or NULL if PTR is NULL. */ |
|
static char * |
tgetst1 (ptr, area) |
char *ptr; |
char **area; |
{ |
register char *p, *r; |
register int c; |
register int size; |
char *ret; |
register int c1; |
|
if (!ptr) |
return NULL; |
|
/* `ret' gets address of where to store the string. */ |
if (!area) |
{ |
/* Compute size of block needed (may overestimate). */ |
p = ptr; |
while ((c = *p++) && c != ':' && c != '\n') |
; |
ret = (char *) xmalloc (p - ptr + 1); |
} |
else |
ret = *area; |
|
/* Copy the string value, stopping at null or colon. |
Also process ^ and \ abbreviations. */ |
p = ptr; |
r = ret; |
while ((c = *p++) && c != ':' && c != '\n') |
{ |
if (c == '^') |
c = *p++ & 037; |
else if (c == '\\') |
{ |
c = *p++; |
if (c >= '0' && c <= '7') |
{ |
c -= '0'; |
size = 0; |
|
while (++size < 3 && (c1 = *p) >= '0' && c1 <= '7') |
{ |
c *= 8; |
c += c1 - '0'; |
p++; |
} |
} |
else if (c >= 0100 && c < 0200) |
{ |
c1 = esctab[(c & ~040) - 0100]; |
if (c1 != ' ') |
c = c1; |
} |
} |
*r++ = c; |
} |
*r = '\0'; |
/* Update *AREA. */ |
if (area) |
*area = r + 1; |
return ret; |
} |
|
/* Outputting a string with padding. */ |
|
#ifdef __linux__ |
speed_t ospeed; |
#else |
short ospeed; |
#endif |
/* If OSPEED is 0, we use this as the actual baud rate. */ |
int tputs_baud_rate; |
char PC; |
|
/* Actual baud rate if positive; |
- baud rate / 100 if negative. */ |
|
static short speeds[] = |
{ |
#ifdef VMS |
0, 50, 75, 110, 134, 150, -3, -6, -12, -18, |
-20, -24, -36, -48, -72, -96, -192 |
#else /* not VMS */ |
0, 50, 75, 110, 135, 150, -2, -3, -6, -12, |
-18, -24, -48, -96, -192, -384 |
#endif /* not VMS */ |
}; |
|
void |
tputs (str, nlines, outfun) |
register char *str; |
int nlines; |
register int (*outfun) (); |
{ |
register int padcount = 0; |
register int speed; |
|
#ifdef emacs |
extern baud_rate; |
speed = baud_rate; |
#else |
if (ospeed == 0) |
speed = tputs_baud_rate; |
else |
speed = speeds[ospeed]; |
#endif |
|
if (!str) |
return; |
|
while (*str >= '0' && *str <= '9') |
{ |
padcount += *str++ - '0'; |
padcount *= 10; |
} |
if (*str == '.') |
{ |
str++; |
padcount += *str++ - '0'; |
} |
if (*str == '*') |
{ |
str++; |
padcount *= nlines; |
} |
while (*str) |
(*outfun) (*str++); |
|
/* padcount is now in units of tenths of msec. */ |
padcount *= speeds[ospeed]; |
padcount += 500; |
padcount /= 1000; |
if (speeds[ospeed] < 0) |
padcount = -padcount; |
else |
{ |
padcount += 50; |
padcount /= 100; |
} |
|
while (padcount-- > 0) |
(*outfun) (PC); |
} |
|
/* Finding the termcap entry in the termcap data base. */ |
|
struct buffer |
{ |
char *beg; |
int size; |
char *ptr; |
int ateof; |
int full; |
}; |
|
/* Forward declarations of static functions. */ |
|
static int scan_file (); |
static char *gobble_line (); |
static int compare_contin (); |
static int name_match (); |
|
#ifdef ADJUST_WIN_EXTENT |
#ifdef TIOCGWINSZ |
static int |
get_win_extent(li, co) |
int *li, *co; |
{ |
struct winsize ws; |
|
/* Some TIOCGWINSZ may be broken. Make sure ws.ws_row and |
* ws.ws_col are not zero. |
*/ |
if (ioctl(0, TIOCGWINSZ, &ws) != 0 || !ws.ws_row || !ws.ws_col) |
return -1; |
*li = ws.ws_row; |
*co = ws.ws_col; |
return 0; |
} |
#endif /* TIOCGWINSZ */ |
|
static int |
adjust_win_extent(bpp, howalloc, li, co) |
char **bpp; |
int howalloc; /* 0 must do in place, 1 must use malloc, 2 must use realloc */ |
int li, co; |
{ |
int licolen, o_len, t, colon; |
char *licobuf, *s; |
|
if (li < 0 || co < 0) |
return 0; |
for (s = *bpp, colon = -1; *s; ++s) |
if (*s == ':' && colon < 0) |
colon = s - *bpp; |
o_len = s - *bpp; |
licolen = 11; |
for (t = li; (t /= 10) > 0; ++licolen); |
for (t = co; (t /= 10) > 0; ++licolen); |
|
licobuf = xmalloc(licolen + 1); |
sprintf(licobuf, ":li#%d:co#%d:", li, co); |
|
if (howalloc == 0) |
{ |
bcopy(*bpp + colon, *bpp + colon + licolen, o_len - colon + 1); |
bcopy(licobuf, *bpp + colon, licolen); |
} |
else if (howalloc == 1) |
{ |
char *newbp; |
|
newbp = xmalloc(o_len + licolen + 1); |
bcopy(*bpp, newbp, colon); |
bcopy(licobuf, newbp + colon, licolen); |
strcpy(newbp + colon + licolen, *bpp + colon); |
*bpp = newbp; |
} |
else /* (howalloc == 2) */ |
{ |
char *newbp; |
|
newbp = xrealloc(*bpp, o_len + licolen + 1); |
bcopy(newbp + colon, newbp + colon + licolen, o_len - colon + 1); |
bcopy(licobuf, newbp + colon, licolen); |
*bpp = newbp; |
} |
|
free(licobuf); |
return 1; |
} |
#endif /* ADJUST_WIN_EXTENT */ |
|
#ifdef VMS |
|
#include <rmsdef.h> |
#include <fab.h> |
#include <nam.h> |
|
static int |
valid_filename_p (fn) |
char *fn; |
{ |
struct FAB fab = cc$rms_fab; |
struct NAM nam = cc$rms_nam; |
char esa[NAM$C_MAXRSS]; |
|
fab.fab$l_fna = fn; |
fab.fab$b_fns = strlen(fn); |
fab.fab$l_nam = &nam; |
fab.fab$l_fop = FAB$M_NAM; |
|
nam.nam$l_esa = esa; |
nam.nam$b_ess = sizeof esa; |
|
return SYS$PARSE(&fab, 0, 0) == RMS$_NORMAL; |
} |
|
#else /* !VMS */ |
|
#define valid_filename_p(fn) (*(fn) == '/') |
|
#endif /* !VMS */ |
|
/* Find the termcap entry data for terminal type NAME |
and store it in the block that BP points to. |
Record its address for future use. |
|
If BP is null, space is dynamically allocated. |
|
Return -1 if there is some difficulty accessing the data base |
of terminal types, |
0 if the data base is accessible but the type NAME is not defined |
in it, and some other value otherwise. */ |
|
int |
tgetent (bp, name) |
char *bp, *name; |
{ |
register char *termcap_name; |
register int fd; |
struct buffer buf; |
register char *bp1; |
char *bp2; |
char *term; |
int malloc_size = 0; |
register int c; |
char *tcenv; /* TERMCAP value, if it contains :tc=. */ |
char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */ |
int filep; |
#ifdef ADJUST_WIN_EXTENT |
int li, co; /* #lines and columns on this tty */ |
|
if (get_win_extent(&li, &co) != 0) |
li = co = -1; |
#endif /* ADJUST_WIN_EXTENT */ |
|
termcap_name = getenv ("TERMCAP"); |
if (termcap_name && *termcap_name == '\0') |
termcap_name = NULL; |
|
filep = termcap_name && valid_filename_p (termcap_name); |
|
/* If termcap_name is non-null and starts with / (in the un*x case, that is), |
it is a file name to use instead of /etc/termcap. |
If it is non-null and does not start with /, |
it is the entry itself, but only if |
the name the caller requested matches the TERM variable. */ |
|
if (termcap_name && !filep && !strcmp (name, getenv ("TERM"))) |
{ |
indirect = tgetst1 (find_capability (termcap_name, "tc"), (char **) 0); |
if (!indirect) |
{ |
if (!bp) |
{ |
bp = termcap_name; |
#ifdef ADJUST_WIN_EXTENT |
if (adjust_win_extent(&bp, 1, li, co)) |
malloc_size = 1; /* force return of bp */ |
#endif /* ADJUST_WIN_EXTENT */ |
} |
else |
{ |
strcpy (bp, termcap_name); |
#ifdef ADJUST_WIN_EXTENT |
adjust_win_extent(&bp, 0, li, co); |
#endif /* ADJUST_WIN_EXTENT */ |
} |
goto ret; |
} |
else |
{ /* It has tc=. Need to read /etc/termcap. */ |
tcenv = termcap_name; |
termcap_name = NULL; |
} |
} |
|
if (!termcap_name || !filep) |
#ifdef VMS |
termcap_name = "emacs_library:[etc]termcap.dat"; |
#else |
termcap_name = "/etc/termcap"; |
#endif |
|
/* Here we know we must search a file and termcap_name has its name. */ |
|
fd = open (termcap_name, 0, 0); |
if (fd < 0) |
return -1; |
|
buf.size = BUFSIZE; |
/* Add 1 to size to ensure room for terminating null. */ |
buf.beg = (char *) xmalloc (buf.size + 1); |
term = indirect ? indirect : name; |
|
if (!bp) |
{ |
malloc_size = indirect ? strlen (tcenv) + 1 : buf.size; |
bp = (char *) xmalloc (malloc_size); |
} |
bp1 = bp; |
|
if (indirect) |
/* Copy the data from the environment variable. */ |
{ |
strcpy (bp, tcenv); |
bp1 += strlen (tcenv); |
} |
|
while (term) |
{ |
/* Scan the file, reading it via buf, till find start of main entry. */ |
if (scan_file (term, fd, &buf) == 0) |
{ |
close (fd); |
free (buf.beg); |
if (malloc_size) |
free (bp); |
return 0; |
} |
|
/* Free old `term' if appropriate. */ |
if (term != name) |
free (term); |
|
/* If BP is malloc'd by us, make sure it is big enough. */ |
if (malloc_size) |
{ |
malloc_size = bp1 - bp + buf.size; |
termcap_name = (char *) xrealloc (bp, malloc_size); |
bp1 += termcap_name - bp; |
bp = termcap_name; |
} |
|
bp2 = bp1; |
|
/* Copy the line of the entry from buf into bp. */ |
termcap_name = buf.ptr; |
while ((*bp1++ = c = *termcap_name++) && c != '\n') |
/* Drop out any \ newline sequence. */ |
if (c == '\\' && *termcap_name == '\n') |
{ |
bp1--; |
termcap_name++; |
} |
*bp1 = '\0'; |
|
/* Does this entry refer to another terminal type's entry? |
If something is found, copy it into heap and null-terminate it. */ |
term = tgetst1 (find_capability (bp2, "tc"), (char **) 0); |
} |
|
close (fd); |
free (buf.beg); |
|
if (malloc_size) |
bp = (char *) xrealloc (bp, bp1 - bp + 1); |
#ifdef ADJUST_WIN_EXTENT |
adjust_win_extent(&bp, malloc_size ? 2 : 0, li, co); |
#endif /* ADJUST_WIN_EXTENT */ |
|
ret: |
term_entry = bp; |
if (malloc_size) |
return (int) bp; |
return 1; |
} |
|
/* Given file open on FD and buffer BUFP, |
scan the file from the beginning until a line is found |
that starts the entry for terminal type STR. |
Return 1 if successful, with that line in BUFP, |
or 0 if no entry is found in the file. */ |
|
static int |
scan_file (str, fd, bufp) |
char *str; |
int fd; |
register struct buffer *bufp; |
{ |
register char *end; |
|
bufp->ptr = bufp->beg; |
bufp->full = 0; |
bufp->ateof = 0; |
*bufp->ptr = '\0'; |
|
lseek (fd, 0L, 0); |
|
while (!bufp->ateof) |
{ |
/* Read a line into the buffer. */ |
end = NULL; |
do |
{ |
/* if it is continued, append another line to it, |
until a non-continued line ends. */ |
end = gobble_line (fd, bufp, end); |
} |
while (!bufp->ateof && end[-2] == '\\'); |
|
if (*bufp->ptr != '#' |
&& name_match (bufp->ptr, str)) |
return 1; |
|
/* Discard the line just processed. */ |
bufp->ptr = end; |
} |
return 0; |
} |
|
/* Return nonzero if NAME is one of the names specified |
by termcap entry LINE. */ |
|
static int |
name_match (line, name) |
char *line, *name; |
{ |
register char *tem; |
|
if (!compare_contin (line, name)) |
return 1; |
/* This line starts an entry. Is it the right one? */ |
for (tem = line; *tem && *tem != '\n' && *tem != ':'; tem++) |
if (*tem == '|' && !compare_contin (tem + 1, name)) |
return 1; |
|
return 0; |
} |
|
static int |
compare_contin (str1, str2) |
register char *str1, *str2; |
{ |
register int c1, c2; |
while (1) |
{ |
c1 = *str1++; |
c2 = *str2++; |
while (c1 == '\\' && *str1 == '\n') |
{ |
str1++; |
while ((c1 = *str1++) == ' ' || c1 == '\t'); |
} |
if (c2 == '\0') |
{ |
/* End of type being looked up. */ |
if (c1 == '|' || c1 == ':') |
/* If end of name in data base, we win. */ |
return 0; |
else |
return 1; |
} |
else if (c1 != c2) |
return 1; |
} |
} |
|
/* Make sure that the buffer <- BUFP contains a full line |
of the file open on FD, starting at the place BUFP->ptr |
points to. Can read more of the file, discard stuff before |
BUFP->ptr, or make the buffer bigger. |
|
Return the pointer to after the newline ending the line, |
or to the end of the file, if there is no newline to end it. |
|
Can also merge on continuation lines. If APPEND_END is |
non-null, it points past the newline of a line that is |
continued; we add another line onto it and regard the whole |
thing as one line. The caller decides when a line is continued. */ |
|
static char * |
gobble_line (fd, bufp, append_end) |
int fd; |
register struct buffer *bufp; |
char *append_end; |
{ |
register char *end; |
register int nread; |
register char *buf = bufp->beg; |
register char *tem; |
|
if (!append_end) |
append_end = bufp->ptr; |
|
while (1) |
{ |
end = append_end; |
while (*end && *end != '\n') end++; |
if (*end) |
break; |
if (bufp->ateof) |
return buf + bufp->full; |
if (bufp->ptr == buf) |
{ |
if (bufp->full == bufp->size) |
{ |
bufp->size *= 2; |
/* Add 1 to size to ensure room for terminating null. */ |
tem = (char *) xrealloc (buf, bufp->size + 1); |
bufp->ptr = (bufp->ptr - buf) + tem; |
append_end = (append_end - buf) + tem; |
bufp->beg = buf = tem; |
} |
} |
else |
{ |
append_end -= bufp->ptr - buf; |
bcopy (bufp->ptr, buf, bufp->full -= bufp->ptr - buf); |
bufp->ptr = buf; |
} |
if (!(nread = read (fd, buf + bufp->full, bufp->size - bufp->full))) |
bufp->ateof = 1; |
bufp->full += nread; |
buf[bufp->full] = '\0'; |
} |
return end + 1; |
} |
|
#ifdef TEST |
|
#ifdef NULL |
#undef NULL |
#endif |
|
#include <stdio.h> |
|
main (argc, argv) |
int argc; |
char **argv; |
{ |
char *term; |
char *buf; |
|
term = argv[1]; |
printf ("TERM: %s\n", term); |
|
buf = (char *) tgetent (0, term); |
if ((int) buf <= 0) |
{ |
printf ("No entry.\n"); |
return 0; |
} |
|
printf ("Entry: %s\n", buf); |
|
tprint ("cm"); |
tprint ("AL"); |
|
printf ("co: %d\n", tgetnum ("co")); |
printf ("am: %d\n", tgetflag ("am")); |
} |
|
tprint (cap) |
char *cap; |
{ |
char *x = tgetstr (cap, 0); |
register char *y; |
|
printf ("%s: ", cap); |
if (x) |
{ |
for (y = x; *y; y++) |
if (*y <= ' ' || *y == 0177) |
printf ("\\%0o", *y); |
else |
putchar (*y); |
free (x); |
} |
else |
printf ("none"); |
putchar ('\n'); |
} |
|
#endif /* TEST */ |
|
/Makefile
0,0 → 1,22
# Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> |
# This file is part of the Linux-8086 C library and is distributed |
# under the GNU Library General Public License. |
|
LIBC=../libc.a |
|
CC=or32-elf-gcc |
AR=or32-elf-ar |
RANLIB=or32-elf-ranlib |
|
CCFLAGS= -O2 -msoft-float -I../include |
|
CFLAGS=$(ARCH) $(CCFLAGS) $(DEFS) |
|
OBJ=termcap.o tparam.o |
|
all: $(LIBC)($(OBJ)) |
@$(RM) $(OBJ) |
|
clean: |
rm -f *.o libc.a |
|
/README
0,0 → 1,14
This is the GNU termcap library -- a library of C functions that |
enable programs to send control strings to terminals in a way |
independent of the terminal type. Most of this package is also |
distributed with GNU Emacs, but it is available in this separate |
distribution to make it easier to install as -ltermcap. |
|
The GNU termcap library does not place an arbitrary limit on the size |
of termcap entries, unlike most other termcap libraries. |
|
See the file INSTALL for compilation and installation instructions. |
|
Please report any bugs in this library to bug-gnu-emacs@prep.ai.mit.edu. |
You can check which version of the library you have by using the RCS |
`ident' command on libtermcap.a. |