mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-15 08:10:17 +02:00
Merge branch 'master' into boehm-demers-weiser-gc
Conflicts: libguile/Makefile.am libguile/coop-defs.h libguile/gc-card.c libguile/gc-freelist.c libguile/gc-malloc.c libguile/gc-mark.c libguile/gc-segment.c libguile/gc.c libguile/gc.h libguile/gc_os_dep.c libguile/hashtab.c libguile/hashtab.h libguile/inline.h libguile/private-gc.h libguile/struct.c libguile/struct.h libguile/threads.c libguile/threads.h libguile/vectors.h libguile/weaks.h test-suite/tests/gc.test
This commit is contained in:
commit
6f03035fe8
298 changed files with 15438 additions and 3275 deletions
|
@ -10,12 +10,10 @@ compile
|
|||
confdefs.h
|
||||
config.build-subdirs
|
||||
config.cache
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
conftest
|
||||
conftest.c
|
||||
|
@ -24,6 +22,7 @@ elisp-comp
|
|||
guile-*.tar.gz
|
||||
guile-tools
|
||||
install-sh
|
||||
lib
|
||||
libtool
|
||||
ltconfig
|
||||
ltmain.sh
|
||||
|
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -28,6 +28,7 @@ mdate-sh
|
|||
install-sh
|
||||
texinfo.tex
|
||||
*~
|
||||
,*
|
||||
BUGS
|
||||
Makefile
|
||||
Makefile.in
|
||||
|
@ -63,3 +64,9 @@ mkinstalldirs
|
|||
pre-inst-guile
|
||||
pre-inst-guile-env
|
||||
stamp-h1
|
||||
guile-procedures.txt
|
||||
guile-config/guile-config
|
||||
guile-readline/guile-readline-config.h
|
||||
guile-readline/guile-readline-config.h.in
|
||||
TAGS
|
||||
guile-1.8.pc
|
||||
|
|
0
COPYING
0
COPYING
504
COPYING.LESSER
Normal file
504
COPYING.LESSER
Normal file
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
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 and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, 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 library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete 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 distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
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 Library or any portion
|
||||
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
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 Library, 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 Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you 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.
|
||||
|
||||
If distribution of 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 satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be 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.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library 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.
|
||||
|
||||
9. 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 Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
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 with
|
||||
this License.
|
||||
|
||||
11. 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 Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library 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 Library.
|
||||
|
||||
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.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library 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.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser 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 Library
|
||||
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 Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
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
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "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
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. 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 LIBRARY 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
|
||||
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
154
ChangeLog
154
ChangeLog
|
@ -1,3 +1,157 @@
|
|||
2008-08-25 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in (GCC_CFLAGS): New variable. Store GCC flags like
|
||||
`-Werror' inside it so that they are not used when compiling
|
||||
Gnulib modules.
|
||||
|
||||
2008-08-21 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* autogen.sh: Don't use `gnulib-tool', use the Gnulib files
|
||||
available in the repository.
|
||||
|
||||
2008-08-07 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* configure.in (SCM_I_GSC_STACK_GROWS_UP): Remove use of
|
||||
AC_CACHE_CHECK, which was inadvertently causing
|
||||
SCM_I_GSC_STACK_GROWS_UP _always_ to be 0.
|
||||
|
||||
2008-07-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* configure.in: Update stack direction test to be like that in
|
||||
Autoconf _AC_LIBOBJ_ALLOCA and Gnulib; specifically in involving a
|
||||
function calling itself.
|
||||
|
||||
2008-07-16 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in: Look for `struct dirent64' and `readdir64_r ()',
|
||||
not available on HP-UX 11.11.
|
||||
|
||||
2008-07-06 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in: Update to Autoconf 2.61.
|
||||
|
||||
2008-06-28 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in: Use Automake with `-Wall -Wno-override'.
|
||||
|
||||
2008-05-07 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
Guile 1.8.5 released.
|
||||
|
||||
* GUILE-VERSION (LIBGUILE_INTERFACE_CURRENT): Increment due to
|
||||
the addition of an inlined version of `scm getc ()' and friends.
|
||||
(LIBGUILE_INTERFACE_AGE): Increment.
|
||||
(LIBGUILE_INTERFACE_REVISION): Zeroed.
|
||||
(LIBGUILE_SRFI_SRFI_1_INTERFACE_REVISION): Increment.
|
||||
|
||||
2008-05-04 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
Add `pkg-config' support. Suggested by Aaron VanDevender, Greg
|
||||
Troxel, and others.
|
||||
|
||||
* configure.in: Substitute `sitedir', produce `guile-1.8.pc'.
|
||||
* Makefile.am (EXTRA_DIST): Add `guile-1.8.pc.in'.
|
||||
(pkgconfigdir, pkgconfig_DATA): New.
|
||||
|
||||
2008-04-26 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in (BUILD_PTHREAD_SUPPORT): New Automake
|
||||
conditional.
|
||||
|
||||
2008-04-26 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* Makefile.am (EXTRA_DIST): Remove `ANON-CVS' and `SNAPSHOTS'.
|
||||
|
||||
2008-02-23 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* FAQ: New file.
|
||||
|
||||
* Makefile.am (EXTRA_DIST): Add FAQ
|
||||
|
||||
2008-02-22 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in: Check whether `strncasecmp' is declared.
|
||||
|
||||
2008-02-16 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
Guile 1.8.4 released.
|
||||
|
||||
* GUILE-VERSION (LIBGUILE_INTERFACE_REVISION): Increment.
|
||||
(GUILE_MICRO_VERSION): Increment.
|
||||
|
||||
* configure.in (GUILE_CFLAGS): Include `$CPPFLAGS' since they
|
||||
may include required `-I' flags (e.g., `-I/path/to/gmp'), so
|
||||
that "guile-config compile" reports all the needed flags.
|
||||
|
||||
2008-02-15 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* autogen.sh: Copy versions of config.guess and config.sub from
|
||||
Guile CVS to build-aux and guile-readline.
|
||||
|
||||
2008-02-14 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* HACKING: Note need for libtool >= 1.5.26.
|
||||
|
||||
* config.rpath, build-aux/config.rpath: Updated to latest upstream
|
||||
version.
|
||||
|
||||
* config.guess, config.sub: 2008-01-07 versions added to Guile
|
||||
CVS, to ensure that Guile developers are using new enough versions
|
||||
(in particular for AIX 6.1 support).
|
||||
|
||||
2008-02-11 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* configure.in (--without-64-calls): Use AC_MSG_CHECKING and
|
||||
AC_MSG_RESULT instead of just echo.
|
||||
(GUILE_I): New programs to try using _Complex_I or 1.0fi for the
|
||||
imaginary unit.
|
||||
|
||||
2008-02-06 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* configure.in: Default to --without-64-calls for
|
||||
powerpc-ibm-aix*. Thanks to Rainer Tammer for reporting that the
|
||||
64 calls are a problem on that OS.
|
||||
|
||||
2008-02-06 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* NEWS: Mention Sun Studio compilation fix.
|
||||
|
||||
2008-02-05 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* configure.in (--without-64-calls): New option.
|
||||
|
||||
2008-01-30 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* pre-inst-guile.in (dyld_prefix), pre-inst-guile-env.in
|
||||
(dyld_prefix): Construct and export dyld_prefix in a similar way
|
||||
to ltdl_prefix, to allow pre-install dynamic linking to work on
|
||||
MacOS. Thanks to Roger Mc Murtrie for reporting this problem.
|
||||
|
||||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* LICENSE: Change COPYING.LIB to COPYING.LESSER.
|
||||
|
||||
* COPYING.LESSER: Renamed, previously COPYING.LIB.
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
* libguile.h: Update copyright statement to LGPL.
|
||||
|
||||
2007-12-04 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* NEWS: Mention `accept' and `scm_c_{read,write}' bug fixes.
|
||||
|
||||
2007-12-03 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* NEWS: Add SRFI-69.
|
||||
|
||||
2007-10-24 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* .cvsignore: Add "lib".
|
||||
|
||||
* build-aux/.cvsignore: Add a load more generated files to ignore,
|
||||
and commit to CVS.
|
||||
|
||||
2007-10-20 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* THANKS: Add Julian.
|
||||
|
|
19
FAQ
Normal file
19
FAQ
Normal file
|
@ -0,0 +1,19 @@
|
|||
Guile FAQ -*- outline -*-
|
||||
|
||||
* Build problems
|
||||
|
||||
** readline.c: error: `rl_pending_input' undeclared
|
||||
|
||||
This occurs if the Readline library detected by Guile's configure
|
||||
script is actually the BSD Editline project's supposedly
|
||||
Readline-compatible library. The immediate fix is to uninstall
|
||||
Editline and install the real GNU Readline instead. When you do this,
|
||||
please note that it probably won't work to keep Editline in /usr and
|
||||
install GNU Readline in /usr/local (or some similar arrangement),
|
||||
because the Editline library will then still be picked up at link and
|
||||
run time; it's best (subject to other constraints) to remove Editline
|
||||
completely.
|
||||
|
||||
For the longer term, please also report this problem to the Editline
|
||||
project, to encourage them to fix it in the next release of their
|
||||
Readline compatibility library.
|
209
HACKING
209
HACKING
|
@ -1,6 +1,6 @@
|
|||
-*-text-*-
|
||||
Guile Hacking Guide
|
||||
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free software Foundation, Inc.
|
||||
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2008 Free software Foundation, Inc.
|
||||
|
||||
Permission is granted to anyone to make or distribute verbatim copies
|
||||
of this document as received, in any medium, provided that the
|
||||
|
@ -66,7 +66,8 @@ Automake --- a system for automatically generating Makefiles that
|
|||
|
||||
libtool --- a system for managing the zillion hairy options needed
|
||||
on various systems to produce shared libraries. Available in
|
||||
"ftp://ftp.gnu.org/pub/gnu/libtool"
|
||||
"ftp://ftp.gnu.org/pub/gnu/libtool". Version 1.5.26 (or
|
||||
later) is needed for correct AIX support.
|
||||
|
||||
gettext --- a system for rigging a program so that it can output its
|
||||
messages in the local tongue. Guile presently only exports
|
||||
|
@ -163,210 +164,6 @@ aclocal.m4, or any Makefile.in. Such patches are often large, and
|
|||
we're just going to regenerate those files anyway.
|
||||
|
||||
|
||||
CVS conventions ======================================================
|
||||
|
||||
- We use CVS to manage the Guile sources. The repository lives on
|
||||
subversions.gnu.org, in /cvs; you will need an
|
||||
account on that machine to access the repository. Also, for security
|
||||
reasons, subversions presently only supports CVS connections via the SSH
|
||||
protocol, so you must first install the SSH client. Then, you should
|
||||
set your CVS_RSH environment variable to ssh, and use the following as
|
||||
your CVS root:
|
||||
|
||||
:ext:USER@subversions.gnu.org:/cvs
|
||||
|
||||
Either set your CVSROOT environment variable to that, or give it as
|
||||
the value of the global -d option to CVS when you check out a working
|
||||
directory.
|
||||
|
||||
For more information on SSH, see http://www.openssh.com.
|
||||
|
||||
The Guile sources live in several modules:
|
||||
|
||||
- guile-core --- the interpreter, QuickThreads, and ice-9
|
||||
- guile-tcltk --- the Guile/Tk interface
|
||||
- guile-tk --- the new Guile/Tk interface, based on STk's modified Tk
|
||||
- guile-rgx-ctax --- the Guile/Rx interface, and the ctax implementation
|
||||
- guile-scsh --- the port of SCSH to guile, talk to Gary Houston
|
||||
- guile-www --- A Guile module for making HTTP requests.
|
||||
- guile-statprof --- an experimental statistical profiler.
|
||||
|
||||
There is a mailing list for CVS commit messages; see README for details.
|
||||
|
||||
- The guile-core tree is now versioned similarly to the Linux kernel.
|
||||
Guile now always uses three numbers to represent the version,
|
||||
i.e. "1.6.5". The first number, 1, is the major version number, the
|
||||
second number, 6, is the minor version number, and the third number,
|
||||
5, is the micro version number. Changes in major version number
|
||||
indicate major changes in Guile.
|
||||
|
||||
Minor version numbers that are even denote stable releases, and odd
|
||||
minor version numbers denote development versions (which may be
|
||||
unstable). The micro version number indicates a minor sub-revision of
|
||||
a given MAJOR.MINOR release.
|
||||
|
||||
- A default CVS checkout will get the current unstable development
|
||||
tree. However, for each stable release, a CVS branch is created so
|
||||
that release (and ongoing maintenance) of the stable version can
|
||||
proceed independent of the development of the next unstable version.
|
||||
To check out a particular stable branch, you just need to specify "-r
|
||||
branch_release-X-Y" to your CVS checkout command (or to any update).
|
||||
For example, if you wanted to check out the 1.6 stable branch, you
|
||||
would specify "-r branch_release-1-6".
|
||||
|
||||
So, for example, during a normal development cycle, work will proceed
|
||||
on an unstable version, say 1.5.X, until it is decided that it's time
|
||||
for a stable release. At that point, a branch named
|
||||
branch_release-1-6 will be created, and the version numbers on the
|
||||
HEAD of the CVS tree (the trunk, i.e. what you get by default), will
|
||||
be changed to reflect the new unstable version 1.7.X. Then unstable
|
||||
development will proceed on the unstable version, while the stable
|
||||
1.5.X branch is fixed up for the eventual 1.6.0 release.
|
||||
|
||||
Anytime you want to yank an existing checked out tree to the stable
|
||||
branch, you can run a command like this:
|
||||
|
||||
cvs -z3 update -r branch_release-1-6 -Pd
|
||||
|
||||
This will yank the working directory over on to the stable release
|
||||
branch. Note that this directory will track that branch from then on
|
||||
unless you do something to yank it back to the main (unstable) trunk.
|
||||
|
||||
To go back to the unstable branch, you can use
|
||||
|
||||
cvs -z3 update -A -Pd
|
||||
|
||||
Note that in either case, you should probably make sure you've
|
||||
commited or removed all local changes before running the commands or
|
||||
you're likely to have some unexpected results.
|
||||
|
||||
Finally note that one approach, should you need to work on both
|
||||
branches, is to keep two trees checked out, one stable, the other
|
||||
unstable and you can work in whichever is appropriate.
|
||||
|
||||
To save some initial bandwidth, you can check out either the stable
|
||||
tree or the unstable tree, and then do something like this:
|
||||
|
||||
cp -a core-unstable core-1.5
|
||||
cd core-1.5
|
||||
cvs -z3 update -r branch_release-1-6 -Pd
|
||||
|
||||
- The stable and unstable CVS trees are distinct, and no changes will
|
||||
automatically propagate between them. If you make changes that need
|
||||
to show up both places, you'll need to apply the changes both places.
|
||||
You *might* be able to do this with a cvs command, but often you'll
|
||||
probably need to apply the changes by hand or risk migrating
|
||||
superfluous modifications between the two versions. This is
|
||||
particularly important when moving a change from the unstable branch
|
||||
to the stable branch.
|
||||
|
||||
- In general, please don't be adventurous with the stable branch. We
|
||||
mostly want bugfixes, documentation improvements, build improvements,
|
||||
etc., though exceptions will doubtless exist.
|
||||
|
||||
- There are a few CVS tagging conventions which follow the Scheme
|
||||
convention that dashes are used to separate words within a single
|
||||
symbol, and so dashes bind more tightly than underscores. This means
|
||||
that foo-bar_baz-bax indicates that foo-bar is somehow separate from
|
||||
baz-bax. The conventions are as follows:
|
||||
|
||||
Branch root tags:
|
||||
-----------------
|
||||
anytime just before you create a branch it's a good
|
||||
idea to create a normal tag so that you can refer to the branch point
|
||||
on the main trunk as well as on the branch. So please use a tag of
|
||||
the form
|
||||
|
||||
branch-root-release-1-X
|
||||
|
||||
or more generally, for other non-release branches:
|
||||
|
||||
branch-root_FOO
|
||||
|
||||
Branch tags:
|
||||
------------
|
||||
for the branch tag itself please use
|
||||
|
||||
branch_release-1-6
|
||||
|
||||
or more generally, for other non-release branches:
|
||||
|
||||
branch_FOO
|
||||
|
||||
Merge tags:
|
||||
-----------
|
||||
Whenever you're merging a branch back into the trunk (or into another
|
||||
branch repeatedly) you need to tag the branch each time you merge. If
|
||||
you don't do that, you won't be able to merge repeatedly without
|
||||
possibly tedious conflicts. For those tags, we suggest:
|
||||
|
||||
branch-merge_SOME-FOO_to_SOME-BAR_1
|
||||
branch-merge_SOME-FOO_to_SOME-BAR_2
|
||||
..
|
||||
|
||||
As an example, SOME-BAR might be trunk, or even perhaps another branch
|
||||
like branch-mvo-super-fixes :>
|
||||
|
||||
More mundanely, you might have
|
||||
|
||||
branch-merge_release-1-6_to_trunk_1
|
||||
|
||||
(Merging the stable branch to the trunk like this
|
||||
will probably be much more common, when it happens, than the
|
||||
reverse for the reasons mentioned above.
|
||||
|
||||
Release tags:
|
||||
-------------
|
||||
When releasing a new version of guile, please use:
|
||||
|
||||
release_X-Y-Z
|
||||
|
||||
i.e.
|
||||
|
||||
release_1-6-0
|
||||
|
||||
- If you hack on a stable branch, please apply any relevant patches or
|
||||
fixes to the current unstable version (the main CVS trunk) as well.
|
||||
Similarly, please back-port any important fixes to the unstable CVS
|
||||
tree to the current stable branch.
|
||||
|
||||
- We check Makefile.am and configure.in files into CVS, but the
|
||||
"autogen.sh" script must be run from the top-level to generate the
|
||||
actual "configure" script that then must be run to create the various
|
||||
Makefile-s to build guile. The general rule is that you should be able
|
||||
to check out a working directory of Guile from CVS, and then type
|
||||
"./autogen.sh", then "configure", and finally "make". No
|
||||
automatically generated files should be checked into the CVS
|
||||
repository.
|
||||
|
||||
- The .cvsignore file is contained in the repository, to provide a
|
||||
reasonable list of auto-generated files that should not be checked in.
|
||||
This, however, prohibits one from having local additions to the
|
||||
.cvsignore file (yes, you can modify it and never check it in, but
|
||||
that doesn't seem to be a good solution to me). To get around this
|
||||
problem, you might want to patch your cvs program so that it uses a
|
||||
.cvsignore-local file (say) instead of the one from the repository. A
|
||||
patch for this can be found at the very end of this file.
|
||||
|
||||
- (Automake 1.4 only) Be sure to run automake at the top of the tree
|
||||
with no arguments. Do not use `automake Makefile' to regenerate
|
||||
specific Makefile.in files, and do not trust the Makefile rules to
|
||||
rebuild them when they are out of date. Automake 1.4 will add
|
||||
extraneous rules to the top-level Makefile if you specify specific
|
||||
Makefiles to rebuild on the command line. Running the command
|
||||
`autoreconf --force' should take care of everything correctly.
|
||||
|
||||
- Make sure your changes compile and work, at least on your own
|
||||
machine, before checking them into the main branch of the Guile
|
||||
repository. A good way for testing this is to run "make distcheck".
|
||||
If you really need to check in untested changes, make a branch.
|
||||
|
||||
- Include each log entry in both the ChangeLog and in the CVS logs.
|
||||
If you're using Emacs, the pcl-cvs interface to CVS has features to
|
||||
make this easier; it checks the ChangeLog, and generates good default
|
||||
CVS log entries from that.
|
||||
|
||||
|
||||
Coding standards =====================================================
|
||||
|
||||
- Before contributing larger amounts of code to Guile, please read the
|
||||
|
|
5
INSTALL
5
INSTALL
|
@ -2,7 +2,7 @@ Installation Instructions
|
|||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006 Free Software Foundation, Inc.
|
||||
2006, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
@ -67,6 +67,9 @@ The simplest way to compile this package is:
|
|||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
6. Often, you can also type `make uninstall' to remove the installed
|
||||
files again.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,2 +1,2 @@
|
|||
Guile is covered under the terms of the GNU Lesser General Public
|
||||
License, version 2.1. See COPYING.LIB.
|
||||
License, version 2.1. See COPYING.LESSER.
|
||||
|
|
11
Makefile.am
11
Makefile.am
|
@ -1,6 +1,6 @@
|
|||
## Process this file with automake to produce Makefile.in.
|
||||
##
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006, 2007 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -31,10 +31,8 @@ bin_SCRIPTS = guile-tools
|
|||
|
||||
include_HEADERS = libguile.h
|
||||
|
||||
# automake sometimes forgets to distribute acconfig.h,
|
||||
# apparently depending on the phase of the moon.
|
||||
EXTRA_DIST = LICENSE HACKING GUILE-VERSION ANON-CVS SNAPSHOTS \
|
||||
m4/ChangeLog
|
||||
EXTRA_DIST = LICENSE HACKING GUILE-VERSION \
|
||||
m4/ChangeLog FAQ guile-1.8.pc.in
|
||||
|
||||
TESTS = check-guile
|
||||
|
||||
|
@ -42,4 +40,7 @@ ACLOCAL_AMFLAGS = -I guile-config -I m4
|
|||
|
||||
DISTCLEANFILES = check-guile.log
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = guile-1.8.pc
|
||||
|
||||
# Makefile.am ends here
|
||||
|
|
160
NEWS
160
NEWS
|
@ -1,5 +1,5 @@
|
|||
Guile NEWS --- history of user-visible changes.
|
||||
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
See the end for copying conditions.
|
||||
|
||||
Please send Guile bug reports to bug-guile@gnu.org. Note that you
|
||||
|
@ -11,6 +11,7 @@ Changes in 1.9.0:
|
|||
|
||||
* New modules (see the manual for details)
|
||||
|
||||
** `(srfi srfi-18)', multithreading support
|
||||
** The `(ice-9 i18n)' module provides internationalization support
|
||||
|
||||
* Changes to the distribution
|
||||
|
@ -31,16 +32,173 @@ See `cancel-thread', `set-thread-cleanup!', and `thread-cleanup'.
|
|||
|
||||
* Changes to the C interface
|
||||
|
||||
** Internal `scm_i_' functions now have "hidden" linkage with GCC/ELF
|
||||
|
||||
This makes these internal functions technically not callable from
|
||||
application code.
|
||||
|
||||
** Functions for handling `scm_option' now no longer require an argument
|
||||
indicating length of the `scm_t_option' array.
|
||||
|
||||
|
||||
|
||||
Changes in 1.8.6 (since 1.8.5)
|
||||
|
||||
* New features (see the manual for details)
|
||||
|
||||
** New convenience function `scm_c_symbol_length ()'
|
||||
|
||||
** Single stepping through code from Emacs
|
||||
|
||||
When you use GDS to evaluate Scheme code from Emacs, you can now use
|
||||
`C-u' to indicate that you want to single step through that code. See
|
||||
`Evaluating Scheme Code' in the manual for more details.
|
||||
|
||||
* Changes to the distribution
|
||||
|
||||
** Automake's `AM_MAINTAINER_MODE' is no longer used
|
||||
|
||||
Thus, the `--enable-maintainer-mode' configure option is no longer
|
||||
available: Guile is now always configured in "maintainer mode".
|
||||
|
||||
* Bugs fixed
|
||||
|
||||
** `guile-config link' now prints `-L$libdir' before `-lguile'
|
||||
** Fix memory corruption involving GOOPS' `class-redefinition'
|
||||
** Fix possible deadlock in `mutex-lock'
|
||||
** Fix build issue on Tru64 and ia64-hp-hpux11.23 (`SCM_UNPACK' macro)
|
||||
** Fix build issue on mips, mipsel, powerpc and ia64 (stack direction)
|
||||
** Fix build issue on hppa2.0w-hp-hpux11.11 (`dirent64' and `readdir64_r')
|
||||
** Fix misleading output from `(help rationalize)'
|
||||
** Fix build failure on Debian hppa architecture (bad stack growth detection)
|
||||
|
||||
|
||||
Changes in 1.8.5 (since 1.8.4)
|
||||
|
||||
* Infrastructure changes
|
||||
|
||||
** Guile repository switched from CVS to Git
|
||||
|
||||
The new repository can be accessed using
|
||||
"git-clone git://git.sv.gnu.org/guile.git", or can be browsed on-line at
|
||||
http://git.sv.gnu.org/gitweb/?p=guile.git . See `README' for details.
|
||||
|
||||
** Add support for `pkg-config'
|
||||
|
||||
See "Autoconf Support" in the manual for details.
|
||||
|
||||
* New modules (see the manual for details)
|
||||
|
||||
** `(srfi srfi-88)'
|
||||
|
||||
* New features (see the manual for details)
|
||||
|
||||
** New `postfix' read option, for SRFI-88 keyword syntax
|
||||
** Some I/O primitives have been inlined, which improves I/O performance
|
||||
** New object-based traps infrastructure
|
||||
|
||||
This is a GOOPS-based infrastructure that builds on Guile's low-level
|
||||
evaluator trap calls and facilitates the development of debugging
|
||||
features like single-stepping, breakpoints, tracing and profiling.
|
||||
See the `Traps' node of the manual for details.
|
||||
|
||||
** New support for working on Guile code from within Emacs
|
||||
|
||||
Guile now incorporates the `GDS' library (previously distributed
|
||||
separately) for working on Guile code from within Emacs. See the
|
||||
`Using Guile In Emacs' node of the manual for details.
|
||||
|
||||
* Bugs fixed
|
||||
|
||||
** `scm_add_slot ()' no longer segfaults (fixes bug #22369)
|
||||
** Fixed `(ice-9 match)' for patterns like `((_ ...) ...)'
|
||||
|
||||
Previously, expressions like `(match '((foo) (bar)) (((_ ...) ...) #t))'
|
||||
would trigger an unbound variable error for `match:andmap'.
|
||||
|
||||
** `(oop goops describe)' now properly provides the `describe' feature
|
||||
** Fixed `args-fold' from `(srfi srfi-37)'
|
||||
|
||||
Previously, parsing short option names of argument-less options would
|
||||
lead to a stack overflow.
|
||||
|
||||
** `(srfi srfi-35)' is now visible through `cond-expand'
|
||||
** Fixed type-checking for the second argument of `eval'
|
||||
** Fixed type-checking for SRFI-1 `partition'
|
||||
** Fixed `struct-ref' and `struct-set!' on "light structs"
|
||||
** Honor struct field access rights in GOOPS
|
||||
** Changed the storage strategy of source properties, which fixes a deadlock
|
||||
** Allow compilation of Guile-using programs in C99 mode with GCC 4.3 and later
|
||||
** Fixed build issue for GNU/Linux on IA64
|
||||
** Fixed build issues on NetBSD 1.6
|
||||
** Fixed build issue on Solaris 2.10 x86_64
|
||||
** Fixed build issue with DEC/Compaq/HP's compiler
|
||||
** Fixed `scm_from_complex_double' build issue on FreeBSD
|
||||
** Fixed `alloca' build issue on FreeBSD 6
|
||||
** Removed use of non-portable makefile constructs
|
||||
** Fixed shadowing of libc's <random.h> on Tru64, which broke compilation
|
||||
** Make sure all tests honor `$TMPDIR'
|
||||
|
||||
* Changes to the distribution
|
||||
|
||||
** New FAQ
|
||||
|
||||
We've started collecting Frequently Asked Questions (FAQ), and will
|
||||
distribute these (with answers!) in future Guile releases.
|
||||
|
||||
|
||||
Changes in 1.8.4 (since 1.8.3)
|
||||
|
||||
* Bugs fixed
|
||||
|
||||
** CR (ASCII 0x0d) is (again) recognized as a token delimiter by the reader
|
||||
** Fixed a segmentation fault which occurred when displaying the
|
||||
backtrace of a stack with a promise object (made by `delay') in it.
|
||||
** Make `accept' leave guile mode while blocking
|
||||
** `scm_c_read ()' and `scm_c_write ()' now type-check their port argument
|
||||
** Fixed a build problem on AIX (use of func_data identifier)
|
||||
** Fixed a segmentation fault which occurred when hashx-ref or hashx-set! was
|
||||
called with an associator proc that returns neither a pair nor #f.
|
||||
** Secondary threads now always return a valid module for (current-module).
|
||||
** Avoid MacOS build problems caused by incorrect combination of "64"
|
||||
system and library calls.
|
||||
** `guile-snarf' now honors `$TMPDIR'
|
||||
** `guile-config compile' now reports CPPFLAGS used at compile-time
|
||||
** Fixed build with Sun Studio (Solaris 9)
|
||||
** Fixed wrong-type-arg errors when creating zero length SRFI-4
|
||||
uniform vectors on AIX.
|
||||
** Fixed a deadlock that occurs upon GC with multiple threads.
|
||||
** Fixed compile problem with GCC on Solaris and AIX (use of _Complex_I)
|
||||
** Fixed autotool-derived build problems on AIX 6.1.
|
||||
** Fixed NetBSD/alpha support
|
||||
** Fixed MacOS build problem caused by use of rl_get_keymap(_name)
|
||||
|
||||
* New modules (see the manual for details)
|
||||
|
||||
** `(srfi srfi-69)'
|
||||
|
||||
* Documentation fixes and improvements
|
||||
|
||||
** Removed premature breakpoint documentation
|
||||
|
||||
The features described are not available in the series of 1.8.x
|
||||
releases, so the documentation was misleading and has been removed.
|
||||
|
||||
** More about Guile's default *random-state* variable
|
||||
|
||||
** GOOPS: more about how to use `next-method'
|
||||
|
||||
* Changes to the distribution
|
||||
|
||||
** Corrected a few files that referred incorrectly to the old GPL + special exception licence
|
||||
|
||||
In fact Guile since 1.8.0 has been licensed with the GNU Lesser
|
||||
General Public License, and the few incorrect files have now been
|
||||
fixed to agree with the rest of the Guile distribution.
|
||||
|
||||
** Removed unnecessary extra copies of COPYING*
|
||||
|
||||
The distribution now contains a single COPYING.LESSER at its top level.
|
||||
|
||||
|
||||
Changes in 1.8.3 (since 1.8.2)
|
||||
|
|
28
README
28
README
|
@ -1,5 +1,5 @@
|
|||
!!! This is not a Guile release; it is a source tree retrieved via
|
||||
anonymous CVS or as a nightly snapshot at some random time after the
|
||||
Git or as a nightly snapshot at some random time after the
|
||||
Guile 1.8 release. If this were a Guile release, you would not see
|
||||
this message. !!! [fixme: zonk on release]
|
||||
|
||||
|
@ -364,14 +364,24 @@ guile-readline:
|
|||
library on your system.
|
||||
doc: Documentation (see above).
|
||||
|
||||
Anonymous CVS Access and FTP snapshots ===============================
|
||||
Git Repository Access ================================================
|
||||
|
||||
We make the developers' working Guile sources available via anonymous
|
||||
CVS, and by nightly snapshots, accessible via FTP. See the files
|
||||
`ANON-CVS' and `SNAPSHOTS' for details.
|
||||
Guile's source code is stored in a Git repository at Savannah. Anyone
|
||||
can access it using `git-clone' from one of the following URLs:
|
||||
|
||||
If you would like to receive mail when people commit changes to the
|
||||
Guile CVS repository, you can subscribe to guile-cvs@gnu.org by the
|
||||
Mailman mailing list interface at
|
||||
git://git.sv.gnu.org/guile.git
|
||||
http://git.sv.gnu.org/r/guile.git
|
||||
|
||||
<http://mail.gnu.org/mailman/listinfo/guile-cvs>
|
||||
Developers with a Savannah SSH account can also access it from:
|
||||
|
||||
ssh://git.sv.gnu.org/srv/git/guile.git
|
||||
|
||||
The repository can also be browsed on-line at the following address:
|
||||
|
||||
http://git.sv.gnu.org/gitweb/?p=guile.git
|
||||
|
||||
For more information on Git, please see:
|
||||
|
||||
http://git.or.cz/
|
||||
|
||||
Please send problem reports to <bug-guile@gnu.org>.
|
||||
|
|
26
README.CVS
26
README.CVS
|
@ -1,26 +0,0 @@
|
|||
When Guile is obtained from CVS, a few extra steps must be taken
|
||||
before the usual configure, make, make install. You will need to have
|
||||
up-to-date versions of the tools listed in HACKING (see below),
|
||||
correctly installed. i.e., they must be found in the current PATH and
|
||||
not shadowed or otherwise broken by files left behind from other
|
||||
versions.
|
||||
|
||||
"up-to-date" means the latest released versions at the time that Guile
|
||||
was obtained from CVS. Sometimes older or newer versions will work.
|
||||
|
||||
In addition to the guile/guile-core module that holds the main
|
||||
sources, you also need the two modules guile/guile-scripts and
|
||||
guile/workbook. For example, you can use this command to check out
|
||||
all three modules:
|
||||
|
||||
$ cvs -d:ext:anoncvs@savannah.gnu.org:/cvsroot/guile \
|
||||
co guile/guile-core guile/guile-scripts guile/workbook
|
||||
|
||||
Then you must run the autogen.sh script in guile/guile-core:
|
||||
|
||||
$ cd guile/guile-core
|
||||
$ ./autogen.sh
|
||||
|
||||
For more information about hacking Guile and some troubleshooting
|
||||
hints, see the file HACKING. It can be found in guile/guile-core and
|
||||
guile/workbook/build/dist-files/.
|
14
THANKS
14
THANKS
|
@ -2,6 +2,7 @@ Contributors since the last release:
|
|||
|
||||
Rob Browning
|
||||
Ludovic Courtès
|
||||
Julian Graham
|
||||
Stefan Jahn
|
||||
Neil Jerram
|
||||
Antoine Mathys
|
||||
|
@ -27,6 +28,7 @@ For fixes or providing information which led to a fix:
|
|||
Stephen Compall
|
||||
Brian Crowder
|
||||
Christopher Cramer
|
||||
David Diffenbaugh
|
||||
Hyper Division
|
||||
Alexandre Duret-Lutz
|
||||
Nils Durner
|
||||
|
@ -35,12 +37,14 @@ For fixes or providing information which led to a fix:
|
|||
Charles Gagnon
|
||||
Peter Gavin
|
||||
Eric Gillespie, Jr
|
||||
Didier Godefroy
|
||||
John Goerzen
|
||||
Mike Gran
|
||||
Szavai Gyula
|
||||
Sven Hartrumpf
|
||||
Eric Hanchrow
|
||||
Sam Hocevar
|
||||
Patrick Horgan
|
||||
Ales Hvezda
|
||||
Peter Ivanyi
|
||||
Wolfgang Jaehrling
|
||||
|
@ -49,17 +53,23 @@ For fixes or providing information which led to a fix:
|
|||
Steve Juranich
|
||||
Richard Kim
|
||||
Bruce Korb
|
||||
René Köcher
|
||||
Matthias Köppe
|
||||
Matt Kraai
|
||||
Miroslav Lichvar
|
||||
Jeff Long
|
||||
Marco Maggi
|
||||
Gregory Marton
|
||||
Antoine Mathys
|
||||
Dan McMahill
|
||||
Roger Mc Murtrie
|
||||
Tim Mooney
|
||||
Han-Wen Nienhuys
|
||||
Jan Nieuwenhuizen
|
||||
Hrvoje Nikšić
|
||||
Stefan Nordhausen
|
||||
Roland Orre
|
||||
Peter O'Gorman
|
||||
Pieter Pareit
|
||||
Jack Pavlovsky
|
||||
Arno Peters
|
||||
|
@ -71,14 +81,18 @@ For fixes or providing information which led to a fix:
|
|||
Hugh Sasse
|
||||
Werner Scheinast
|
||||
Bill Schottstaedt
|
||||
Frank Schwidom
|
||||
Thiemo Seufer
|
||||
Scott Shedden
|
||||
Alex Shinn
|
||||
Daniel Skarda
|
||||
Cesar Strauss
|
||||
Rainer Tammer
|
||||
Richard Todd
|
||||
Issac Trotts
|
||||
Greg Troxel
|
||||
Aaron M. Ucko
|
||||
Stephen Uitti
|
||||
Momchil Velikov
|
||||
Panagiotis Vossos
|
||||
Neil W. Van Dyke
|
||||
|
|
|
@ -19,17 +19,19 @@ libtool --version
|
|||
echo ""
|
||||
${M4:-/usr/bin/m4} --version
|
||||
echo ""
|
||||
gnulib-tool --version
|
||||
echo ""
|
||||
|
||||
######################################################################
|
||||
### update infrastructure
|
||||
|
||||
gnulib-tool --update && \
|
||||
autoreconf -i --force --verbose
|
||||
|
||||
echo "guile-readline..."
|
||||
(cd guile-readline && ./autogen.sh)
|
||||
|
||||
# Copy versions of config.guess and config.sub from Guile's repository to
|
||||
# build-aux and guile-readline.
|
||||
cp -f config.guess config.sub build-aux/
|
||||
cp -f config.guess config.sub guile-readline/
|
||||
|
||||
echo "Now run configure and make."
|
||||
echo "You must pass the \`--enable-maintainer-mode' option to configure."
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2008-04-17 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* Makefile.am (SCM_BENCHMARKS): Add `benchmarks/read.bm'.
|
||||
* benchmarks/read.bm: New file.
|
||||
|
||||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
2006-11-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* README: Note need for subscription to bug-guile@gnu.org.
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
SCM_BENCHMARKS = benchmarks/0-reference.bm \
|
||||
benchmarks/continuations.bm \
|
||||
benchmarks/if.bm \
|
||||
benchmarks/logand.bm
|
||||
SCM_BENCHMARKS = benchmarks/0-reference.bm \
|
||||
benchmarks/continuations.bm \
|
||||
benchmarks/if.bm \
|
||||
benchmarks/logand.bm \
|
||||
benchmarks/read.bm
|
||||
|
||||
EXTRA_DIST = guile-benchmark lib.scm $(SCM_BENCHMARKS)
|
||||
|
|
62
benchmark-suite/benchmarks/read.bm
Normal file
62
benchmark-suite/benchmarks/read.bm
Normal file
|
@ -0,0 +1,62 @@
|
|||
;;; read.bm --- Exercise the reader. -*- Scheme -*-
|
||||
;;;
|
||||
;;; Copyright (C) 2008 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 software; see the file COPYING. If not, write to
|
||||
;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
;;; Boston, MA 02110-1301 USA
|
||||
|
||||
(define-module (benchmarks read)
|
||||
:use-module (benchmark-suite lib))
|
||||
|
||||
|
||||
(define %files-to-load
|
||||
;; Various large Scheme files.
|
||||
(map %search-load-path
|
||||
'("ice-9/boot-9.scm" "ice-9/common-list.scm"
|
||||
"ice-9/format.scm" "ice-9/optargs.scm"
|
||||
"ice-9/session.scm" "ice-9/getopt-long.scm"
|
||||
"ice-9/psyntax.pp")))
|
||||
|
||||
(define (load-file-with-reader file-name reader buffering)
|
||||
(with-input-from-file file-name
|
||||
(lambda ()
|
||||
(apply setvbuf (current-input-port) buffering)
|
||||
(let loop ((sexp (reader)))
|
||||
(if (eof-object? sexp)
|
||||
#t
|
||||
(loop (reader)))))))
|
||||
|
||||
(define (exercise-read buffering)
|
||||
(for-each (lambda (file)
|
||||
(load-file-with-reader file read buffering))
|
||||
%files-to-load))
|
||||
|
||||
|
||||
(with-benchmark-prefix "read"
|
||||
|
||||
(benchmark "_IONBF" 5 ;; this one is very slow
|
||||
(exercise-read (list _IONBF)))
|
||||
|
||||
(benchmark "_IOLBF" 100
|
||||
(exercise-read (list _IOLBF)))
|
||||
|
||||
(benchmark "_IOFBF 4096" 100
|
||||
(exercise-read (list _IOFBF 4096)))
|
||||
|
||||
(benchmark "_IOFBF 8192" 100
|
||||
(exercise-read (list _IOFBF 8192)))
|
||||
|
||||
(benchmark "_IOFBF 16384" 100
|
||||
(exercise-read (list _IOFBF 16384))))
|
13
build-aux/.cvsignore
Normal file
13
build-aux/.cvsignore
Normal file
|
@ -0,0 +1,13 @@
|
|||
.deps
|
||||
.dirstamp
|
||||
link-warning.h
|
||||
compile
|
||||
config.guess
|
||||
config.sub
|
||||
depcomp
|
||||
elisp-comp
|
||||
install-sh
|
||||
ltmain.sh
|
||||
mdate-sh
|
||||
missing
|
||||
texinfo.tex
|
1
build-aux/.gitignore
vendored
Normal file
1
build-aux/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
link-warning.h
|
|
@ -2,7 +2,7 @@
|
|||
# Output a system dependent set of variables, describing how to set the
|
||||
# run time search path of shared libraries in an executable.
|
||||
#
|
||||
# Copyright 1996-2006 Free Software Foundation, Inc.
|
||||
# Copyright 1996-2008 Free Software Foundation, Inc.
|
||||
# Taken from GNU libtool, 2001
|
||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
#
|
||||
|
@ -64,7 +64,7 @@ else
|
|||
;;
|
||||
esac
|
||||
;;
|
||||
mingw* | pw32* | os2*)
|
||||
mingw* | cygwin* | pw32* | os2*)
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
wl='-Wl,'
|
||||
|
@ -74,7 +74,7 @@ else
|
|||
;;
|
||||
newsos6)
|
||||
;;
|
||||
linux*)
|
||||
linux* | k*bsd*-gnu)
|
||||
case $cc_basename in
|
||||
icc* | ecc*)
|
||||
wl='-Wl,'
|
||||
|
@ -100,7 +100,7 @@ else
|
|||
osf3* | osf4* | osf5*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sco3.2v5*)
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
wl='-Wl,'
|
||||
|
@ -108,11 +108,14 @@ else
|
|||
sunos4*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
|
||||
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
;;
|
||||
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
unicos*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
|
@ -155,7 +158,7 @@ if test "$with_gnu_ld" = yes; then
|
|||
# option of GNU ld is called -rpath, not --rpath.
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
case "$host_os" in
|
||||
aix3* | aix4* | aix5*)
|
||||
aix[3-9]*)
|
||||
# On AIX/PPC, the GNU linker is very broken
|
||||
if test "$host_cpu" != ia64; then
|
||||
ld_shlibs=no
|
||||
|
@ -189,11 +192,11 @@ if test "$with_gnu_ld" = yes; then
|
|||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
interix3*)
|
||||
interix[3-9]*)
|
||||
hardcode_direct=no
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
linux*)
|
||||
gnu* | linux* | k*bsd*-gnu)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
|
@ -251,7 +254,7 @@ else
|
|||
hardcode_direct=unsupported
|
||||
fi
|
||||
;;
|
||||
aix4* | aix5*)
|
||||
aix[4-9]*)
|
||||
if test "$host_cpu" = ia64; then
|
||||
# On IA64, the linker does run time linking by default, so we don't
|
||||
# have to do anything special.
|
||||
|
@ -261,7 +264,7 @@ else
|
|||
# Test if we are trying to use run time linking or normal
|
||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||
# need to do runtime linking.
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||
for ld_flag in $LDFLAGS; do
|
||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||
aix_use_runtimelinking=yes
|
||||
|
@ -280,7 +283,7 @@ else
|
|||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||
then
|
||||
# We have reworked collect2
|
||||
hardcode_direct=yes
|
||||
:
|
||||
else
|
||||
# We have old collect2
|
||||
hardcode_direct=unsupported
|
||||
|
@ -359,7 +362,7 @@ else
|
|||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
freebsd* | kfreebsd*-gnu | dragonfly*)
|
||||
freebsd* | dragonfly*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
|
@ -412,18 +415,22 @@ else
|
|||
hardcode_libdir_separator=:
|
||||
;;
|
||||
openbsd*)
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
if test -f /usr/libexec/ld.so; then
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
os2*)
|
||||
|
@ -471,7 +478,7 @@ else
|
|||
ld_shlibs=yes
|
||||
fi
|
||||
;;
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6*)
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||
|
@ -488,33 +495,51 @@ fi
|
|||
|
||||
# Check dynamic linker characteristics
|
||||
# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
|
||||
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||
# only about the one the linker finds when passed -lNAME. This is the last
|
||||
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||
# linker has special search rules.
|
||||
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||
libname_spec='lib$name'
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
aix4* | aix5*)
|
||||
aix[4-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
amigaos*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
beos*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
bsdi[45]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
cygwin* | mingw* | pw32*)
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.dll.a $libname.lib'
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
shrext=.dylib
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
dgux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
freebsd1*)
|
||||
;;
|
||||
kfreebsd*-gnu)
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
case "$host_os" in
|
||||
freebsd[123]*)
|
||||
library_names_spec='$libname$shrext$versuffix' ;;
|
||||
*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
esac
|
||||
;;
|
||||
gnu*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
case $host_cpu in
|
||||
|
@ -528,10 +553,13 @@ case "$host_os" in
|
|||
shrext=.sl
|
||||
;;
|
||||
esac
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
interix3*)
|
||||
interix[3-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
case "$host_os" in
|
||||
irix5* | nonstopux*)
|
||||
libsuff= shlibsuff=
|
||||
|
@ -548,41 +576,59 @@ case "$host_os" in
|
|||
;;
|
||||
linux*oldld* | linux*aout* | linux*coff*)
|
||||
;;
|
||||
linux*)
|
||||
linux* | k*bsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
knetbsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
netbsd*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
newsos6)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
nto-qnx*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
openbsd*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
os2*)
|
||||
libname_spec='$name'
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sunos4*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
sysv4 | sysv4.3*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
uts4*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
esac
|
||||
|
||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
|
||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||
|
@ -596,6 +642,12 @@ libext="$libext"
|
|||
# Shared library suffix (normally "so").
|
||||
shlibext="$shlibext"
|
||||
|
||||
# Format of library name prefix.
|
||||
libname_spec="$escaped_libname_spec"
|
||||
|
||||
# Library names that the linker finds when passed -lNAME.
|
||||
library_names_spec="$escaped_library_names_spec"
|
||||
|
||||
# Flag to hardcode \$libdir into a binary during linking.
|
||||
# This must work even if \$libdir does not exist.
|
||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||
|
|
28
build-aux/link-warning.h
Normal file
28
build-aux/link-warning.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* GL_LINK_WARNING("literal string") arranges to emit the literal string as
|
||||
a linker warning on most glibc systems.
|
||||
We use a linker warning rather than a preprocessor warning, because
|
||||
#warning cannot be used inside macros. */
|
||||
#ifndef GL_LINK_WARNING
|
||||
/* This works on platforms with GNU ld and ELF object format.
|
||||
Testing __GLIBC__ is sufficient for asserting that GNU ld is in use.
|
||||
Testing __ELF__ guarantees the ELF object format.
|
||||
Testing __GNUC__ is necessary for the compound expression syntax. */
|
||||
# if defined __GLIBC__ && defined __ELF__ && defined __GNUC__
|
||||
# define GL_LINK_WARNING(message) \
|
||||
GL_LINK_WARNING1 (__FILE__, __LINE__, message)
|
||||
# define GL_LINK_WARNING1(file, line, message) \
|
||||
GL_LINK_WARNING2 (file, line, message) /* macroexpand file and line */
|
||||
# define GL_LINK_WARNING2(file, line, message) \
|
||||
GL_LINK_WARNING3 (file ":" #line ": warning: " message)
|
||||
# define GL_LINK_WARNING3(message) \
|
||||
({ static const char warning[sizeof (message)] \
|
||||
__attribute__ ((__unused__, \
|
||||
__section__ (".gnu.warning"), \
|
||||
__aligned__ (1))) \
|
||||
= message "\n"; \
|
||||
(void)0; \
|
||||
})
|
||||
# else
|
||||
# define GL_LINK_WARNING(message) ((void) 0)
|
||||
# endif
|
||||
#endif
|
1526
config.guess
vendored
Executable file
1526
config.guess
vendored
Executable file
File diff suppressed because it is too large
Load diff
110
config.rpath
110
config.rpath
|
@ -2,7 +2,7 @@
|
|||
# Output a system dependent set of variables, describing how to set the
|
||||
# run time search path of shared libraries in an executable.
|
||||
#
|
||||
# Copyright 1996-2006 Free Software Foundation, Inc.
|
||||
# Copyright 1996-2008 Free Software Foundation, Inc.
|
||||
# Taken from GNU libtool, 2001
|
||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
#
|
||||
|
@ -64,7 +64,7 @@ else
|
|||
;;
|
||||
esac
|
||||
;;
|
||||
mingw* | pw32* | os2*)
|
||||
mingw* | cygwin* | pw32* | os2*)
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
wl='-Wl,'
|
||||
|
@ -74,7 +74,7 @@ else
|
|||
;;
|
||||
newsos6)
|
||||
;;
|
||||
linux*)
|
||||
linux* | k*bsd*-gnu)
|
||||
case $cc_basename in
|
||||
icc* | ecc*)
|
||||
wl='-Wl,'
|
||||
|
@ -100,7 +100,7 @@ else
|
|||
osf3* | osf4* | osf5*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sco3.2v5*)
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
wl='-Wl,'
|
||||
|
@ -108,11 +108,14 @@ else
|
|||
sunos4*)
|
||||
wl='-Qoption ld '
|
||||
;;
|
||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
|
||||
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
;;
|
||||
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
unicos*)
|
||||
wl='-Wl,'
|
||||
;;
|
||||
|
@ -155,7 +158,7 @@ if test "$with_gnu_ld" = yes; then
|
|||
# option of GNU ld is called -rpath, not --rpath.
|
||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||
case "$host_os" in
|
||||
aix3* | aix4* | aix5*)
|
||||
aix[3-9]*)
|
||||
# On AIX/PPC, the GNU linker is very broken
|
||||
if test "$host_cpu" != ia64; then
|
||||
ld_shlibs=no
|
||||
|
@ -189,11 +192,11 @@ if test "$with_gnu_ld" = yes; then
|
|||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
interix3*)
|
||||
interix[3-9]*)
|
||||
hardcode_direct=no
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
linux*)
|
||||
gnu* | linux* | k*bsd*-gnu)
|
||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||
:
|
||||
else
|
||||
|
@ -251,7 +254,7 @@ else
|
|||
hardcode_direct=unsupported
|
||||
fi
|
||||
;;
|
||||
aix4* | aix5*)
|
||||
aix[4-9]*)
|
||||
if test "$host_cpu" = ia64; then
|
||||
# On IA64, the linker does run time linking by default, so we don't
|
||||
# have to do anything special.
|
||||
|
@ -261,7 +264,7 @@ else
|
|||
# Test if we are trying to use run time linking or normal
|
||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||
# need to do runtime linking.
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
|
||||
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||
for ld_flag in $LDFLAGS; do
|
||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||
aix_use_runtimelinking=yes
|
||||
|
@ -280,7 +283,7 @@ else
|
|||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||
then
|
||||
# We have reworked collect2
|
||||
hardcode_direct=yes
|
||||
:
|
||||
else
|
||||
# We have old collect2
|
||||
hardcode_direct=unsupported
|
||||
|
@ -359,7 +362,7 @@ else
|
|||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
freebsd* | kfreebsd*-gnu | dragonfly*)
|
||||
freebsd* | dragonfly*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
|
@ -412,18 +415,22 @@ else
|
|||
hardcode_libdir_separator=:
|
||||
;;
|
||||
openbsd*)
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
if test -f /usr/libexec/ld.so; then
|
||||
hardcode_direct=yes
|
||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
else
|
||||
case "$host_os" in
|
||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
;;
|
||||
*)
|
||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||
;;
|
||||
esac
|
||||
ld_shlibs=no
|
||||
fi
|
||||
;;
|
||||
os2*)
|
||||
|
@ -471,7 +478,7 @@ else
|
|||
ld_shlibs=yes
|
||||
fi
|
||||
;;
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
|
||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6*)
|
||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||
|
@ -488,33 +495,51 @@ fi
|
|||
|
||||
# Check dynamic linker characteristics
|
||||
# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
|
||||
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||
# only about the one the linker finds when passed -lNAME. This is the last
|
||||
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||
# linker has special search rules.
|
||||
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||
libname_spec='lib$name'
|
||||
case "$host_os" in
|
||||
aix3*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
aix4* | aix5*)
|
||||
aix[4-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
amigaos*)
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
beos*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
bsdi[45]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
cygwin* | mingw* | pw32*)
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.dll.a $libname.lib'
|
||||
;;
|
||||
darwin* | rhapsody*)
|
||||
shrext=.dylib
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
dgux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
freebsd1*)
|
||||
;;
|
||||
kfreebsd*-gnu)
|
||||
;;
|
||||
freebsd* | dragonfly*)
|
||||
case "$host_os" in
|
||||
freebsd[123]*)
|
||||
library_names_spec='$libname$shrext$versuffix' ;;
|
||||
*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
esac
|
||||
;;
|
||||
gnu*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
hpux9* | hpux10* | hpux11*)
|
||||
case $host_cpu in
|
||||
|
@ -528,10 +553,13 @@ case "$host_os" in
|
|||
shrext=.sl
|
||||
;;
|
||||
esac
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
interix3*)
|
||||
interix[3-9]*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
irix5* | irix6* | nonstopux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
case "$host_os" in
|
||||
irix5* | nonstopux*)
|
||||
libsuff= shlibsuff=
|
||||
|
@ -548,41 +576,59 @@ case "$host_os" in
|
|||
;;
|
||||
linux*oldld* | linux*aout* | linux*coff*)
|
||||
;;
|
||||
linux*)
|
||||
linux* | k*bsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
knetbsd*-gnu)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
netbsd*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
newsos6)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
nto-qnx*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
openbsd*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
os2*)
|
||||
libname_spec='$name'
|
||||
shrext=.dll
|
||||
library_names_spec='$libname.a'
|
||||
;;
|
||||
osf3* | osf4* | osf5*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
rdos*)
|
||||
;;
|
||||
solaris*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sunos4*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
sysv4 | sysv4.3*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv4*MP*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
uts4*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
esac
|
||||
|
||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||
|
||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||
|
@ -596,6 +642,12 @@ libext="$libext"
|
|||
# Shared library suffix (normally "so").
|
||||
shlibext="$shlibext"
|
||||
|
||||
# Format of library name prefix.
|
||||
libname_spec="$escaped_libname_spec"
|
||||
|
||||
# Library names that the linker finds when passed -lNAME.
|
||||
library_names_spec="$escaped_library_names_spec"
|
||||
|
||||
# Flag to hardcode \$libdir into a binary during linking.
|
||||
# This must work even if \$libdir does not exist.
|
||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||
|
|
1654
config.sub
vendored
Executable file
1654
config.sub
vendored
Executable file
File diff suppressed because it is too large
Load diff
280
configure.in
280
configure.in
|
@ -4,7 +4,7 @@ dnl
|
|||
|
||||
define(GUILE_CONFIGURE_COPYRIGHT,[[
|
||||
|
||||
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GUILE
|
||||
|
||||
|
@ -25,7 +25,7 @@ Boston, MA 02110-1301, USA.
|
|||
|
||||
]])
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_PREREQ(2.61)
|
||||
|
||||
dnl `patsubst' here deletes the newline which "echo" prints. We can't use
|
||||
dnl "echo -n" since -n is not portable (see autoconf manual "Limitations of
|
||||
|
@ -41,15 +41,14 @@ AC_CONFIG_AUX_DIR([build-aux])
|
|||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_SRCDIR(GUILE-VERSION)
|
||||
|
||||
AM_INIT_AUTOMAKE([gnu no-define check-news])
|
||||
AM_INIT_AUTOMAKE([gnu no-define check-news -Wall -Wno-override])
|
||||
|
||||
AC_COPYRIGHT(GUILE_CONFIGURE_COPYRIGHT)
|
||||
AC_CONFIG_SRCDIR([GUILE-VERSION])
|
||||
|
||||
. $srcdir/GUILE-VERSION
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
AM_CONFIG_HEADER([config.h])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AH_TOP(/*GUILE_CONFIGURE_COPYRIGHT*/)
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
|
@ -62,8 +61,11 @@ AC_CONFIG_SUBDIRS(guile-readline)
|
|||
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
AC_LANG([C])
|
||||
|
||||
dnl Some more checks for Win32
|
||||
AC_CYGWIN
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
@ -75,7 +77,8 @@ AC_PROG_AWK
|
|||
dnl Gnulib.
|
||||
gl_INIT
|
||||
|
||||
AM_PROG_CC_STDC
|
||||
AC_PROG_CC_C89
|
||||
|
||||
# for per-target cflags in the libguile subdir
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
|
@ -124,7 +127,7 @@ AC_ARG_ENABLE(debug-malloc,
|
|||
|
||||
SCM_I_GSC_GUILE_DEBUG=0
|
||||
AC_ARG_ENABLE(guile-debug,
|
||||
[AC_HELP_STRING([--enable-guile-debug],
|
||||
[AS_HELP_STRING([--enable-guile-debug],
|
||||
[include internal debugging functions])],
|
||||
if test "$enable_guile_debug" = y || test "$enable_guile_debug" = yes; then
|
||||
SCM_I_GSC_GUILE_DEBUG=1
|
||||
|
@ -143,7 +146,7 @@ AC_ARG_ENABLE(regex,
|
|||
enable_regex=yes)
|
||||
|
||||
AC_ARG_ENABLE([discouraged],
|
||||
AC_HELP_STRING([--disable-discouraged],[omit discouraged features]))
|
||||
AS_HELP_STRING([--disable-discouraged],[omit discouraged features]))
|
||||
|
||||
if test "$enable_discouraged" = no; then
|
||||
SCM_I_GSC_ENABLE_DISCOURAGED=0
|
||||
|
@ -152,7 +155,7 @@ else
|
|||
fi
|
||||
|
||||
AC_ARG_ENABLE([deprecated],
|
||||
AC_HELP_STRING([--disable-deprecated],[omit deprecated features]))
|
||||
AS_HELP_STRING([--disable-deprecated],[omit deprecated features]))
|
||||
|
||||
if test "$enable_deprecated" = no; then
|
||||
SCM_I_GSC_ENABLE_DEPRECATED=0
|
||||
|
@ -173,6 +176,51 @@ AC_ARG_ENABLE(elisp,
|
|||
[ --disable-elisp omit Emacs Lisp support],,
|
||||
enable_elisp=yes)
|
||||
|
||||
dnl Added the following configure option in January 2008 following
|
||||
dnl investigation of problems with "64" system and library calls on
|
||||
dnl Darwin (MacOS X). The libguile code (_scm.h) assumes that if a
|
||||
dnl system has stat64, it will have all the other 64 APIs too; but on
|
||||
dnl Darwin, stat64 is there but other APIs are missing.
|
||||
dnl
|
||||
dnl It also appears, from the Darwin docs, that most system call APIs
|
||||
dnl there (i.e. the traditional ones _without_ "64" in their names) have
|
||||
dnl been 64-bit-capable for a long time now, so it isn't necessary to
|
||||
dnl use "64" versions anyway. For example, Darwin's off_t is 64-bit.
|
||||
dnl
|
||||
dnl A similar problem has been reported for HP-UX:
|
||||
dnl http://www.nabble.com/Building-guile-1.8.2-on-hpux-td13106681.html
|
||||
dnl
|
||||
dnl Therefore, and also because a Guile without LARGEFILE64 support is
|
||||
dnl better than no Guile at all, we provide this option to suppress
|
||||
dnl trying to use "64" calls.
|
||||
dnl
|
||||
dnl It may be that for some 64-bit function on Darwin/HP-UX we do need
|
||||
dnl to use a "64" call, and hence that by using --without-64-calls we're
|
||||
dnl missing out on that. If so, someone can work on that in the future.
|
||||
dnl For now, --without-64-calls allows Guile to build on OSs where it
|
||||
dnl wasn't building before.
|
||||
AC_MSG_CHECKING([whether to use system and library "64" calls])
|
||||
AC_ARG_WITH([64-calls],
|
||||
AS_HELP_STRING([--without-64-calls],
|
||||
[don't attempt to use system and library calls with "64" in their names]),
|
||||
[use_64_calls=$withval],
|
||||
[use_64_calls=yes
|
||||
case $host in
|
||||
*-apple-darwin* )
|
||||
use_64_calls=no
|
||||
;;
|
||||
powerpc-ibm-aix* )
|
||||
use_64_calls=no
|
||||
;;
|
||||
esac])
|
||||
AC_MSG_RESULT($use_64_calls)
|
||||
case "$use_64_calls" in
|
||||
y* )
|
||||
AC_DEFINE(GUILE_USE_64_CALLS, 1,
|
||||
[Define to 1 in order to try to use "64" versions of system and library calls.])
|
||||
;;
|
||||
esac
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
dnl Check for dynamic linking
|
||||
|
@ -534,9 +582,38 @@ AC_SUBST([SCM_I_GSC_NEEDS_STDINT_H])
|
|||
AC_SUBST([SCM_I_GSC_NEEDS_INTTYPES_H])
|
||||
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_HEADER_TIME
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_HEADER_DIRENT
|
||||
|
||||
# Reason for checking:
|
||||
#
|
||||
# HP-UX 11.11 (at least) doesn't provide `struct dirent64', even
|
||||
# with `_LARGEFILE64_SOURCE', so check whether it's available.
|
||||
#
|
||||
AC_CHECK_MEMBER([struct dirent64.d_name],
|
||||
[SCM_I_GSC_HAVE_STRUCT_DIRENT64=1], [SCM_I_GSC_HAVE_STRUCT_DIRENT64=0],
|
||||
[ #ifndef _LARGEFILE64_SOURCE
|
||||
# define _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
|
||||
/* Per Autoconf manual. */
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_DIRENT_H
|
||||
# include <dirent.h>
|
||||
#else
|
||||
# define dirent direct
|
||||
# ifdef HAVE_SYS_NDIR_H
|
||||
# include <sys/ndir.h>
|
||||
# endif
|
||||
# ifdef HAVE_SYS_DIR_H
|
||||
# include <sys/dir.h>
|
||||
# endif
|
||||
# ifdef HAVE_NDIR_H
|
||||
# include <ndir.h>
|
||||
# endif
|
||||
#endif ])
|
||||
AC_SUBST([SCM_I_GSC_HAVE_STRUCT_DIRENT64])
|
||||
|
||||
# Reasons for testing:
|
||||
# complex.h - new in C99
|
||||
|
@ -635,6 +712,7 @@ AC_CHECK_HEADERS([assert.h crt_externs.h])
|
|||
# pipe - not in mingw
|
||||
# _pipe - specific to mingw, taking 3 args
|
||||
# readdir_r - recent posix, not on old systems
|
||||
# readdir64_r - not available on HP-UX 11.11
|
||||
# stat64 - SuS largefile stuff, not on old systems
|
||||
# sysconf - not on old systems
|
||||
# truncate - not in mingw
|
||||
|
@ -643,7 +721,7 @@ AC_CHECK_HEADERS([assert.h crt_externs.h])
|
|||
# strcoll_l, newlocale - GNU extensions (glibc), also available on Darwin
|
||||
# nl_langinfo - X/Open, not available on Windows.
|
||||
#
|
||||
AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid fesetround ftime ftruncate fchown getcwd geteuid gettimeofday gmtime_r ioctl lstat mkdir mknod nice pipe _pipe readdir_r readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction siginterrupt stat64 strftime strptime symlink sync sysconf tcgetpgrp tcsetpgrp times uname waitpid strdup system usleep atexit on_exit chown link fcntl ttyname getpwent getgrent kill getppid getpgrp fork setitimer getitimer strchr strcmp index bcopy memcpy rindex truncate unsetenv isblank _NSGetEnviron strcoll strcoll_l newlocale nl_langinfo])
|
||||
AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid fesetround ftime ftruncate fchown getcwd geteuid gettimeofday gmtime_r ioctl lstat mkdir mknod nice pipe _pipe readdir_r readdir64_r readlink rename rmdir select setegid seteuid setlocale setpgid setsid sigaction siginterrupt stat64 strftime strptime symlink sync sysconf tcgetpgrp tcsetpgrp times uname waitpid strdup system usleep atexit on_exit chown link fcntl ttyname getpwent getgrent kill getppid getpgrp fork setitimer getitimer strchr strcmp index bcopy memcpy rindex truncate unsetenv isblank _NSGetEnviron strcoll strcoll_l newlocale nl_langinfo])
|
||||
|
||||
# Reasons for testing:
|
||||
# netdb.h - not in mingw
|
||||
|
@ -675,6 +753,37 @@ AC_SEARCH_LIBS(crypt, crypt,
|
|||
[AC_DEFINE(HAVE_CRYPT,1,
|
||||
[Define to 1 if you have the `crypt' function.])])
|
||||
|
||||
# When compiling with GCC on some OSs (Solaris, AIX), _Complex_I doesn't
|
||||
# work; in the reported cases so far, 1.0fi works well instead. According
|
||||
# to the C99 spec, the complex.h header must provide a working definition
|
||||
# of _Complex_I, so we always try _Complex_I first. The 1.0fi fallback
|
||||
# is a workaround for the failure of some systems to conform to C99.
|
||||
if test "$ac_cv_type_complex_double" = yes; then
|
||||
AC_MSG_CHECKING([for i])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#if HAVE_COMPLEX_H
|
||||
#include <complex.h>
|
||||
#endif
|
||||
complex double z;
|
||||
]], [[
|
||||
z = _Complex_I;
|
||||
]])],
|
||||
[AC_DEFINE(GUILE_I,_Complex_I,[The imaginary unit (positive square root of -1).])
|
||||
AC_MSG_RESULT([_Complex_I])],
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#if HAVE_COMPLEX_H
|
||||
#include <complex.h>
|
||||
#endif
|
||||
complex double z;
|
||||
]],[[
|
||||
z = 1.0fi;
|
||||
]])],
|
||||
[AC_DEFINE(GUILE_I,1.0fi)
|
||||
AC_MSG_RESULT([1.0fi])],
|
||||
[ac_cv_type_complex_double=no
|
||||
AC_MSG_RESULT([not available])])])
|
||||
fi
|
||||
|
||||
# glibc 2.3.6 (circa 2006) and various prior versions had a bug where
|
||||
# csqrt(-i) returned a negative real part, when it should be positive
|
||||
# for the principal root.
|
||||
|
@ -683,7 +792,7 @@ if test "$ac_cv_type_complex_double" = yes; then
|
|||
|
||||
AC_CACHE_CHECK([whether csqrt is usable],
|
||||
guile_cv_use_csqrt,
|
||||
[AC_TRY_RUN([
|
||||
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <complex.h>
|
||||
/* "volatile" is meant to prevent gcc from calculating the sqrt as a
|
||||
constant, we want to test libc. */
|
||||
|
@ -696,7 +805,7 @@ main (void)
|
|||
return 0; /* good */
|
||||
else
|
||||
return 1; /* bad */
|
||||
}],
|
||||
}]])],
|
||||
[guile_cv_use_csqrt=yes],
|
||||
[guile_cv_use_csqrt="no, glibc 2.3 bug"],
|
||||
[guile_cv_use_csqrt="yes, hopefully (cross-compiling)"])])
|
||||
|
@ -713,8 +822,9 @@ AC_CHECK_LIB([gmp], [__gmpz_init], ,
|
|||
[AC_MSG_ERROR([GNU MP not found, see README])])
|
||||
|
||||
# mpz_import is a macro so we need to include <gmp.h>
|
||||
AC_TRY_LINK([#include <gmp.h>],
|
||||
[mpz_import (0, 0, 0, 0, 0, 0, 0);] , ,
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gmp.h>]],
|
||||
[[mpz_import (0, 0, 0, 0, 0, 0, 0); ]])],
|
||||
[],
|
||||
[AC_MSG_ERROR([At least GNU MP 4.1 is required, see README])])
|
||||
|
||||
dnl i18n tests
|
||||
|
@ -792,11 +902,11 @@ AC_CHECK_MEMBERS([struct sockaddr.sin_len],,,
|
|||
|
||||
AC_MSG_CHECKING(for __libc_stack_end)
|
||||
AC_CACHE_VAL(guile_cv_have_libc_stack_end,
|
||||
[AC_TRY_LINK([#include <stdio.h>
|
||||
extern char *__libc_stack_end;],
|
||||
[printf("%p", (char*) __libc_stack_end);],
|
||||
guile_cv_have_libc_stack_end=yes,
|
||||
guile_cv_have_libc_stack_end=no)])
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
|
||||
extern char *__libc_stack_end;]],
|
||||
[[printf("%p", (char*) __libc_stack_end);]])],
|
||||
[guile_cv_have_libc_stack_end=yes],
|
||||
[guile_cv_have_libc_stack_end=no])])
|
||||
AC_MSG_RESULT($guile_cv_have_libc_stack_end)
|
||||
|
||||
if test $guile_cv_have_libc_stack_end = yes; then
|
||||
|
@ -809,9 +919,10 @@ dnl macro. With cygwin it may be in a DLL.
|
|||
|
||||
AC_MSG_CHECKING(whether netdb.h declares h_errno)
|
||||
AC_CACHE_VAL(guile_cv_have_h_errno,
|
||||
[AC_TRY_COMPILE([#include <netdb.h>],
|
||||
[int a = h_errno;],
|
||||
guile_cv_have_h_errno=yes, guile_cv_have_h_errno=no)])
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netdb.h>]],
|
||||
[[int a = h_errno;]])],
|
||||
[guile_cv_have_h_errno=yes],
|
||||
[guile_cv_have_h_errno=no])])
|
||||
AC_MSG_RESULT($guile_cv_have_h_errno)
|
||||
if test $guile_cv_have_h_errno = yes; then
|
||||
AC_DEFINE(HAVE_H_ERRNO, 1, [Define if h_errno is declared in netdb.h.])
|
||||
|
@ -819,15 +930,16 @@ fi
|
|||
|
||||
AC_MSG_CHECKING(whether uint32_t is defined)
|
||||
AC_CACHE_VAL(guile_cv_have_uint32_t,
|
||||
[AC_TRY_COMPILE([#include <sys/types.h>
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#if HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#ifndef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif],
|
||||
[uint32_t a;],
|
||||
guile_cv_have_uint32_t=yes, guile_cv_have_uint32_t=no)])
|
||||
#endif]],
|
||||
[[uint32_t a;]])],
|
||||
[guile_cv_have_uint32_t=yes],
|
||||
[guile_cv_have_uint32_t=no])])
|
||||
AC_MSG_RESULT($guile_cv_have_uint32_t)
|
||||
if test $guile_cv_have_uint32_t = yes; then
|
||||
AC_DEFINE(HAVE_UINT32_T, 1,
|
||||
|
@ -836,14 +948,15 @@ fi
|
|||
|
||||
AC_MSG_CHECKING(for working IPv6 support)
|
||||
AC_CACHE_VAL(guile_cv_have_ipv6,
|
||||
[AC_TRY_COMPILE([
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>],
|
||||
[struct sockaddr_in6 a; a.sin6_family = AF_INET6;],
|
||||
guile_cv_have_ipv6=yes, guile_cv_have_ipv6=no)])
|
||||
#include <sys/socket.h>]],
|
||||
[[struct sockaddr_in6 a; a.sin6_family = AF_INET6;]])],
|
||||
[guile_cv_have_ipv6=yes],
|
||||
[guile_cv_have_ipv6=no])])
|
||||
AC_MSG_RESULT($guile_cv_have_ipv6)
|
||||
if test $guile_cv_have_ipv6 = yes; then
|
||||
AC_DEFINE(HAVE_IPV6, 1, [Define if you want support for IPv6.])
|
||||
|
@ -852,13 +965,14 @@ fi
|
|||
# included in rfc2553 but not in older implementations, e.g., glibc 2.1.3.
|
||||
AC_MSG_CHECKING(whether sockaddr_in6 has sin6_scope_id)
|
||||
AC_CACHE_VAL(guile_cv_have_sin6_scope_id,
|
||||
[AC_TRY_COMPILE([
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <netinet/in.h>],
|
||||
[struct sockaddr_in6 sok; sok.sin6_scope_id = 0;],
|
||||
guile_cv_have_sin6_scope_id=yes, guile_cv_have_sin6_scope_id=no)])
|
||||
#include <netinet/in.h>]],
|
||||
[[struct sockaddr_in6 sok; sok.sin6_scope_id = 0;]])],
|
||||
[guile_cv_have_sin6_scope_id=yes],
|
||||
[guile_cv_have_sin6_scope_id=no])])
|
||||
AC_MSG_RESULT($guile_cv_have_sin6_scope_id)
|
||||
if test $guile_cv_have_sin6_scope_id = yes; then
|
||||
AC_DEFINE(HAVE_SIN6_SCOPE_ID, 1,
|
||||
|
@ -875,7 +989,7 @@ AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_len],,,
|
|||
AC_MSG_CHECKING(whether localtime caches TZ)
|
||||
AC_CACHE_VAL(guile_cv_localtime_cache,
|
||||
[if test x$ac_cv_func_tzset = xyes; then
|
||||
AC_TRY_RUN([#include <time.h>
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <time.h>
|
||||
#if STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
@ -906,7 +1020,9 @@ main()
|
|||
if (localtime (&now)->tm_hour != hour_unset)
|
||||
exit (1);
|
||||
exit (0);
|
||||
}], guile_cv_localtime_cache=no, guile_cv_localtime_cache=yes,
|
||||
}]])],
|
||||
[guile_cv_localtime_cache=no],
|
||||
[guile_cv_localtime_cache=yes],
|
||||
[# If we have tzset, assume the worst when cross-compiling.
|
||||
guile_cv_localtime_cache=yes])
|
||||
else
|
||||
|
@ -1024,15 +1140,42 @@ GUILE_STRUCT_UTIMBUF
|
|||
#
|
||||
# Which way does the stack grow?
|
||||
#
|
||||
# Following code comes from Autoconf 2.61's internal _AC_LIBOBJ_ALLOCA
|
||||
# macro (/usr/share/autoconf/autoconf/functions.m4). Gnulib has
|
||||
# very similar code, so in future we could look at using that.
|
||||
#
|
||||
# An important detail is that the code involves find_stack_direction
|
||||
# calling _itself_ - which means that find_stack_direction (or at
|
||||
# least the second find_stack_direction() call) cannot be inlined.
|
||||
# If the code could be inlined, that might cause the test to give
|
||||
# an incorrect answer.
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
SCM_I_GSC_STACK_GROWS_UP=0
|
||||
AC_TRY_RUN(aux (l) unsigned long l;
|
||||
{ int x; exit (l >= ((unsigned long)&x)); }
|
||||
main () { int q; aux((unsigned long)&q); },
|
||||
[SCM_I_GSC_STACK_GROWS_UP=1],
|
||||
[],
|
||||
[AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h)])
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE(
|
||||
[AC_INCLUDES_DEFAULT
|
||||
int
|
||||
find_stack_direction ()
|
||||
{
|
||||
static char *addr = 0;
|
||||
auto char dummy;
|
||||
if (addr == 0)
|
||||
{
|
||||
addr = &dummy;
|
||||
return find_stack_direction ();
|
||||
}
|
||||
else
|
||||
return (&dummy > addr) ? 1 : -1;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return find_stack_direction () < 0;
|
||||
}])],
|
||||
[SCM_I_GSC_STACK_GROWS_UP=1],
|
||||
[],
|
||||
[AC_MSG_WARN(Guessing that stack grows down -- see scmconfig.h)])
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
#
|
||||
|
@ -1054,12 +1197,12 @@ fi
|
|||
|
||||
AC_MSG_CHECKING(for struct linger)
|
||||
AC_CACHE_VAL(scm_cv_struct_linger,
|
||||
AC_TRY_COMPILE([
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>],
|
||||
[struct linger lgr; lgr.l_linger = 100],
|
||||
scm_cv_struct_linger="yes",
|
||||
scm_cv_struct_linger="no"))
|
||||
#include <sys/socket.h>]],
|
||||
[[struct linger lgr; lgr.l_linger = 100]])],
|
||||
[scm_cv_struct_linger="yes"],
|
||||
[scm_cv_struct_linger="no"]))
|
||||
AC_MSG_RESULT($scm_cv_struct_linger)
|
||||
if test $scm_cv_struct_linger = yes; then
|
||||
AC_DEFINE(HAVE_STRUCT_LINGER, 1,
|
||||
|
@ -1072,14 +1215,13 @@ fi
|
|||
#
|
||||
AC_MSG_CHECKING(for struct timespec)
|
||||
AC_CACHE_VAL(scm_cv_struct_timespec,
|
||||
AC_TRY_COMPILE([
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <time.h>
|
||||
#if HAVE_PTHREAD_H
|
||||
#include <pthread.h>
|
||||
#endif],
|
||||
[struct timespec t; t.tv_nsec = 100],
|
||||
scm_cv_struct_timespec="yes",
|
||||
scm_cv_struct_timespec="no"))
|
||||
#endif]], [[struct timespec t; t.tv_nsec = 100]])],
|
||||
[scm_cv_struct_timespec="yes"],
|
||||
[scm_cv_struct_timespec="no"]))
|
||||
AC_MSG_RESULT($scm_cv_struct_timespec)
|
||||
if test $scm_cv_struct_timespec = yes; then
|
||||
AC_DEFINE(HAVE_STRUCT_TIMESPEC, 1,
|
||||
|
@ -1106,6 +1248,9 @@ AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER, 0)
|
|||
|
||||
case "$with_threads" in
|
||||
"yes" | "pthread" | "pthreads" | "pthread-threads" | "")
|
||||
|
||||
build_pthread_support="yes"
|
||||
|
||||
ACX_PTHREAD(CC="$PTHREAD_CC"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
SCM_I_GSC_USE_PTHREAD_THREADS=1
|
||||
|
@ -1185,6 +1330,10 @@ esac
|
|||
AC_MSG_CHECKING(what kind of threads to support)
|
||||
AC_MSG_RESULT($with_threads)
|
||||
|
||||
AM_CONDITIONAL([BUILD_PTHREAD_SUPPORT],
|
||||
[test "x$build_pthread_support" = "xyes"])
|
||||
|
||||
|
||||
## Check whether pthread_attr_getstack works for the main thread
|
||||
|
||||
if test "$with_threads" = pthreads; then
|
||||
|
@ -1192,8 +1341,7 @@ if test "$with_threads" = pthreads; then
|
|||
AC_MSG_CHECKING(whether pthread_attr_getstack works for the main thread)
|
||||
old_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
|
||||
AC_TRY_RUN(
|
||||
[
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#if HAVE_PTHREAD_ATTR_GETSTACK
|
||||
#include <pthread.h>
|
||||
|
||||
|
@ -1218,10 +1366,11 @@ int main ()
|
|||
return 1;
|
||||
}
|
||||
#endif
|
||||
],
|
||||
]])],
|
||||
[works=yes
|
||||
AC_DEFINE(PTHREAD_ATTR_GETSTACK_WORKS, [1], [Define when pthread_att_get_stack works for the main thread])],
|
||||
[works=no])
|
||||
[works=no],
|
||||
[])
|
||||
CFLAGS="$old_CFLAGS"
|
||||
AC_MSG_RESULT($works)
|
||||
|
||||
|
@ -1279,17 +1428,19 @@ case "$GCC" in
|
|||
## less than exasperating.
|
||||
## -Wpointer-arith was here too, but something changed in gcc/glibc
|
||||
## and it became equally exasperating (gcc 2.95 and/or glibc 2.1.2).
|
||||
CFLAGS="$CFLAGS -Wall -Wmissing-prototypes"
|
||||
GCC_CFLAGS="-Wall -Wmissing-prototypes"
|
||||
# Do this here so we don't screw up any of the tests above that might
|
||||
# not be "warning free"
|
||||
if test "${GUILE_ERROR_ON_WARNING}" = yes
|
||||
then
|
||||
CFLAGS="${CFLAGS} -Werror"
|
||||
GCC_CFLAGS="${GCC_CFLAGS} -Werror"
|
||||
enable_compile_warnings=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(GCC_CFLAGS)
|
||||
|
||||
## If we're creating a shared library (using libtool!), then we'll
|
||||
## need to generate a list of .lo files corresponding to the .o files
|
||||
## given in LIBOBJS. We'll call it LIBLOBJS.
|
||||
|
@ -1348,7 +1499,7 @@ AC_SUBST(LIBGUILE_I18N_INTERFACE)
|
|||
|
||||
dnl Tell guile-config what flags guile users should compile and link with.
|
||||
GUILE_LIBS="$LDFLAGS $LIBS"
|
||||
GUILE_CFLAGS="$PTHREAD_CFLAGS"
|
||||
GUILE_CFLAGS="$CPPFLAGS $PTHREAD_CFLAGS"
|
||||
AC_SUBST(GUILE_LIBS)
|
||||
AC_SUBST(GUILE_CFLAGS)
|
||||
|
||||
|
@ -1363,6 +1514,12 @@ AC_SUBST(top_builddir_absolute)
|
|||
top_srcdir_absolute=`(cd $srcdir && pwd)`
|
||||
AC_SUBST(top_srcdir_absolute)
|
||||
|
||||
dnl We need `sitedir' in `guile-1.8.pc'.
|
||||
dnl Note: `sitedir' must be kept in sync with `GUILE_SITE_DIR' in `guile.m4'.
|
||||
pkgdatadir="$datadir/guile"
|
||||
sitedir="$pkgdatadir/site"
|
||||
AC_SUBST([sitedir])
|
||||
|
||||
# Additional SCM_I_GSC definitions are above.
|
||||
AC_SUBST([SCM_I_GSC_GUILE_DEBUG])
|
||||
AC_SUBST([SCM_I_GSC_GUILE_DEBUG_FREELIST])
|
||||
|
@ -1409,6 +1566,7 @@ AC_CONFIG_FILES([
|
|||
test-suite/standalone/Makefile
|
||||
])
|
||||
|
||||
AC_CONFIG_FILES([guile-1.8.pc])
|
||||
AC_CONFIG_FILES([check-guile], [chmod +x check-guile])
|
||||
AC_CONFIG_FILES([benchmark-guile], [chmod +x benchmark-guile])
|
||||
AC_CONFIG_FILES([guile-tools], [chmod +x guile-tools])
|
||||
|
|
1
doc/.gitignore
vendored
Normal file
1
doc/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
stamp-vti
|
|
@ -1,3 +1,13 @@
|
|||
2008-04-26 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* Makefile.am (EXAMPLE_SMOB_FILES): Remove `COPYING'.
|
||||
|
||||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
* oldfmt.c: Update copyright statement to LGPL.
|
||||
|
||||
2002-09-14 Rob Browning <rlb@defaultvalue.org>
|
||||
|
||||
* .cvsignore: add stamp-vti.1
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
## Process this file with Automake to create Makefile.in
|
||||
##
|
||||
## Copyright (C) 1998, 2002, 2006 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998, 2002, 2006, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -27,7 +27,7 @@ SUBDIRS = ref tutorial goops r5rs
|
|||
# man_MANS = guile.1
|
||||
|
||||
EXAMPLE_SMOB_FILES = \
|
||||
ChangeLog Makefile README COPYING image-type.c image-type.h myguile.c
|
||||
ChangeLog Makefile README image-type.c image-type.h myguile.c
|
||||
|
||||
OLDFMT = oldfmt.c
|
||||
|
||||
|
@ -43,9 +43,8 @@ EXTRA_DIST = groupings.alist # guile-api.alist
|
|||
# pending the papers from Robert Merkel
|
||||
# EXTRA_DIST = guile.1
|
||||
|
||||
if MAINTAINER_MODE
|
||||
include $(top_srcdir)/am/maintainer-dirs
|
||||
guile-api.alist: guile-api.alist-FORCE
|
||||
( cd $(top_builddir) ; $(mscripts)/update-guile-api.alist )
|
||||
guile-api.alist-FORCE:
|
||||
endif
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
2004-09-24 Marius Vollmer <mvo@zagadka.de>
|
||||
|
||||
* image-type.c: Updated from manual.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2008-02-06 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* goops-tutorial.texi (Next-method): Minor improvements to the
|
||||
text.
|
||||
|
||||
2006-09-28 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* goops.texi (Slot Options): Added example from Ludovic Courtès
|
||||
|
|
|
@ -690,11 +690,12 @@ In this case,
|
|||
@node Next-method, Example, Generic functions and methods, Generic functions
|
||||
@subsection Next-method
|
||||
|
||||
When a generic function is called, the list of applicable methods is
|
||||
built. As mentioned before, the most specific method of this list is
|
||||
applied (see@ @ref{Generic functions and methods}). This method may call
|
||||
the next method in the list of applicable methods. This is done by using
|
||||
the special form @code{next-method}. Consider the following definitions
|
||||
When you call a generic function, with a particular set of arguments,
|
||||
GOOPS builds a list of all the methods that are applicable to those
|
||||
arguments and orders them by how closely the method definitions match
|
||||
the actual argument types. It then calls the method at the top of this
|
||||
list. If the selected method's code wants to call on to the next method
|
||||
in this list, it can do so by using @code{next-method}.
|
||||
|
||||
@lisp
|
||||
(define-method (Test (a <integer>)) (cons 'integer (next-method)))
|
||||
|
@ -702,7 +703,7 @@ the special form @code{next-method}. Consider the following definitions
|
|||
(define-method (Test a) (list 'top))
|
||||
@end lisp
|
||||
|
||||
With those definitions,
|
||||
With these definitions,
|
||||
|
||||
@lisp
|
||||
(Test 1) @result{} (integer number top)
|
||||
|
@ -710,6 +711,32 @@ With those definitions,
|
|||
(Test #t) @result{} (top)
|
||||
@end lisp
|
||||
|
||||
@code{next-method} is always called as just @code{(next-method)}. The
|
||||
arguments for the next method call are always implicit, and always the
|
||||
same as for the original method call.
|
||||
|
||||
If you want to call on to a method with the same name but with a
|
||||
different set of arguments (as you might with overloaded methods in C++,
|
||||
for example), you do not use @code{next-method}, but instead simply
|
||||
write the new call as usual:
|
||||
|
||||
@lisp
|
||||
(define-method (Test (a <number>) min max)
|
||||
(if (and (>= a min) (<= a max))
|
||||
(display "Number is in range\n"))
|
||||
(Test a))
|
||||
|
||||
(Test 2 1 10)
|
||||
@print{}
|
||||
Number is in range
|
||||
@result{}
|
||||
(integer number top)
|
||||
@end lisp
|
||||
|
||||
(You should be careful in this case that the @code{Test} calls do not
|
||||
lead to an infinite recursion, but this consideration is just the same
|
||||
as in Scheme code in general.)
|
||||
|
||||
@node Example, , Next-method, Generic functions
|
||||
@subsection Example
|
||||
|
||||
|
|
49
doc/oldfmt.c
49
doc/oldfmt.c
|
@ -1,43 +1,18 @@
|
|||
/* Copyright (C) 2000,2001, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2000,2001, 2006, 2008 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,
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* As a special exception, the Free Software Foundation gives permission
|
||||
* for additional uses of the text contained in its release of GUILE.
|
||||
*
|
||||
* The exception is that, if you link the GUILE library with other files
|
||||
* to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the GUILE library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the
|
||||
* Free Software Foundation under the name GUILE. If you copy
|
||||
* code from other Free Software Foundation releases into a copy of
|
||||
* GUILE, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for GUILE, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ Makefile
|
|||
Makefile.in
|
||||
autoconf-macros.texi
|
||||
mdate-sh
|
||||
lib-version.texi
|
||||
stamp-vti
|
||||
stamp-vti.1
|
||||
texinfo.tex
|
||||
|
|
2
doc/ref/.gitignore
vendored
Normal file
2
doc/ref/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
autoconf-macros.texi
|
||||
lib-version.texi
|
|
@ -1,3 +1,153 @@
|
|||
2008-07-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* scheme-using.texi (Evaluating Scheme Code): Document use of
|
||||
`C-u' prefix with evaluation commands.
|
||||
|
||||
2008-07-05 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* api-data.texi (Symbol Primitives): Add `scm_c_symbol_length ()'.
|
||||
|
||||
2008-06-30 Julian Graham <joolean@gmail.com>
|
||||
|
||||
* srfi-modules.texi (SRFI-18): New section.
|
||||
(SRFI-19 Time): Mention SRFI-18's `current-time'.
|
||||
|
||||
2008-06-28 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* api-modules.texi (Using Guile Modules): Substitute "syntax
|
||||
transformer" to "system transformer". Reported by Sebastian
|
||||
Tennant <sebyte@smolny.plus.com>.
|
||||
|
||||
2008-06-01 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* srfi-modules.texi (SRFI-88): Fix URL.
|
||||
|
||||
2008-05-14 Julian Graham <joolean@gmail.com>
|
||||
|
||||
* api-scheduling.texi (Mutexes and Condition Variables): Add
|
||||
documentation for new functions "scm_mutex_owner",
|
||||
"scm_mutex_level", and "scm_mutex_locked_p". Update
|
||||
documentation for function "scm_lock_mutex_timed" to reflect
|
||||
addition of optional ownership argument.
|
||||
|
||||
2008-05-07 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* Makefile.am (autoconf-macros.texi): Avoid use of GNU Make
|
||||
specific `$<' variable. This broke with BSD Make as found on
|
||||
FreeBSD 6.2.
|
||||
|
||||
2008-05-05 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* scheme-using.texi (Using Guile in Emacs): Add concept index
|
||||
entries `GDS' and `Emacs'.
|
||||
|
||||
* api-debug.texi (Debugging): Add concept index entry `Debugging'.
|
||||
|
||||
2008-05-04 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* guile.texi (Guile Modules): Include `autoconf.texi'.
|
||||
* autoconf.texi (Autoconf Support): Mention `pkg-config'.
|
||||
(Autoconf Macros): Document `pkg-config' support.
|
||||
|
||||
2008-04-26 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* srfi-modules.texi (SRFI-88): New section.
|
||||
* api-data.texi (Keyword Read Syntax): Add reference to
|
||||
`SRFI-88'.
|
||||
|
||||
2008-04-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* posix.texi (File System): New doc for file-exists?.
|
||||
|
||||
2008-04-15 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* api-data.texi (Keywords): Mention postfix syntax.
|
||||
(Keyword Read Syntax): Document `postfix' read option.
|
||||
* api-options.texi (Reader options): Update examples.
|
||||
(Examples of option use): Likewise.
|
||||
|
||||
2008-03-28 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* libguile-concepts.texi (Multi-Threading): Fix typo.
|
||||
|
||||
2008-03-24 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
Applying patch from Julian Graham, containing minor fixes to his
|
||||
thread enhancements:
|
||||
|
||||
* api-scheduling.texi (Mutexes and Condition Variables): Change
|
||||
`flag' to `flags' in docstring.
|
||||
|
||||
2008-03-19 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* api-debug.texi (Low Level Trap Calls): Removed (material
|
||||
duplicated elsewhere); doc for with-traps and debug-object? moved
|
||||
to section on evaluator trap options.
|
||||
(High Level Traps): Renamed just `Traps'. Add references to
|
||||
evaluator trap options and debug options. Make language
|
||||
appropriate for core Guile (as opposed to previously separate
|
||||
package).
|
||||
(Location Traps): Corrected to reflect that location traps now
|
||||
specify a specific position, not a range of positions.
|
||||
(Debugging Examples): New (content moved here from
|
||||
scheme-debugging.texi, and updated to use traps instead of
|
||||
breakpoints).
|
||||
|
||||
* api-modules.texi (Included Guile Modules): Change `Debugging
|
||||
Features' reference to `Tracing'.
|
||||
|
||||
* api-options.texi (Evaluator trap options): Doc for with-traps
|
||||
and debug-object? is now here.
|
||||
|
||||
* guile.texi, scheme-debugging.texi: Move the `Tracing' content of
|
||||
scheme-debugging.texi to the Modules section.
|
||||
|
||||
* scheme-using.texi (Using Guile in Emacs, GDS Getting Started):
|
||||
Minor edits.
|
||||
|
||||
* scheme-debugging.texi (Debugging Features, Intro to
|
||||
Breakpoints): Removed.
|
||||
(Examples): Moved to api-debug.texi.
|
||||
(Tracing, Old Tracing): Promoted one level.
|
||||
(New Tracing, Tracing Compared): Removed.
|
||||
|
||||
2008-03-08 Julian Graham <joolean@gmail.com>
|
||||
|
||||
* api-scheduling.texi (Threads): Add documentation for new
|
||||
functions "scm_thread_p" and new "scm_join_thread_timed".
|
||||
(Mutexes and Condition Variables): Add documentation for new
|
||||
functions "scm_make_mutex_with_flags", "scm_mutex_p",
|
||||
"scm_lock_mutex_timed", "scm_unlock_mutex_timed", and
|
||||
"scm_condition_variable_p".
|
||||
|
||||
2008-02-11 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* api-data.texi (Random): New text about the default random state,
|
||||
following suggestions by Stephen Uitti.
|
||||
|
||||
2008-02-01 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* api-scheduling.texi (Threads): Add "C Function scm_join_thread"
|
||||
to doc for join-thread. Thanks to Antoine Mathys for reporting
|
||||
that scm_join_thread was missing.
|
||||
|
||||
2007-12-09 Stephen Compall <s11@member.fsf.org>
|
||||
|
||||
* srfi-modules.texi (SRFI-69): Avoid use of the first person.
|
||||
|
||||
2007-12-03 Stephen Compall <s11@member.fsf.org>
|
||||
|
||||
* srfi-modules.texi: Describe SRFI-69 in a new subsection.
|
||||
|
||||
2007-10-29 Julian Graham <joolean@gmail.com>
|
||||
|
||||
* api-scheduling.texi (Threads): Document `cancel-thread',
|
||||
`set-thread-cleanup!' and `thread-cleanup'.
|
||||
|
||||
2007-10-24 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* .cvsignore: Add lib-version.texi.
|
||||
|
||||
2007-10-02 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* slib.texi (SLIB installation): Don't recommend using the site
|
||||
|
@ -129,7 +279,7 @@
|
|||
(lib-version.texi): New target.
|
||||
|
||||
* guile.texi: Include `lib-version.texi'.
|
||||
|
||||
|
||||
* api-data.texi (Conversion): Link to `The ice-9 i18n Module' when
|
||||
describing `string->number'.
|
||||
(String Comparison): Likewise.
|
||||
|
@ -317,7 +467,7 @@
|
|||
|
||||
* api-debug.texi (Debug on Error): Note need to handling of errors
|
||||
in C.
|
||||
|
||||
|
||||
* api-debug.texi (Debugging): New intro text. New subsection
|
||||
"Evaluation Model". Moved existing subsections "Capturing the
|
||||
Stack or Innermost Stack Frame", "Examining the Stack", "Examining
|
||||
|
@ -353,7 +503,7 @@
|
|||
* api-evaluation.texi (Fly Evaluation): Add scm_c_eval_string.
|
||||
(Loading): Add scm_c_primitive_load.
|
||||
Reported by Jon Wilson.
|
||||
|
||||
|
||||
2006-06-25 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* posix.texi (Time): In tm:gmtoff, give example values, note not the
|
||||
|
@ -487,7 +637,7 @@
|
|||
|
||||
* api-data.texi (Operations Related to Symbols):
|
||||
Documented `scm_take_locale_symbol ()'.
|
||||
|
||||
|
||||
2005-12-15 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* api-evaluation.texi (Fly Evaluation): Add scm_call_4, suggested by
|
||||
|
@ -578,7 +728,7 @@
|
|||
|
||||
* misc-modules.texi (Formatted Output): Show modifiers like ~:d
|
||||
instead of in words.
|
||||
|
||||
|
||||
2005-08-06 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* api-compound.texi (List Modification): In filter, return may share a
|
||||
|
@ -925,7 +1075,7 @@
|
|||
* api-i18n.texi: New file.
|
||||
* Makefile.am (guile_TEXINFOS): Added it.
|
||||
* guile.texi: Include it.
|
||||
|
||||
|
||||
2004-09-16 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* api-utility.texi (Equality): Revise for clarity.
|
||||
|
@ -980,16 +1130,16 @@
|
|||
|
||||
Ran a (docstring-process-module "(guile)") and moved entries from
|
||||
new-docstrings.texi to their appropriate place.
|
||||
|
||||
|
||||
* api-undocumented.texi: New file.
|
||||
|
||||
2004-08-21 Marius Vollmer <mvo@zagadka.de>
|
||||
|
||||
From Richard Todd, Thanks!
|
||||
|
||||
|
||||
* scheme-scripts.texi (Invoking Guile): documented new '-L'
|
||||
switch.
|
||||
|
||||
|
||||
2004-08-20 Marius Vollmer <mvo@zagadka.de>
|
||||
|
||||
* gh.texi: Updated transition section with new recommended things.
|
||||
|
@ -1000,7 +1150,7 @@
|
|||
mutation-sharing substrings.
|
||||
(Symbols): Document scm_from_locale_symbol and
|
||||
scm_from_locale_symboln.
|
||||
|
||||
|
||||
2004-08-18 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* posix.texi (Network Sockets and Communication): Add SOCK_RDM and
|
||||
|
@ -1062,7 +1212,7 @@
|
|||
scm_is_complex, scm_is_number, scm_c_make_rectangular,
|
||||
scm_c_make_polar, scm_c_real_part, scm_c_imag_part,
|
||||
scm_c_magnitude, and scm_c_angle.
|
||||
|
||||
|
||||
2004-08-02 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* gh.texi: Replaced references to scm_num2* with scm_to_* and
|
||||
|
@ -1098,7 +1248,7 @@
|
|||
* api-deprecated.texi: Removed.
|
||||
* intro.texi (Discouraged and Deprecated): General information
|
||||
about deprecation, etc.
|
||||
|
||||
|
||||
2004-07-30 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* misc-modules.texi (Formatted Output): Changed @w to @w{} in
|
||||
|
@ -1183,7 +1333,7 @@
|
|||
|
||||
* Makefile.am (CLEANFILES): Remove guile.cps guile.fns guile.rns
|
||||
guile.tps guile.vrs guile.tmp, cleaned by automake these days.
|
||||
|
||||
|
||||
2004-05-06 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* scheme-smobs.texi: Updated for new SCM_SMOB_* macros.
|
||||
|
@ -1266,7 +1416,7 @@
|
|||
* scheme-control.texi (while do): Expand and clarify `do', in
|
||||
particular note iteration binds fresh locations, rather than values
|
||||
"stored".
|
||||
|
||||
|
||||
* srfi-modules.texi (SRFI-4): Revise for clarity, give each function
|
||||
explicitly rather than showing TAG so Emacs info-look can find them,
|
||||
merge "SRFI-4 - Read Syntax" and "SRFI-4 - Procedures" into just one
|
||||
|
@ -1296,7 +1446,7 @@
|
|||
2004-01-21 Marius Vollmer <mvo@zagadka.de>
|
||||
|
||||
Added copyright notices to all TeXinfo files.
|
||||
|
||||
|
||||
* fdl.texi: New.
|
||||
* guile.texi: Include it as an appendix.
|
||||
* preface.texi: State that the manual is FDL.
|
||||
|
@ -1318,7 +1468,7 @@
|
|||
|
||||
* misc-modules.texi (Queues): New chapter.
|
||||
* guile.texi (Top): Add it.
|
||||
|
||||
|
||||
2004-01-09 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* scheme-compound.texi (Bit Vectors): Revise for clarity, following
|
||||
|
@ -1373,7 +1523,7 @@
|
|||
* scheme-data.texi: Include exact rationals.
|
||||
|
||||
From Stephen Compall. Thanks!
|
||||
|
||||
|
||||
* intro.texi (What is Guile?): Add @acronym for POSIX, R5RS, GUI,
|
||||
and HTTP. Conclude linking libguile. Say what one can find *for*.
|
||||
|
||||
|
@ -1454,7 +1604,7 @@
|
|||
* data-rep.texi, scheme-memory.texi (scm_remember_upto_here_1,
|
||||
scm_remember_upto_here_2): Moved from data-rep.texi to
|
||||
scheme-memory.texi.
|
||||
|
||||
|
||||
2003-10-02 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* scheme-io.texi (String Ports): In call-with-output-string, note proc
|
||||
|
@ -1785,7 +1935,7 @@
|
|||
remainder and modulo round their results.
|
||||
|
||||
* scheme-io.texi (Reading): In read-char and peek-char, fix typos "?"
|
||||
in @rnindex. In port-column, use @: after i.e.
|
||||
in @rnindex. In port-column, use @: after i.e.
|
||||
(Writing): In get-print-state, two spaces after full stop. Add write,
|
||||
revise display.
|
||||
|
||||
|
@ -1804,7 +1954,7 @@
|
|||
|
||||
2003-04-30 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* posix.texi (scm_c_port_for_each): Added.
|
||||
* posix.texi (scm_c_port_for_each): Added.
|
||||
|
||||
2003-04-26 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
|
@ -1935,7 +2085,7 @@
|
|||
Configuration.
|
||||
|
||||
The following doc updates are from Ian Sheldon - thanks!
|
||||
|
||||
|
||||
* scheme-data.texi (Appending Strings, Regexp Functions, Match
|
||||
Structures): Add examples.
|
||||
(Regular Expressions): Add instruction to use (ice-9 regex)
|
||||
|
@ -1973,7 +2123,7 @@
|
|||
|
||||
* intro.texi: Updated GNu ftp server name. Use "-lguile" instead
|
||||
of "libguile.a". Some small fixes/improvements.
|
||||
|
||||
|
||||
* scheme-reading.texi: Added www.schemers.org. Removed foldoc,
|
||||
it's too generic. Updated 'teach yourself ...' URL.
|
||||
|
||||
|
@ -1984,7 +2134,7 @@
|
|||
|
||||
2002-08-14 Marius Vollmer <mvo@zagadka.ping.de>
|
||||
|
||||
* scheme-evaluation.texi (eval-string): Updated.
|
||||
* scheme-evaluation.texi (eval-string): Updated.
|
||||
|
||||
* scheme-scheduling.texi (Fluids): Touched up a bit, added
|
||||
with-fluids.
|
||||
|
@ -2024,7 +2174,7 @@
|
|||
|
||||
* scheme-memory.texi (Memory Blocks): add scm_calloc, scm_gc_calloc.
|
||||
correct typos.
|
||||
|
||||
|
||||
2002-08-05 Marius Vollmer <marius.vollmer@uni-dortmund.de>
|
||||
|
||||
* intro.texi, srfi-modules.texi: Added (use-modules (ice-9
|
||||
|
@ -2068,7 +2218,7 @@
|
|||
rather than deprecated section. Hence this change. Added
|
||||
`@deftp' for scm_t_bits data type so that a proper index entry is
|
||||
added for this. Thanks to Richard Y. Kim!
|
||||
|
||||
|
||||
* data-rep.texi (Subrs): Changed scm_make_gsubr to
|
||||
scm_c_define_gsubr. Thanks to Richard Y. Kim!
|
||||
|
||||
|
@ -2105,13 +2255,13 @@
|
|||
|
||||
* scheme-debug.texi (Debugging): Rename chapter `Debugging
|
||||
Infrastructure' and reorganize its contents.
|
||||
|
||||
|
||||
* scheme-debug.texi (Debugging), scheme-control.texi (Handling
|
||||
Errors): Move display-error to error-focussed section.
|
||||
|
||||
* scheme-debug.texi (Debugging), debugging.texi (Backtrace): Move
|
||||
backtrace to user-level debugging chapter.
|
||||
|
||||
|
||||
* scheme-debug.texi (Debugging), scheme-procedures.texi (Procedure
|
||||
Properties): Move procedure-name, procedure-source and
|
||||
procedure-environment to procedures chapter.
|
||||
|
@ -2194,7 +2344,7 @@
|
|||
|
||||
* scheme-utility.texi (Hooks): Further updates. New material on
|
||||
GC hooks.
|
||||
|
||||
|
||||
* scheme-evaluation.texi (Fly Evaluation): Note disappearance of
|
||||
eval2 and read-and-eval!.
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
## Process this file with Automake to create Makefile.in
|
||||
##
|
||||
## Copyright (C) 1998, 2004, 2006 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998, 2004, 2006, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -86,7 +86,8 @@ include $(top_srcdir)/am/pre-inst-guile
|
|||
|
||||
autoconf.texi: autoconf-macros.texi
|
||||
autoconf-macros.texi: $(top_srcdir)/guile-config/guile.m4
|
||||
$(preinstguiletool)/snarf-guile-m4-docs $< > $(srcdir)/$@
|
||||
$(preinstguiletool)/snarf-guile-m4-docs $(top_srcdir)/guile-config/guile.m4 \
|
||||
> $(srcdir)/$@
|
||||
|
||||
lib-version.texi: $(top_srcdir)/GUILE-VERSION
|
||||
cat "$^" | grep '^LIBGUILE_.*_MAJOR' | \
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -1733,6 +1733,46 @@ The global random state used by the above functions when the
|
|||
@var{state} parameter is not given.
|
||||
@end defvar
|
||||
|
||||
Note that the initial value of @code{*random-state*} is the same every
|
||||
time Guile starts up. Therefore, if you don't pass a @var{state}
|
||||
parameter to the above procedures, and you don't set
|
||||
@code{*random-state*} to @code{(seed->random-state your-seed)}, where
|
||||
@code{your-seed} is something that @emph{isn't} the same every time,
|
||||
you'll get the same sequence of ``random'' numbers on every run.
|
||||
|
||||
For example, unless the relevant source code has changed, @code{(map
|
||||
random (cdr (iota 30)))}, if the first use of random numbers since
|
||||
Guile started up, will always give:
|
||||
|
||||
@lisp
|
||||
(map random (cdr (iota 19)))
|
||||
@result{}
|
||||
(0 1 1 2 2 2 1 2 6 7 10 0 5 3 12 5 5 12)
|
||||
@end lisp
|
||||
|
||||
To use the time of day as the random seed, you can use code like this:
|
||||
|
||||
@lisp
|
||||
(let ((time (gettimeofday)))
|
||||
(set! *random-state*
|
||||
(seed->random-state (+ (car time)
|
||||
(cdr time)))))
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
And then (depending on the time of day, of course):
|
||||
|
||||
@lisp
|
||||
(map random (cdr (iota 19)))
|
||||
@result{}
|
||||
(0 0 1 0 2 4 5 4 5 5 9 3 10 1 8 3 14 17)
|
||||
@end lisp
|
||||
|
||||
For security applications, such as password generation, you should use
|
||||
more bits of seed. Otherwise an open source password generator could
|
||||
be attacked by guessing the seed@dots{} but that's a subject for
|
||||
another manual.
|
||||
|
||||
|
||||
@node Characters
|
||||
@subsection Characters
|
||||
|
@ -4607,6 +4647,11 @@ immediately after creating the Scheme string. In certain cases, Guile
|
|||
can then use @var{str} directly as its internal representation.
|
||||
@end deftypefn
|
||||
|
||||
The size of a symbol can also be obtained from C:
|
||||
|
||||
@deftypefn {C Function} size_t scm_c_symbol_length (SCM sym)
|
||||
Return the number of characters in @var{sym}.
|
||||
@end deftypefn
|
||||
|
||||
Finally, some applications, especially those that generate new Scheme
|
||||
code dynamically, need to generate symbols for use in the generated
|
||||
|
@ -4861,7 +4906,7 @@ makes them easy to type.
|
|||
|
||||
Guile's keyword support conforms to R5RS, and adds a (switchable) read
|
||||
syntax extension to permit keywords to begin with @code{:} as well as
|
||||
@code{#:}.
|
||||
@code{#:}, or to end with @code{:}.
|
||||
|
||||
@menu
|
||||
* Why Use Keywords?:: Motivation for keyword usage.
|
||||
|
@ -5006,9 +5051,16 @@ If the @code{keyword} read option is set to @code{'prefix}, Guile also
|
|||
recognizes the alternative read syntax @code{:NAME}. Otherwise, tokens
|
||||
of the form @code{:NAME} are read as symbols, as required by R5RS.
|
||||
|
||||
@cindex SRFI-88 keyword syntax
|
||||
|
||||
If the @code{keyword} read option is set to @code{'postfix}, Guile
|
||||
recognizes the SRFI-88 read syntax @code{NAME:} (@pxref{SRFI-88}).
|
||||
Otherwise, tokens of this form are read as symbols.
|
||||
|
||||
To enable and disable the alternative non-R5RS keyword syntax, you use
|
||||
the @code{read-set!} procedure documented in @ref{User level options
|
||||
interfaces} and @ref{Reader options}.
|
||||
interfaces} and @ref{Reader options}. Note that the @code{prefix} and
|
||||
@code{postfix} syntax are mutually exclusive.
|
||||
|
||||
@smalllisp
|
||||
(read-set! keywords 'prefix)
|
||||
|
@ -5021,6 +5073,16 @@ interfaces} and @ref{Reader options}.
|
|||
@result{}
|
||||
#:type
|
||||
|
||||
(read-set! keywords 'postfix)
|
||||
|
||||
type:
|
||||
@result{}
|
||||
#:type
|
||||
|
||||
:type
|
||||
@result{}
|
||||
:type
|
||||
|
||||
(read-set! keywords #f)
|
||||
|
||||
#:type
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
@node Debugging
|
||||
@section Debugging Infrastructure
|
||||
|
||||
@cindex Debugging
|
||||
In order to understand Guile's debugging facilities, you first need to
|
||||
understand a little about how the evaluator works and what the Scheme
|
||||
stack is. With that in place we explain the low level trap calls that
|
||||
|
@ -17,9 +18,9 @@ infrastructure that builds on top of those calls.
|
|||
@menu
|
||||
* Evaluation Model:: Evaluation and the Scheme stack.
|
||||
* Debug on Error:: Debugging when an error occurs.
|
||||
* Low Level Trap Calls::
|
||||
* High Level Traps::
|
||||
* Traps::
|
||||
* Breakpoints::
|
||||
* Debugging Examples::
|
||||
@end menu
|
||||
|
||||
@node Evaluation Model
|
||||
|
@ -610,65 +611,8 @@ Invoke the Guile debugger to explore the context of the last error.
|
|||
@end deffn
|
||||
|
||||
|
||||
@node Low Level Trap Calls
|
||||
@subsection Low Level Trap Calls
|
||||
|
||||
@cindex Low level trap calls
|
||||
@cindex Evaluator trap calls
|
||||
Guile's evaluator can be configured to call the following four user-specified
|
||||
procedures at various points in its operation.
|
||||
|
||||
@table @dfn
|
||||
@item apply-frame-handler
|
||||
@item enter-frame-handler
|
||||
@item exit-frame-handler
|
||||
@item memoize-symbol-handler
|
||||
@end table
|
||||
|
||||
These procedures, and the circumstances under which the evaluator
|
||||
calls them, are configured by the ``evaluator trap options'' interface
|
||||
(@pxref{Evaluator trap options}), and by the @code{trace} and
|
||||
@code{breakpoints} fields of the ``debug options'' interface
|
||||
(@pxref{Debugger options}).
|
||||
|
||||
It is not necessary to understand the fine details of these low level
|
||||
calls, and of the options which configure them, in order to use the
|
||||
class-based trap interface effectively. @code{guile-debugging} takes
|
||||
care of setting these options as required for whatever set of
|
||||
installed trap objects the user specifies.@footnote{And consequently,
|
||||
when using the class-based trap interface, users/applications should
|
||||
@emph{not} modify these options themselves, to avoid interfering with
|
||||
@code{guile-debugging}'s option settings.} It is useful, though, to
|
||||
have a overall idea of how the evaluator works and when these low
|
||||
level calls can happen, as follows.
|
||||
|
||||
@cindex Frame entry
|
||||
@cindex Frame exit
|
||||
On the basis of this description, we can now specify the points where
|
||||
low level trap calls may occur (subject to configuration). Namely,
|
||||
whenever a new frame is added to the stack, because the evaluator is
|
||||
about to begin a new evaluation or to perform a new application, and
|
||||
whenever a frame is being removed from the stack because the
|
||||
computation that it refers to has completed and is returning its
|
||||
value@footnote{If this raises the question of how expressions with
|
||||
no return value are handled, the answer is that all computations in
|
||||
Guile return a value. Those that appear to have no return value do so
|
||||
by using the special @code{*unspecified*} value, which the Guile REPL
|
||||
avoids displaying to the user.} to its caller.
|
||||
|
||||
@deffn {Scheme Procedure} with-traps thunk
|
||||
@deffnx {C Function} scm_with_traps (thunk)
|
||||
Call @var{thunk} with traps enabled.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} debug-object? obj
|
||||
@deffnx {C Function} scm_debug_object_p (obj)
|
||||
Return @code{#t} if @var{obj} is a debug object.
|
||||
@end deffn
|
||||
|
||||
|
||||
@node High Level Traps
|
||||
@subsection High Level Traps
|
||||
@node Traps
|
||||
@subsection Traps
|
||||
|
||||
@cindex Traps
|
||||
@cindex Evaluator trap calls
|
||||
|
@ -678,29 +622,33 @@ Return @code{#t} if @var{obj} is a debug object.
|
|||
@cindex Code coverage
|
||||
@cindex Profiling
|
||||
The low level C code of Guile's evaluator can be configured to call
|
||||
out at key points to arbitrary user-specified code. In principle this
|
||||
allows Scheme code to implement any model it chooses for examining the
|
||||
evaluation stack as program execution proceeds, and for suspending
|
||||
execution to be resumed later. Possible applications of this feature
|
||||
include breakpoints, runtime tracing, code coverage, and profiling.
|
||||
out at key points to arbitrary user-specified procedures. These
|
||||
procedures, and the circumstances under which the evaluator calls
|
||||
them, are configured by the ``evaluator trap options'' interface
|
||||
(@pxref{Evaluator trap options}), and by the @code{trace} and
|
||||
@code{breakpoints} fields of the ``debug options'' interface
|
||||
(@pxref{Debugger options}). In principle this allows Scheme code to
|
||||
implement any model it chooses for examining the evaluation stack as
|
||||
program execution proceeds, and for suspending execution to be resumed
|
||||
later. Possible applications of this feature include breakpoints,
|
||||
runtime tracing, code coverage, and profiling.
|
||||
|
||||
@cindex Trap classes
|
||||
@cindex Trap objects
|
||||
Based on these low level trap calls, the enhancements described here
|
||||
provide a much higher level, object-oriented interface for the
|
||||
manipulation of traps. Different kinds of trap are represented as
|
||||
GOOPS classes; for example, the @code{<procedure-trap>} class
|
||||
describes traps that are triggered by invocation of a specified
|
||||
procedure. A particular instance of a trap class --- or @dfn{trap
|
||||
object} --- describes the condition under which a single trap will be
|
||||
triggered, and what will happen then; for example, an instance of
|
||||
@code{<procedure-trap>} whose @code{procedure} and @code{behaviour}
|
||||
slots contain @code{my-factorial} and @code{debug-trap} would be a
|
||||
trap that enters the command line debugger when the
|
||||
@code{my-factorial} procedure is invoked.
|
||||
Based on these low level trap calls, Guile provides a higher level,
|
||||
object-oriented interface for the manipulation of traps. Different
|
||||
kinds of trap are represented as GOOPS classes; for example, the
|
||||
@code{<procedure-trap>} class describes traps that are triggered by
|
||||
invocation of a specified procedure. A particular instance of a trap
|
||||
class --- or @dfn{trap object} --- describes the condition under which
|
||||
a single trap will be triggered, and what will happen then; for
|
||||
example, an instance of @code{<procedure-trap>} whose @code{procedure}
|
||||
and @code{behaviour} slots contain @code{my-factorial} and
|
||||
@code{debug-trap} would be a trap that enters the command line
|
||||
debugger when the @code{my-factorial} procedure is invoked.
|
||||
|
||||
The following subsubsections describe all this in greater detail, for both
|
||||
the user wanting to use traps, and the developer interested in
|
||||
The following subsections describe all this in detail, for both the
|
||||
user wanting to use traps, and the developer interested in
|
||||
understanding how the interface hangs together.
|
||||
|
||||
|
||||
|
@ -813,8 +761,8 @@ shorthands for setting common kinds of traps. @xref{Trap Shorthands},
|
|||
for some examples.
|
||||
|
||||
The ability to install, uninstall and reinstall a trap without losing
|
||||
its definition is @code{guile-debugging}'s equivalent of the
|
||||
disable/enable commands provided by debuggers like GDB.
|
||||
its definition is Guile's equivalent of the disable/enable commands
|
||||
provided by debuggers like GDB.
|
||||
|
||||
@deffn {Generic Function} install-trap trap
|
||||
Install the trap object @var{trap}, so that its behaviour will be
|
||||
|
@ -832,9 +780,9 @@ met.
|
|||
@subsubsection Specifying Trap Behaviour
|
||||
|
||||
@cindex Trap behaviour
|
||||
@code{guile-debugging} provides several ``out-of-the-box'' behaviours
|
||||
for common needs. All of the following can be used directly as the
|
||||
value of the @code{#:behaviour} option when creating a trap object.
|
||||
Guile provides several ``out-of-the-box'' behaviours for common needs.
|
||||
All of the following can be used directly as the value of the
|
||||
@code{#:behaviour} option when creating a trap object.
|
||||
|
||||
@deffn {Procedure} debug-trap trap-context
|
||||
Enter Guile's command line debugger to explore the stack at
|
||||
|
@ -1179,9 +1127,9 @@ guile> (rev '(a b c))
|
|||
@node Tracing and (ice-9 debug)
|
||||
@subsubsection Tracing and (ice-9 debug)
|
||||
|
||||
The @code{(ice-9 debug)} module of the core Guile distribution
|
||||
provides a tracing facility that is roughly similar to that described
|
||||
here, but there are important differences.
|
||||
The @code{(ice-9 debug)} module provides a tracing facility
|
||||
(@pxref{Tracing}) that is roughly similar to that described here, but
|
||||
there are important differences.
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
|
@ -1202,35 +1150,30 @@ in stack depth, by using indentation like this:
|
|||
@end lisp
|
||||
|
||||
However its output can @emph{only} show the information seen here,
|
||||
which corresponds to @code{guile-debugging}'s @code{trace/info}
|
||||
procedure; it cannot be configured to show other pieces of information
|
||||
about the trap context in the way that @code{guile-debugging}'s trace
|
||||
feature can.
|
||||
which corresponds to @code{(ice-9 debugging trace)}'s
|
||||
@code{trace/info} procedure; it cannot be configured to show other
|
||||
pieces of information about the trap context in the way that the
|
||||
@code{(ice-9 debugging trace)} implementation can.
|
||||
|
||||
@item
|
||||
The @code{(ice-9 debug)} trace only allows the tracing of procedure
|
||||
applications and their return values, whereas @code{guile-debugging}'s
|
||||
trace allows any kind of trap to be traced.
|
||||
applications and their return values, whereas the @code{(ice-9 debugging
|
||||
trace)} implementation allows any kind of trap to be traced.
|
||||
|
||||
It's interesting to note that @code{(ice-9 debug)}'s restriction here,
|
||||
which might initially appear to be just a straightforward consequence
|
||||
of its implementation, is also somewhat dictated by its pictorial
|
||||
display. The use of indentation in the output relies on hooking into
|
||||
the low level trap calls in such a way that the trapped application
|
||||
entries and exits exactly balance each other.
|
||||
@code{guile-debugging}'s more general traps interface allows traps to
|
||||
be installed such that entry and exit traps don't necessarily balance,
|
||||
which means that, in general, indentation diagrams like the one above
|
||||
don't work.
|
||||
entries and exits exactly balance each other. The @code{ice-9
|
||||
debugging trace} implementation allows traps to be installed such that
|
||||
entry and exit traps don't necessarily balance, which means that, in
|
||||
general, indentation diagrams like the one above don't work.
|
||||
@end itemize
|
||||
|
||||
It isn't currently possible to use both @code{(ice-9 debug)} trace and
|
||||
@code{guile-debugging} in the same Guile session, because their settings
|
||||
of the low level trap options conflict with each other. (It should be
|
||||
possible to fix this, by modifying @code{(ice-9 debug)} to use
|
||||
@code{guile-debugging}'s trap installation interface, but only if and
|
||||
when @code{guile-debugging} is integrated into the core Guile
|
||||
distribution.)
|
||||
@code{(ice-9 debugging trace)} in the same Guile session, because
|
||||
their settings of the low level trap options conflict with each other.
|
||||
|
||||
|
||||
@node Traps Installing More Traps
|
||||
|
@ -1456,9 +1399,9 @@ user would intuitively think of as single-stepping through their code,
|
|||
either through code in general (roughly corresponding to GDB's
|
||||
@code{step} command, for example), or through code from a particular
|
||||
source file (roughly corresponding to GDB's @code{next}). Therefore
|
||||
if you are using @code{guile-debugging} to single-step through code
|
||||
and finding its behaviour counter-intuitive, please let me know so
|
||||
that I can improve it.
|
||||
if you are using a step trap to single-step through code and finding
|
||||
its behaviour counter-intuitive, please report that so we can improve
|
||||
it.
|
||||
|
||||
The implementation and options of the @code{<step-trap>} class are
|
||||
complicated by the fact that it is unreliable to determine whether a
|
||||
|
@ -1620,16 +1563,16 @@ following subsubsection.
|
|||
@subsubsection Location Traps
|
||||
|
||||
The @code{<location-trap>} class implements traps that are triggered
|
||||
by evaluation of code at a specific source location or within a
|
||||
specified range of source locations. When compared with source traps,
|
||||
they are easier to set, and do not become irrelevant when the relevant
|
||||
code is reloaded; but unfortunately they are considerably less
|
||||
efficient, as they require running some ``are we in the right place
|
||||
for a trap'' code on every low level frame entry trap call.
|
||||
by evaluation of code at a specific source location. When compared
|
||||
with source traps, they are easier to set, and do not become
|
||||
irrelevant when the relevant code is reloaded; but unfortunately they
|
||||
are a lot less efficient, as they require running some ``are we in the
|
||||
right place for a trap'' code on every low level frame entry trap
|
||||
call.
|
||||
|
||||
@deffn {Class} <location-trap>
|
||||
Class for traps triggered by evaluation of code at a specific source
|
||||
location or in a specified range of source locations.
|
||||
location.
|
||||
@end deffn
|
||||
|
||||
@deffn {Trap Option} #:file-regexp regexp
|
||||
|
@ -1637,31 +1580,27 @@ A regular expression specifying the filenames that will match this
|
|||
trap. This option must be specified when creating a location trap.
|
||||
@end deffn
|
||||
|
||||
@deffn {Trap Option} #:line line-spec
|
||||
If specified, @var{line-spec} describes either a single line, in which
|
||||
case it is a single integer, or a range of lines, in which case it is
|
||||
a pair of the form @code{(@var{min-line} . @var{max-line})}. All line
|
||||
numbers are 0-based, and the range form is inclusive-inclusive. If
|
||||
@code{#f} or not specified, the trap is not restricted by line number.
|
||||
(Default value @code{#f}.)
|
||||
@deffn {Trap Option} #:line line
|
||||
The line number (0-based) of the source location at which the trap
|
||||
should be triggered. This option must be specified when creating a
|
||||
location trap.
|
||||
@end deffn
|
||||
|
||||
@deffn {Trap Option} #:column column-spec
|
||||
If specified, @var{column-spec} describes either a single column, in
|
||||
which case it is a single integer, or a range of columns, in which
|
||||
case it is a pair of the form @code{(@var{min-column}
|
||||
. @var{max-column})}. All column numbers are 0-based, and the range
|
||||
form is inclusive-inclusive. If @code{#f} or not specified, the trap
|
||||
is not restricted by column number. (Default value @code{#f}.)
|
||||
@deffn {Trap Option} #:column column
|
||||
The column number (0-based) of the source location at which the trap
|
||||
should be triggered. This option must be specified when creating a
|
||||
location trap.
|
||||
@end deffn
|
||||
|
||||
@noindent
|
||||
Example:
|
||||
Here is an example, which matches the @code{(facti (- n 1) (* a n))}
|
||||
expression in @file{ice-9/debugging/example-fns.scm}:
|
||||
|
||||
@lisp
|
||||
(install-trap (make <location-trap>
|
||||
#:file-regexp "example-fns.scm"
|
||||
#:line '(11 . 13)
|
||||
#:line 11
|
||||
#:column 6
|
||||
#:behaviour gds-debug-trap))
|
||||
@end lisp
|
||||
|
||||
|
@ -1672,8 +1611,7 @@ Example:
|
|||
If the code described in the preceding subsubsections for creating and
|
||||
manipulating traps seems a little long-winded, it is of course
|
||||
possible to define more convenient shorthand forms for typical usage
|
||||
patterns. For example, my own @file{.guile} file contains the
|
||||
following definitions for setting breakpoints and for tracing.
|
||||
patterns. Here are some examples.
|
||||
|
||||
@lisp
|
||||
(define (break! proc)
|
||||
|
@ -1694,11 +1632,11 @@ following definitions for setting breakpoints and for tracing.
|
|||
trace-until-exit))))
|
||||
@end lisp
|
||||
|
||||
Definitions like these are not provided out-of-the-box by
|
||||
@code{guile-debugging}, because different users will have different
|
||||
ideas about what their default debugger should be, or, for example,
|
||||
which of the common trap options (@pxref{Common Trap Options}) it
|
||||
might be useful to expose through such shorthand procedures.
|
||||
Definitions like these are not provided out-of-the-box by Guile,
|
||||
because different users will have different ideas about what their
|
||||
default debugger should be, or, for example, which of the common trap
|
||||
options (@pxref{Common Trap Options}) it might be useful to expose
|
||||
through such shorthand procedures.
|
||||
|
||||
|
||||
@node Trap Utilities
|
||||
|
@ -1760,12 +1698,11 @@ While they are an important piece of infrastructure, and directly
|
|||
usable in some scenarios, traps are still too low level to meet some
|
||||
of the requirements of interactive development.
|
||||
|
||||
For example, in my experience a common scenario is that a newly
|
||||
written procedure is not working properly, and so you'd like to be
|
||||
able to step or trace through its code to find out why. Ideally this
|
||||
should be possible from the IDE and without having to modify the
|
||||
source code. There are two problems with using traps directly in this
|
||||
scenario.
|
||||
A common scenario is that a newly written procedure is not working
|
||||
properly, and so you'd like to be able to step or trace through its
|
||||
code to find out why. Ideally this should be possible from the IDE
|
||||
and without having to modify the source code. There are two problems
|
||||
with using traps directly in this scenario.
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
|
@ -1885,6 +1822,216 @@ be managed through GDS. For the details of GDS's breakpoints
|
|||
interface, see @ref{Setting and Managing Breakpoints}.
|
||||
|
||||
|
||||
@node Debugging Examples
|
||||
@subsection Debugging Examples
|
||||
|
||||
Here we present some examples of what you can do with the debugging
|
||||
facilities just described.
|
||||
|
||||
@menu
|
||||
* Single Stepping through a Procedure's Code::
|
||||
* Profiling or Tracing a Procedure's Code::
|
||||
@end menu
|
||||
|
||||
|
||||
@node Single Stepping through a Procedure's Code
|
||||
@subsubsection Single Stepping through a Procedure's Code
|
||||
|
||||
A good way to explore in detail what a Scheme procedure does is to set
|
||||
a trap on it and then single step through what it does. To do this,
|
||||
make and install a @code{<procedure-trap>} with the @code{debug-trap}
|
||||
behaviour from @code{(ice-9 debugging ice-9-debugger-extensions)}.
|
||||
|
||||
The following sample session illustrates this. It assumes that the
|
||||
file @file{matrix.scm} defines a procedure @code{mkmatrix}, which is
|
||||
the one we want to explore, and another procedure @code{do-main} which
|
||||
calls @code{mkmatrix}.
|
||||
|
||||
@lisp
|
||||
$ /usr/bin/guile -q
|
||||
guile> (use-modules (ice-9 debugger)
|
||||
(ice-9 debugging ice-9-debugger-extensions)
|
||||
(ice-9 debugging traps))
|
||||
guile> (load "matrix.scm")
|
||||
guile> (install-trap (make <procedure-trap>
|
||||
#:procedure mkmatrix
|
||||
#:behaviour debug-trap))
|
||||
guile> (do-main 4)
|
||||
This is the Guile debugger -- for help, type `help'.
|
||||
There are 3 frames on the stack.
|
||||
|
||||
Frame 2 at matrix.scm:8:3
|
||||
[mkmatrix]
|
||||
debug> next
|
||||
Frame 3 at matrix.scm:4:3
|
||||
(let ((x 1)) (quote this-is-a-matric))
|
||||
debug> info frame
|
||||
Stack frame: 3
|
||||
This frame is an evaluation.
|
||||
The expression being evaluated is:
|
||||
matrix.scm:4:3:
|
||||
(let ((x 1)) (quote this-is-a-matric))
|
||||
debug> next
|
||||
Frame 3 at matrix.scm:5:21
|
||||
(quote this-is-a-matric)
|
||||
debug> bt
|
||||
In unknown file:
|
||||
?: 0* [primitive-eval (do-main 4)]
|
||||
In standard input:
|
||||
4: 1* [do-main 4]
|
||||
In matrix.scm:
|
||||
8: 2 [mkmatrix]
|
||||
...
|
||||
5: 3 (quote this-is-a-matric)
|
||||
debug> quit
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
Or you can use Guile's Emacs interface (GDS), by using the module
|
||||
@code{(ice-9 gds-client)} instead of @code{(ice-9 debugger)} and
|
||||
@code{(ice-9 debugging ice-9-debugger-extensions)}, and changing
|
||||
@code{debug-trap} to @code{gds-debug-trap}. Then the stack and
|
||||
corresponding source locations are displayed in Emacs instead of on
|
||||
the Guile command line.
|
||||
|
||||
|
||||
@node Profiling or Tracing a Procedure's Code
|
||||
@subsubsection Profiling or Tracing a Procedure's Code
|
||||
|
||||
What if you wanted to get a trace of everything that the Guile
|
||||
evaluator does within a given procedure, but without Guile stopping
|
||||
and waiting for your input at every step? For this requirement you
|
||||
can install a trap on the procedure, as in the previous example, but
|
||||
instead of @code{debug-trap} or @code{gds-debug-trap}, use the
|
||||
@code{trace-trap} and @code{trace-until-exit} behaviours provided by
|
||||
the @code{(ice-9 debugging trace)} module.
|
||||
|
||||
@lisp
|
||||
guile> (use-modules (ice-9 debugging traps) (ice-9 debugging trace))
|
||||
guile> (load "matrix.scm")
|
||||
guile> (install-trap (make <procedure-trap>
|
||||
#:procedure mkmatrix
|
||||
#:behaviour (list trace-trap trace-until-exit)))
|
||||
guile> (do-main 4)
|
||||
| 2: [mkmatrix]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> define #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> define #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq define (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> define #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> define #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq define (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 2: (letrec ((yy 23)) (let ((x 1)) (quote this-is-a-matric)))
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 2: (let ((x 1)) (quote this-is-a-matric))
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 3: [#<procedure #f (a sym definep)> #<autoload # b7c93870> let #f]
|
||||
| 4: (and (memq sym bindings) (let ...))
|
||||
| 5: (memq sym bindings)
|
||||
| 5: [memq let (debug)]
|
||||
| 5: =>#f
|
||||
| 2: [let (let # #) (# # #)]
|
||||
| 2: [let (let # #) (# # #)]
|
||||
| 2: =>(#@@let* (x 1) #@@let (quote this-is-a-matric))
|
||||
this-is-a-matric
|
||||
guile> (do-main 4)
|
||||
| 2: [mkmatrix]
|
||||
| 2: (letrec ((yy 23)) (let* ((x 1)) (quote this-is-a-matric)))
|
||||
| 2: (let* ((x 1)) (quote this-is-a-matric))
|
||||
| 2: (quote this-is-a-matric)
|
||||
| 2: =>this-is-a-matric
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
This example shows the default configuration for how each line of trace
|
||||
output is formatted, which is:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
the character @code{|}, a visual clue that the line is a line of trace
|
||||
output, followed by
|
||||
|
||||
@item
|
||||
a number indicating the real evaluator stack depth (where ``real'' means
|
||||
not counting tail-calls), followed by
|
||||
|
||||
@item
|
||||
a summary of the expression being evaluated (@code{(@dots{})}), the
|
||||
procedure being called (@code{[@dots{}]}), or the value being returned
|
||||
from an evaluation or procedure call (@code{=>@dots{}}).
|
||||
@end itemize
|
||||
|
||||
@noindent
|
||||
You can customize @code{(ice-9 debugging trace)} to show different
|
||||
information in each trace line using the @code{set-trace-layout}
|
||||
procedure. The next example shows how to get the source location in
|
||||
each trace line instead of the stack depth.
|
||||
|
||||
@lisp
|
||||
guile> (set-trace-layout "|~16@@a: ~a\n" trace/source trace/info)
|
||||
guile> (do-main 4)
|
||||
| matrix.scm:7:2: [mkmatrix]
|
||||
| : (letrec ((yy 23)) (let* ((x 1)) (quote this-is-a-matric)))
|
||||
| matrix.scm:3:2: (let* ((x 1)) (quote this-is-a-matric))
|
||||
| matrix.scm:4:4: (quote this-is-a-matric)
|
||||
| matrix.scm:4:4: =>this-is-a-matric
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
(For anyone wondering why the first @code{(do-main 4)} call above
|
||||
generates lots more trace lines than the subsequent calls: these
|
||||
examples also demonstrate how the Guile evaluator ``memoizes'' code.
|
||||
When Guile evaluates a source code expression for the first time, it
|
||||
changes some parts of the expression so that they will be quicker to
|
||||
evaluate when that expression is evaluated again; this is called
|
||||
memoization. The trace output from the first @code{(do-main 4)} call
|
||||
shows memoization steps, such as an internal define being transformed to
|
||||
a letrec.)
|
||||
|
||||
|
||||
@c Local Variables:
|
||||
@c TeX-master: "guile.texi"
|
||||
@c End:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2008
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -329,12 +329,12 @@ Signal error if module name is not resolvable.
|
|||
|
||||
|
||||
@c FIXME::martin: Is this correct, and is there more to say?
|
||||
@c FIXME::martin: Define term and concept `system transformer' somewhere.
|
||||
@c FIXME::martin: Define term and concept `syntax transformer' somewhere.
|
||||
|
||||
@deffn syntax use-syntax module-name
|
||||
Load the module @code{module-name} and use its system
|
||||
transformer as the system transformer for the currently defined module,
|
||||
as well as installing it as the current system transformer.
|
||||
Load the module @code{module-name} and use its syntax
|
||||
transformer as the syntax transformer for the currently defined module,
|
||||
as well as installing it as the current syntax transformer.
|
||||
@end deffn
|
||||
|
||||
@deffn syntax @@ module-name binding-name
|
||||
|
@ -679,7 +679,7 @@ Guile starts up.
|
|||
|
||||
@item (ice-9 debug)
|
||||
Mikael Djurfeldt's source-level debugging support for Guile
|
||||
(@pxref{Debugging Features}).
|
||||
(@pxref{Tracing}).
|
||||
|
||||
@item (ice-9 expect)
|
||||
Actions based on matching input from a port (@pxref{Expect}).
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -491,7 +491,7 @@ Here is the list of reader options generated by typing
|
|||
values.
|
||||
|
||||
@smalllisp
|
||||
keywords #f Style of keyword recognition: #f or 'prefix
|
||||
keywords #f Style of keyword recognition: #f, 'prefix or 'postfix
|
||||
case-insensitive no Convert symbols to lower case.
|
||||
positions yes Record positions of source code expressions.
|
||||
copy no Copy source code expressions.
|
||||
|
@ -613,7 +613,6 @@ way.
|
|||
@var{retval} is the return value.
|
||||
@end deffn
|
||||
|
||||
|
||||
@deffn memoize-symbol-handler key cont expression env
|
||||
Called when the evaluator memoizes the value of a procedure symbol
|
||||
|
||||
|
@ -626,6 +625,16 @@ way.
|
|||
@var{retval} is the return value.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} with-traps thunk
|
||||
@deffnx {C Function} scm_with_traps (thunk)
|
||||
Call @var{thunk} with traps enabled.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} debug-object? obj
|
||||
@deffnx {C Function} scm_debug_object_p (obj)
|
||||
Return @code{#t} if @var{obj} is a debug object.
|
||||
@end deffn
|
||||
|
||||
|
||||
@node Debugger options
|
||||
@subsubsection Debugger options
|
||||
|
@ -720,7 +729,7 @@ ABORT: (misc-error)
|
|||
|
||||
Type "(backtrace)" to get more information.
|
||||
guile> (read-options 'help)
|
||||
keywords #f Style of keyword recognition: #f or 'prefix
|
||||
keywords #f Style of keyword recognition: #f, 'prefix or 'postfix
|
||||
case-insensitive no Convert symbols to lower case.
|
||||
positions yes Record positions of source code expressions.
|
||||
copy no Copy source code expressions.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -90,8 +90,8 @@ execution and triggering this execution. They will not be executed
|
|||
automatically.
|
||||
|
||||
@menu
|
||||
* System asyncs::
|
||||
* User asyncs::
|
||||
* System asyncs::
|
||||
* User asyncs::
|
||||
@end menu
|
||||
|
||||
@node System asyncs
|
||||
|
@ -267,11 +267,24 @@ Once @var{body} or @var{handler} returns, the return value is made the
|
|||
@emph{exit value} of the thread and the thread is terminated.
|
||||
@end deftypefn
|
||||
|
||||
@deffn {Scheme Procedure} thread? obj
|
||||
@deffnx {C Function} scm_thread_p (obj)
|
||||
Return @code{#t} iff @var{obj} is a thread; otherwise, return
|
||||
@code{#f}.
|
||||
@end deffn
|
||||
|
||||
@c begin (texi-doc-string "guile" "join-thread")
|
||||
@deffn {Scheme Procedure} join-thread thread
|
||||
@deffn {Scheme Procedure} join-thread thread [timeout [timeoutval]]
|
||||
@deffnx {C Function} scm_join_thread (thread)
|
||||
@deffnx {C Function} scm_join_thread_timed (thread, timeout, timeoutval)
|
||||
Wait for @var{thread} to terminate and return its exit value. Threads
|
||||
that have not been created with @code{call-with-new-thread} or
|
||||
@code{scm_spawn_thread} have an exit value of @code{#f}.
|
||||
@code{scm_spawn_thread} have an exit value of @code{#f}. When
|
||||
@var{timeout} is given, it specifies a point in time where the waiting
|
||||
should be aborted. It can be either an integer as returned by
|
||||
@code{current-time} or a pair as returned by @code{gettimeofday}.
|
||||
When the waiting is aborted, @var{timeoutval} is returned (if it is
|
||||
specified; @code{#f} is returned otherwise).
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} thread-exited? thread
|
||||
|
@ -285,6 +298,42 @@ If one or more threads are waiting to execute, calling yield forces an
|
|||
immediate context switch to one of them. Otherwise, yield has no effect.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} cancel-thread thread
|
||||
@deffnx {C Function} scm_cancel_thread (thread)
|
||||
Asynchronously notify @var{thread} to exit. Immediately after
|
||||
receiving this notification, @var{thread} will call its cleanup handler
|
||||
(if one has been set) and then terminate, aborting any evaluation that
|
||||
is in progress.
|
||||
|
||||
Because Guile threads are isomorphic with POSIX threads, @var{thread}
|
||||
will not receive its cancellation signal until it reaches a cancellation
|
||||
point. See your operating system's POSIX threading documentation for
|
||||
more information on cancellation points; note that in Guile, unlike
|
||||
native POSIX threads, a thread can receive a cancellation notification
|
||||
while attempting to lock a mutex.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} set-thread-cleanup! thread proc
|
||||
@deffnx {C Function} scm_set_thread_cleanup_x (thread, proc)
|
||||
Set @var{proc} as the cleanup handler for the thread @var{thread}.
|
||||
@var{proc}, which must be a thunk, will be called when @var{thread}
|
||||
exits, either normally or by being canceled. Thread cleanup handlers
|
||||
can be used to perform useful tasks like releasing resources, such as
|
||||
locked mutexes, when thread exit cannot be predicted.
|
||||
|
||||
The return value of @var{proc} will be set as the @emph{exit value} of
|
||||
@var{thread}.
|
||||
|
||||
To remove a cleanup handler, pass @code{#f} for @var{proc}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} thread-cleanup thread
|
||||
@deffnx {C Function} scm_thread_cleanup (thread)
|
||||
Return the cleanup handler currently installed for the thread
|
||||
@var{thread}. If no cleanup handler is currently installed,
|
||||
thread-cleanup returns @code{#f}.
|
||||
@end deffn
|
||||
|
||||
Higher level thread procedures are available by loading the
|
||||
@code{(ice-9 threads)} module. These provide standardized
|
||||
thread creation.
|
||||
|
@ -326,20 +375,54 @@ Acquiring requisite mutexes in a fixed order (like always A before B)
|
|||
in all threads is one way to avoid such problems.
|
||||
|
||||
@sp 1
|
||||
@deffn {Scheme Procedure} make-mutex
|
||||
@deffn {Scheme Procedure} make-mutex . flags
|
||||
@deffnx {C Function} scm_make_mutex ()
|
||||
Return a new standard mutex. It is initially unlocked.
|
||||
@deffnx {C Function} scm_make_mutex_with_flags (SCM flags)
|
||||
Return a new mutex. It is initially unlocked. If @var{flags} is
|
||||
specified, it must be a list of symbols specifying configuration flags
|
||||
for the newly-created mutex. The supported flags are:
|
||||
@table @code
|
||||
@item unchecked-unlock
|
||||
Unless this flag is present, a call to `unlock-mutex' on the returned
|
||||
mutex when it is already unlocked will cause an error to be signalled.
|
||||
|
||||
@item allow-external-unlock
|
||||
Allow the returned mutex to be unlocked by the calling thread even if
|
||||
it was originally locked by a different thread.
|
||||
|
||||
@item recursive
|
||||
The returned mutex will be recursive.
|
||||
|
||||
@end table
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} mutex? obj
|
||||
@deffnx {C Function} scm_mutex_p (obj)
|
||||
Return @code{#t} iff @var{obj} is a mutex; otherwise, return
|
||||
@code{#f}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} make-recursive-mutex
|
||||
@deffnx {C Function} scm_make_recursive_mutex ()
|
||||
Create a new recursive mutex. It is initialloy unlocked.
|
||||
Create a new recursive mutex. It is initially unlocked. Calling this
|
||||
function is equivalent to calling `make-mutex' and specifying the
|
||||
@code{recursive} flag.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} lock-mutex mutex
|
||||
@deffn {Scheme Procedure} lock-mutex mutex [timeout [owner]]
|
||||
@deffnx {C Function} scm_lock_mutex (mutex)
|
||||
Lock @var{mutex}. If the mutex is already locked by another thread
|
||||
then block and return only when @var{mutex} has been acquired.
|
||||
@deffnx {C Function} scm_lock_mutex_timed (mutex, timeout, owner)
|
||||
Lock @var{mutex}. If the mutex is already locked, then block and
|
||||
return only when @var{mutex} has been acquired.
|
||||
|
||||
When @var{timeout} is given, it specifies a point in time where the
|
||||
waiting should be aborted. It can be either an integer as returned
|
||||
by @code{current-time} or a pair as returned by @code{gettimeofday}.
|
||||
When the waiting is aborted, @code{#f} is returned.
|
||||
|
||||
When @var{owner} is given, it specifies an owner for @var{mutex} other
|
||||
than the calling thread. @var{owner} may also be @code{#f},
|
||||
indicating that the mutex should be locked but left unowned.
|
||||
|
||||
For standard mutexes (@code{make-mutex}), and error is signalled if
|
||||
the thread has itself already locked @var{mutex}.
|
||||
|
@ -349,6 +432,10 @@ itself already locked @var{mutex}, then a further @code{lock-mutex}
|
|||
call increments the lock count. An additional @code{unlock-mutex}
|
||||
will be required to finally release.
|
||||
|
||||
If @var{mutex} was locked by a thread that exited before unlocking it,
|
||||
the next attempt to lock @var{mutex} will succeed, but
|
||||
@code{abandoned-mutex-error} will be signalled.
|
||||
|
||||
When a system async (@pxref{System asyncs}) is activated for a thread
|
||||
blocked in @code{lock-mutex}, the wait is interrupted and the async is
|
||||
executed. When the async returns, the wait resumes.
|
||||
|
@ -367,10 +454,46 @@ If @var{mutex} is locked by some other thread then nothing is done and
|
|||
the return is @code{#f}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} unlock-mutex mutex
|
||||
@deffn {Scheme Procedure} unlock-mutex mutex [condvar [timeout]]
|
||||
@deffnx {C Function} scm_unlock_mutex (mutex)
|
||||
Unlock @var{mutex}. An error is signalled if @var{mutex} is not
|
||||
locked by the calling thread.
|
||||
@deffnx {C Function} scm_unlock_mutex_timed (mutex, condvar, timeout)
|
||||
Unlock @var{mutex}. An error is signalled if @var{mutex} is not locked
|
||||
and was not created with the @code{unchecked-unlock} flag set, or if
|
||||
@var{mutex} is locked by a thread other than the calling thread and was
|
||||
not created with the @code{allow-external-unlock} flag set.
|
||||
|
||||
If @var{condvar} is given, it specifies a condition variable upon
|
||||
which the calling thread will wait to be signalled before returning.
|
||||
(This behavior is very similar to that of
|
||||
@code{wait-condition-variable}, except that the mutex is left in an
|
||||
unlocked state when the function returns.)
|
||||
|
||||
When @var{timeout} is also given, it specifies a point in time where
|
||||
the waiting should be aborted. It can be either an integer as
|
||||
returned by @code{current-time} or a pair as returned by
|
||||
@code{gettimeofday}. When the waiting is aborted, @code{#f} is
|
||||
returned. Otherwise the function returns @code{#t}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} mutex-owner mutex
|
||||
@deffnx {C Function} scm_mutex_owner (mutex)
|
||||
Return the current owner of @var{mutex}, in the form of a thread or
|
||||
@code{#f} (indicating no owner). Note that a mutex may be unowned but
|
||||
still locked.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} mutex-level mutex
|
||||
@deffnx {C Function} scm_mutex_level (mutex)
|
||||
Return the current lock level of @var{mutex}. If @var{mutex} is
|
||||
currently unlocked, this value will be 0; otherwise, it will be the
|
||||
number of times @var{mutex} has been recursively locked by its current
|
||||
owner.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} mutex-locked? mutex
|
||||
@deffnx {C Function} scm_mutex_locked_p (mutex)
|
||||
Return @code{#t} if @var{mutex} is locked, regardless of ownership;
|
||||
otherwise, return @code{#f}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} make-condition-variable
|
||||
|
@ -378,6 +501,12 @@ locked by the calling thread.
|
|||
Return a new condition variable.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} condition-variable? obj
|
||||
@deffnx {C Function} scm_condition_variable_p (obj)
|
||||
Return @code{#t} iff @var{obj} is a condition variable; otherwise,
|
||||
return @code{#f}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} wait-condition-variable condvar mutex [time]
|
||||
@deffnx {C Function} scm_wait_condition_variable (condvar, mutex, time)
|
||||
Wait until @var{condvar} has been signalled. While waiting,
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
@node Autoconf Support
|
||||
@chapter Autoconf Support
|
||||
|
||||
When Guile is installed, a set of autoconf macros is also installed as
|
||||
PREFIX/share/aclocal/guile.m4. This chapter documents the macros provided in
|
||||
that file, as well as the high-level guile-tool Autofrisk. @xref{Top,The GNU
|
||||
Autoconf Manual,,autoconf}, for more info.
|
||||
When Guile is installed, a pkg-config description file and a set of
|
||||
Autoconf macros is installed. This chapter documents pkg-config and
|
||||
Autoconf support, as well as the high-level guile-tool Autofrisk.
|
||||
@xref{Top,The GNU Autoconf Manual,,autoconf}, for more info.
|
||||
|
||||
@menu
|
||||
* Autoconf Background:: Why use autoconf?
|
||||
|
@ -45,7 +45,38 @@ checks.
|
|||
@node Autoconf Macros
|
||||
@section Autoconf Macros
|
||||
|
||||
The macro names all begin with "GUILE_".
|
||||
@cindex pkg-config
|
||||
@cindex autoconf
|
||||
|
||||
GNU Guile provides a @dfn{pkg-config} description file, installed as
|
||||
@file{@var{prefix}/lib/pkgconfig/guile-1.8.pc}, which contains all the
|
||||
information necessary to compile and link C applications that use Guile.
|
||||
The @code{pkg-config} program is able to read this file and provide this
|
||||
information to application programmers; it can be obtained at
|
||||
@url{http://pkg-config.freedesktop.org/}.
|
||||
|
||||
The following command lines give respectively the C compilation and link
|
||||
flags needed to build Guile-using programs:
|
||||
|
||||
@example
|
||||
pkg-config guile-1.8 --cflags
|
||||
pkg-config guile-1.8 --libs
|
||||
@end example
|
||||
|
||||
To ease use of pkg-config with Autoconf, pkg-config comes with a
|
||||
convenient Autoconf macro. The following example looks for Guile and
|
||||
sets the @code{GUILE_CFLAGS} and @code{GUILE_LIBS} variables
|
||||
accordingly, or prints an error and exits if Guile was not found:
|
||||
|
||||
@findex PKG_CHECK_MODULES
|
||||
|
||||
@example
|
||||
PKG_CHECK_MODULES([GUILE], [guile-1.8])
|
||||
@end example
|
||||
|
||||
Guile comes with additional Autoconf macros providing more information,
|
||||
installed as @file{@var{prefix}/share/aclocal/guile.m4}. Their names
|
||||
all begin with @code{GUILE_}.
|
||||
|
||||
@c see Makefile.am
|
||||
@include autoconf-macros.texi
|
||||
|
|
|
@ -138,7 +138,7 @@ x
|
|||
@comment The title is printed in a large font.
|
||||
@title Guile Reference Manual
|
||||
@subtitle Edition @value{MANUAL-EDITION}, for use with Guile @value{VERSION}
|
||||
@c @subtitle $Id: guile.texi,v 1.48 2006-11-18 18:14:55 civodul Exp $
|
||||
@c @subtitle $Id: guile.texi,v 1.49 2008-03-19 22:51:23 ossau Exp $
|
||||
|
||||
@c See preface.texi for the list of authors
|
||||
@author The Guile Developers
|
||||
|
@ -177,6 +177,8 @@ x
|
|||
|
||||
* Guile Modules::
|
||||
|
||||
* Autoconf Support::
|
||||
|
||||
Appendices
|
||||
|
||||
* Data Representation:: All the details.
|
||||
|
@ -222,7 +224,6 @@ etc. that make up Guile's application programming interface (API),
|
|||
* Guile Scripting:: How to write Guile scripts.
|
||||
* Using Guile Interactively:: Guile's REPL features.
|
||||
* Using Guile in Emacs:: Guile and Emacs.
|
||||
* Debugging Features:: Features for finding errors.
|
||||
* Further Reading:: Where to find out more about Scheme.
|
||||
@end menu
|
||||
|
||||
|
@ -230,7 +231,6 @@ etc. that make up Guile's application programming interface (API),
|
|||
@include scheme-intro.texi
|
||||
@include scheme-scripts.texi
|
||||
@include scheme-using.texi
|
||||
@include scheme-debugging.texi
|
||||
@include scheme-reading.texi
|
||||
|
||||
@node Programming in C
|
||||
|
@ -351,6 +351,7 @@ available through both Scheme and C interfaces.
|
|||
* Buffered Input:: Ports made from a reader function.
|
||||
* Expect:: Controlling interactive programs with Guile.
|
||||
* The Scheme shell (scsh):: Using scsh interfaces in Guile.
|
||||
* Tracing:: Tracing program execution.
|
||||
@end menu
|
||||
|
||||
@include slib.texi
|
||||
|
@ -361,6 +362,9 @@ available through both Scheme and C interfaces.
|
|||
@include misc-modules.texi
|
||||
@include expect.texi
|
||||
@include scsh.texi
|
||||
@include scheme-debugging.texi
|
||||
|
||||
@include autoconf.texi
|
||||
|
||||
@include data-rep.texi
|
||||
@include fdl.texi
|
||||
|
|
|
@ -474,7 +474,7 @@ multiple threads using them concurrently. This means that there is no
|
|||
risk of the internal data structures of libguile becoming corrupted in
|
||||
such a way that the process crashes.
|
||||
|
||||
A program might still produce non-sensical results, though. Taking
|
||||
A program might still produce nonsensical results, though. Taking
|
||||
hashtables as an example, Guile guarantees that you can use them from
|
||||
multiple threads concurrently and a hashtable will always remain a valid
|
||||
hashtable and Guile will not crash when you access it. It does not
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -956,6 +956,11 @@ If @var{suffix} is provided, and is equal to the end of
|
|||
@end lisp
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} file-exists? filename
|
||||
Return @code{#t} if the file named @var{filename} exists, @code{#f} if
|
||||
not.
|
||||
@end deffn
|
||||
|
||||
|
||||
@node User Information
|
||||
@subsection User Information
|
||||
|
@ -1259,27 +1264,8 @@ formatting.
|
|||
If @code{setlocale} has been called (@pxref{Locales}), month and day
|
||||
names are from the current locale and in the locale character set.
|
||||
|
||||
Note that @samp{%Z} might print the @code{tm:zone} in @var{tm} or it
|
||||
might print just the current zone (@code{tzset} above). A GNU system
|
||||
prints @code{tm:zone}, a strict C99 system like NetBSD prints the
|
||||
current zone. Perhaps in the future Guile will try to get
|
||||
@code{tm:zone} used always.
|
||||
@c
|
||||
@c The issue in the above is not just whether tm_zone exists in
|
||||
@c struct tm, but whether libc feels it should read it. Being a
|
||||
@c non-C99 field, a strict C99 program won't know to set it, quite
|
||||
@c likely leaving garbage there. NetBSD, which has the field,
|
||||
@c therefore takes the view that it mustn't read it. See the PR
|
||||
@c about this at
|
||||
@c
|
||||
@c http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=21722
|
||||
@c
|
||||
@c Uniformly making tm:zone used on all systems (all those which have
|
||||
@c %Z at all of course) might be nice (either mung TZ and tzset, or
|
||||
@c mung tzname[]). On the other hand it would make us do more than
|
||||
@c C99 says, and we really don't want to get intimate with the gory
|
||||
@c details of libc time funcs, no more than can be helped.
|
||||
@c
|
||||
Note that @samp{%Z} always ignores the @code{tm:zone} in @var{tm};
|
||||
instead it prints just the current zone (@code{tzset} above).
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} strptime format string
|
||||
|
|
|
@ -5,280 +5,8 @@
|
|||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
@page
|
||||
@node Debugging Features
|
||||
@section Debugging Features
|
||||
|
||||
Guile includes debugging tools to help you work out what is going wrong
|
||||
when a program signals an error or behaves differently to how you would
|
||||
expect. This chapter describes how to use these tools.
|
||||
|
||||
Broadly speaking, Guile's debugging support allows you to do two things:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
specify @dfn{breakpoints} --- points in the execution of a program where
|
||||
execution should pause so you can see what is going on
|
||||
|
||||
@item
|
||||
examine in detail the ``scene of the crime'' --- in other words, the
|
||||
execution context at a breakpoint, or when the last error occurred.
|
||||
@end itemize
|
||||
|
||||
@noindent
|
||||
The details are more complex and more powerful @dots{}
|
||||
|
||||
@menu
|
||||
* Examples::
|
||||
* Intro to Breakpoints:: Setting and manipulating them.
|
||||
* Tracing:: Tracing program execution.
|
||||
@end menu
|
||||
|
||||
|
||||
@node Examples
|
||||
@subsection Examples
|
||||
|
||||
Before we dive into the details and reference documentation of
|
||||
guile-debugging's features, this chapter sets the scene by presenting a
|
||||
few examples of what you can do with guile-debugging.
|
||||
|
||||
@menu
|
||||
* Single Stepping through a Procedure's Code::
|
||||
* Profiling or Tracing a Procedure's Code::
|
||||
@end menu
|
||||
|
||||
|
||||
@node Single Stepping through a Procedure's Code
|
||||
@subsubsection Single Stepping through a Procedure's Code
|
||||
|
||||
A good way to explore in detail what a Scheme procedure does is to set a
|
||||
breakpoint on it and then single step through what it does. To do this,
|
||||
use the @code{break-in} procedure from the @code{(ice-9 debugging
|
||||
breakpoints)} module with the @code{debug-trap} behaviour from
|
||||
@code{(ice-9 debugging ice-9-debugger-extensions)}. The following
|
||||
sample session illustrates this. It assumes that the file
|
||||
@file{matrix.scm} defines a procedure @code{mkmatrix}, which is the one
|
||||
we want to explore, and another procedure @code{do-main} which calls
|
||||
@code{mkmatrix}.
|
||||
|
||||
@lisp
|
||||
$ /usr/bin/guile -q
|
||||
guile> (use-modules (ice-9 debugger)
|
||||
(ice-9 debugging ice-9-debugger-extensions)
|
||||
(ice-9 debugging breakpoints))
|
||||
guile> (load "matrix.scm")
|
||||
guile> (break-in 'mkmatrix #:behaviour debug-trap)
|
||||
#<<break-in> 808cb70>
|
||||
guile> (do-main 4)
|
||||
This is the Guile debugger -- for help, type `help'.
|
||||
There are 3 frames on the stack.
|
||||
|
||||
Frame 2 at matrix.scm:8:3
|
||||
[mkmatrix]
|
||||
debug> next
|
||||
Frame 3 at matrix.scm:4:3
|
||||
(let ((x 1)) (quote this-is-a-matric))
|
||||
debug> info frame
|
||||
Stack frame: 3
|
||||
This frame is an evaluation.
|
||||
The expression being evaluated is:
|
||||
matrix.scm:4:3:
|
||||
(let ((x 1)) (quote this-is-a-matric))
|
||||
debug> next
|
||||
Frame 3 at matrix.scm:5:21
|
||||
(quote this-is-a-matric)
|
||||
debug> bt
|
||||
In unknown file:
|
||||
?: 0* [primitive-eval (do-main 4)]
|
||||
In standard input:
|
||||
4: 1* [do-main 4]
|
||||
In matrix.scm:
|
||||
8: 2 [mkmatrix]
|
||||
...
|
||||
5: 3 (quote this-is-a-matric)
|
||||
debug> quit
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
Or you can use guile-debugging's Emacs interface (GDS), by using the
|
||||
module @code{(ice-9 gds-client)} instead of @code{(ice-9 debugger)} and
|
||||
@code{(ice-9 debugging ice-9-debugger-extensions)}, and changing
|
||||
@code{debug-trap} to @code{gds-debug-trap}. Then the stack and
|
||||
corresponding source locations are displayed in Emacs instead of on the
|
||||
Guile command line.
|
||||
|
||||
|
||||
@node Profiling or Tracing a Procedure's Code
|
||||
@subsubsection Profiling or Tracing a Procedure's Code
|
||||
|
||||
What if you wanted to get a trace of everything that the Guile evaluator
|
||||
does within a given procedure, but without Guile stopping and waiting
|
||||
for your input at every step? In this case you set a breakpoint on the
|
||||
procedure using @code{break-in} (the same as in the previous example),
|
||||
but use the @code{trace-trap} and @code{trace-until-exit} behaviours
|
||||
provided by the @code{(ice-9 debugging trace)} module.
|
||||
|
||||
@lisp
|
||||
guile> (use-modules (ice-9 debugging breakpoints) (ice-9 debugging trace))
|
||||
guile> (load "matrix.scm")
|
||||
guile> (break-in 'mkmatrix #:behaviour (list trace-trap trace-until-exit))
|
||||
#<<break-in> 808b430>
|
||||
guile> (do-main 4)
|
||||
| 2: [mkmatrix]
|
||||
| 3: [define (define yy 23) ((()) #<eval-closure 4028db30>)]
|
||||
| 3: [define (define yy 23) ((()) #<eval-closure 4028db30>)]
|
||||
| 3: =>(#@@define yy 23)
|
||||
| 3: [let (let # #) (# #)]
|
||||
| 3: [let (let # #) (# #)]
|
||||
| 3: =>(#@@let* (x 1) #@@let (quote this-is-a-matric))
|
||||
| 2: (letrec ((yy 23)) (let ((x 1)) (quote this-is-a-matric)))
|
||||
| 3: [let (let # #) (# # #)]
|
||||
| 3: [let (let # #) (# # #)]
|
||||
| 3: =>(#@@let* (x 1) #@@let (quote this-is-a-matric))
|
||||
| 2: (let ((x 1)) (quote this-is-a-matric))
|
||||
| 3: [quote (quote this-is-a-matric) ((x . 1) ((yy) 23) (()) ...)]
|
||||
| 3: [quote (quote this-is-a-matric) ((x . 1) ((yy) 23) (()) ...)]
|
||||
| 3: =>(#@@quote this-is-a-matric)
|
||||
| 2: (quote this-is-a-matric)
|
||||
| 2: =>this-is-a-matric
|
||||
this-is-a-matric
|
||||
guile> (do-main 4)
|
||||
| 2: [mkmatrix]
|
||||
| 2: (letrec ((yy 23)) (let ((x 1)) (quote this-is-a-matric)))
|
||||
| 2: (let ((x 1)) (quote this-is-a-matric))
|
||||
| 2: (quote this-is-a-matric)
|
||||
| 2: =>this-is-a-matric
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
This example shows the default configuration for how each line of trace
|
||||
output is formatted, which is:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
the character @code{|}, a visual clue that the line is a line of trace
|
||||
output, followed by
|
||||
|
||||
@item
|
||||
a number indicating the real evaluator stack depth (where ``real'' means
|
||||
not counting tail-calls), followed by
|
||||
|
||||
@item
|
||||
a summary of the expression being evaluated (@code{(@dots{})}), the
|
||||
procedure being called (@code{[@dots{}]}), or the value being returned
|
||||
from an evaluation or procedure call (@code{=>@dots{}}).
|
||||
@end itemize
|
||||
|
||||
@noindent
|
||||
You can customize @code{(ice-9 debugging trace)} to show different
|
||||
information in each trace line using the @code{set-trace-layout}
|
||||
procedure. The next example shows how to get the source location in
|
||||
each trace line instead of the stack depth.
|
||||
|
||||
@lisp
|
||||
guile> (set-trace-layout "|~16@@a: ~a\n" trace/source trace/info)
|
||||
guile> (do-main 4)
|
||||
| matrix.scm:7:2: [mkmatrix]
|
||||
| : (letrec ((yy 23)) (let ((x 1)) (quote this-is-a-matric)))
|
||||
| matrix.scm:3:2: (let ((x 1)) (quote this-is-a-matric))
|
||||
| matrix.scm:4:20: (quote this-is-a-matric)
|
||||
| matrix.scm:4:20: =>this-is-a-matric
|
||||
this-is-a-matric
|
||||
guile>
|
||||
@end lisp
|
||||
|
||||
(For anyone wondering why the first @code{(do-main 4)} call above
|
||||
generates lots more trace lines than the subsequent calls: these
|
||||
examples also demonstrate how the Guile evaluator ``memoizes'' code.
|
||||
When Guile evaluates a source code expression for the first time, it
|
||||
changes some parts of the expression so that they will be quicker to
|
||||
evaluate when that expression is evaluated again; this is called
|
||||
memoization. The trace output from the first @code{(do-main 4)} call
|
||||
shows memoization steps, such as an internal define being transformed to
|
||||
a letrec.)
|
||||
|
||||
|
||||
@node Intro to Breakpoints
|
||||
@subsection Intro to Breakpoints
|
||||
|
||||
Sometimes a piece of Scheme code isn't working and you'd like to go
|
||||
through it step by step. You can do this in Guile by setting a
|
||||
breakpoint at the start of the relevant code, and then using the command
|
||||
line or Emacs interface to step through it.
|
||||
|
||||
A breakpoint can be specified by procedure name or by location -- the
|
||||
relevant code's file name, line number and column number. For details
|
||||
please see the full documentation for @code{break-in} and
|
||||
@code{break-at} in @ref{Intro to Breakpoints}.
|
||||
|
||||
When you set a breakpoint, you can specify any ``behaviour'' you like
|
||||
for what should happen when the breakpoint is hit; a breakpoint
|
||||
``behaviour'' is just a Scheme procedure with the right signature.
|
||||
|
||||
@menu
|
||||
* Breakpoints Overview::
|
||||
@end menu
|
||||
|
||||
|
||||
@node Breakpoints Overview
|
||||
@subsubsection How Breakpoints Work and Why They Are Useful
|
||||
|
||||
Often, debugging the last error is not enough to tell you what went
|
||||
wrong. For example, the root cause of the error may have arisen a long
|
||||
time before the error was signalled, in which case the execution context
|
||||
of the error is too late to be useful. Or your program might not signal
|
||||
an error at all, just return an unexpected result or have some incorrect
|
||||
side effect.
|
||||
|
||||
In many such cases, it's useful to pause the program at or before the
|
||||
point where you suspect the problem arises. Then you can explore the
|
||||
stack, display the values of key variables, and generally check that the
|
||||
state of the program is as you expect. If all is well, you can let the
|
||||
program continue running normally, or step more slowly through each
|
||||
expression that the Scheme interpreter evaluates. Single-stepping may
|
||||
reveal that the program is going through blocks of code that you didn't
|
||||
intend --- a useful data point for understanding what the underlying
|
||||
problem is.
|
||||
|
||||
Telling Guile where or when to pause a program is called @dfn{setting a
|
||||
breakpoint}. When a breakpoint is hit, Guile's default behaviour is to
|
||||
enter the interactive debugger, where there are now two sets of commands
|
||||
available:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
all the commands as described for last error debugging
|
||||
(@pxref{Interactive Debugger}), which allow you to explore the stack and
|
||||
so on
|
||||
|
||||
@item
|
||||
additional commands for continuing program execution in various ways:
|
||||
@code{next}, @code{step}, @code{finish}, @code{trace-finish} and
|
||||
@code{continue}.
|
||||
@end itemize
|
||||
|
||||
Use of the interactive debugger is described in @ref{Interactive
|
||||
Debugger}.
|
||||
|
||||
|
||||
@node Tracing
|
||||
@subsection Tracing
|
||||
|
||||
Tracing has already been described as a breakpoint behaviour, but we
|
||||
mention it again here because it is so useful, and because Guile
|
||||
actually now has @emph{two} mechanisms for tracing, and its worth
|
||||
clarifying the differences between them.
|
||||
|
||||
@menu
|
||||
* Old Tracing:: Tracing provided by (ice-9 debug).
|
||||
* New Tracing:: Breakpoint-based tracing.
|
||||
* Tracing Compared:: Differences between old and new.
|
||||
@end menu
|
||||
|
||||
|
||||
@node Old Tracing
|
||||
@subsubsection Tracing Provided by @code{(ice-9 debug)}
|
||||
@section Tracing
|
||||
|
||||
The @code{(ice-9 debug)} module implements tracing of procedure
|
||||
applications. When a procedure is @dfn{traced}, it means that every
|
||||
|
@ -391,128 +119,6 @@ there is no need for Guile to create a new stack frame for each
|
|||
iteration. Tracing reveals this optimization in operation.
|
||||
|
||||
|
||||
@node New Tracing
|
||||
@subsubsection Breakpoint-based Tracing
|
||||
|
||||
Guile's newer mechanism implements tracing as an optional behaviour for
|
||||
any kind of breakpoint.
|
||||
|
||||
To trace a procedure (in the same kind of way as the older tracing), use
|
||||
the @code{trace!} procedure to set a procedure breakpoint with
|
||||
@code{trace-here} behaviour:
|
||||
|
||||
@lisp
|
||||
(trace! fact1)
|
||||
@print{}
|
||||
Set breakpoint 1: [fact1]
|
||||
@result{}
|
||||
#<<procedure-breakpoint> 40337bf0>
|
||||
|
||||
(fact1 4)
|
||||
@print{}
|
||||
| [fact1 4]
|
||||
| | [fact1 3]
|
||||
| | | [fact1 2]
|
||||
| | | | [fact1 1]
|
||||
| | | | | [fact1 0]
|
||||
| | | | | 1
|
||||
| | | | 2
|
||||
| | | 6
|
||||
| | 24
|
||||
| 24
|
||||
@result{}
|
||||
24
|
||||
@end lisp
|
||||
|
||||
To trace evaluation of a source expression, evaluate code containing a
|
||||
breakpoint marker @code{##} in the appropriate place, then use
|
||||
@code{set-breakpoint} to change the behaviour of the new breakpoint to
|
||||
@code{trace-here}:
|
||||
|
||||
@lisp
|
||||
(define (fact1 n)
|
||||
(if ##(= n 0)
|
||||
1
|
||||
(* n (fact1 (- n 1)))))
|
||||
@print{}
|
||||
Set breakpoint 4: standard input:13:9: (= n 0)
|
||||
|
||||
(use-modules (ice-9 debugger behaviour))
|
||||
(set-breakpoint! trace-here 4)
|
||||
@print{}
|
||||
Breakpoint 4: standard input:13:9: (= n 0)
|
||||
enabled? = #t
|
||||
behaviour = #<procedure trace-here ()>
|
||||
|
||||
(fact1 4)
|
||||
@print{}
|
||||
| (= n 0)
|
||||
| #f
|
||||
| (= n 0)
|
||||
| #f
|
||||
| (= n 0)
|
||||
| #f
|
||||
| (= n 0)
|
||||
| #f
|
||||
| (= n 0)
|
||||
| #t
|
||||
@result{}
|
||||
24
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
(Note --- this example reveals a bug: each occurrence of @code{(= n 0)}
|
||||
should be shown indented with respect to the one before it, as
|
||||
@code{fact1} does not call itself tail-recursively.)
|
||||
|
||||
You can also give a breakpoint the @code{trace-subtree} behaviour, which
|
||||
means to trace the breakpoint location itself plus any evaluations and
|
||||
applications that occur below it in the call stack. In the following
|
||||
example, this allows us to see the evaluated arguments that are being
|
||||
compared by the @code{=} procedure:
|
||||
|
||||
@lisp
|
||||
(set-breakpoint! trace-subtree 4)
|
||||
@print{}
|
||||
Breakpoint 4: standard input:13:9: (= n 0)
|
||||
enabled? = #t
|
||||
behaviour = #<procedure trace-subtree ()>
|
||||
|
||||
(fact1 4)
|
||||
@print{}
|
||||
| (= n 0)
|
||||
| [= 4 0]
|
||||
| #f
|
||||
| (= n 0)
|
||||
| [= 3 0]
|
||||
| #f
|
||||
| (= n 0)
|
||||
| [= 2 0]
|
||||
| #f
|
||||
| (= n 0)
|
||||
| [= 1 0]
|
||||
| #f
|
||||
| (= n 0)
|
||||
| [= 0 0]
|
||||
| #t
|
||||
@result{}
|
||||
24
|
||||
@end lisp
|
||||
|
||||
|
||||
@node Tracing Compared
|
||||
@subsubsection Differences Between Old and New Tracing Mechanisms
|
||||
|
||||
The newer tracing mechanism is more general and so more powerful than
|
||||
the older one: it works for expressions as well as procedure
|
||||
applications, and it implements the useful @code{trace-subtree}
|
||||
behaviour as well as the more traditional @code{trace-here}.
|
||||
|
||||
The older mechanism will probably become obsolete eventually, but it's
|
||||
worth keeping it around for a while until we are sure that the new
|
||||
mechanism is correct and does what programmers need.
|
||||
|
||||
|
||||
@c Local Variables:
|
||||
@c TeX-master: "guile.texi"
|
||||
@c End:
|
||||
|
|
|
@ -163,10 +163,10 @@ The interactive debugger is documented further in the following section.
|
|||
@node Interactive Debugger
|
||||
@subsection Using the Interactive Debugger
|
||||
|
||||
Guile's interactive debugger is a command line application that accepts
|
||||
commands from you for examining the stack and, if at a breakpoint, for
|
||||
continuing program execution in various ways. Unlike in the normal
|
||||
Guile REPL, commands are typed mostly without parentheses.
|
||||
Guile's interactive debugger is a command line application that
|
||||
accepts commands from you for examining the stack and, if stopped at a
|
||||
trap, for continuing program execution in various ways. Unlike in the
|
||||
normal Guile REPL, commands are typed mostly without parentheses.
|
||||
|
||||
When you first enter the debugger, it introduces itself with a message
|
||||
like this:
|
||||
|
@ -359,15 +359,17 @@ debugger to continue.)
|
|||
@node Using Guile in Emacs
|
||||
@section Using Guile in Emacs
|
||||
|
||||
There are quite a few options for working on Guile Scheme code in
|
||||
Emacs. The simplest options are to use Emacs's standard
|
||||
@code{scheme-mode} for editing code, and to run the interpreter when you
|
||||
need it by typing ``guile'' at the prompt of a @code{*shell*} buffer,
|
||||
but there are Emacs libraries available which add various bells and
|
||||
whistles to this. The following diagram shows these libraries and how
|
||||
they relate to each other, with the arrows indicating ``builds on'' or
|
||||
``extends''. For example, the Quack library builds on cmuscheme, which
|
||||
in turn builds on the standard scheme mode.
|
||||
@cindex GDS
|
||||
@cindex Emacs
|
||||
There are several options for working on Guile Scheme code in Emacs.
|
||||
The simplest are to use Emacs's standard @code{scheme-mode} for
|
||||
editing code, and to run the interpreter when you need it by typing
|
||||
``guile'' at the prompt of a @code{*shell*} buffer, but there are
|
||||
Emacs libraries available which add various bells and whistles to
|
||||
this. The following diagram shows these libraries and how they relate
|
||||
to each other, with the arrows indicating ``builds on'' or
|
||||
``extends''. For example, the Quack library builds on cmuscheme,
|
||||
which in turn builds on the standard scheme mode.
|
||||
|
||||
@example
|
||||
scheme
|
||||
|
@ -408,25 +410,24 @@ interpreters and remembers which one you used last time; and so on.
|
|||
Quack is available from @uref{http://www.neilvandyke.org/quack}.
|
||||
|
||||
@dfn{GDS}, written by Neil Jerram, also builds on the scheme/cmuscheme
|
||||
combination, but with a fundamental change to the way that Scheme code
|
||||
fragments are sent to the interpreter for evaluation. cmuscheme and
|
||||
Quack send code fragments to the interpreter's standard input, on the
|
||||
assumption that the interpreter is expecting to read Scheme expressions
|
||||
there, and then monitor the interpreter's standard output to infer what
|
||||
the result of the evaluation is. GDS doesn't use standard input and
|
||||
combination, but with a change to the way that Scheme code fragments
|
||||
are sent to the interpreter for evaluation. cmuscheme and Quack send
|
||||
code fragments to the interpreter's standard input, on the assumption
|
||||
that the interpreter is expecting to read Scheme expressions there,
|
||||
and then monitor the interpreter's standard output to infer what the
|
||||
result of the evaluation is. GDS doesn't use standard input and
|
||||
output like this. Instead, it sets up a socket connection between the
|
||||
Scheme interpreter and Emacs, and sends and receives messages using a
|
||||
simple protocol through this socket. The messages include requests to
|
||||
evaluate Scheme code, and responses conveying the results of an
|
||||
evaluation, thus providing similar function to cmuscheme or Quack. They
|
||||
also include requests for setting breakpoints, stack exploration and
|
||||
debugging, which go beyond what cmuscheme or Quack can do. The price of
|
||||
this extra power, however, is that GDS is Guile-specific. GDS requires
|
||||
the Scheme interpreter, or any program that GDS is debugging, to run
|
||||
some GDS-specific library code; currently this code is written as a
|
||||
Guile module and uses a lot of debugging-related features that are
|
||||
evaluation, thus providing similar function to cmuscheme or Quack.
|
||||
They also include requests for stack exploration and debugging, which
|
||||
go beyond what cmuscheme or Quack can do. The price of this extra
|
||||
power, however, is that GDS is Guile-specific. GDS requires the
|
||||
Scheme interpreter to run some GDS-specific library code; currently
|
||||
this code is written as a Guile module and uses features that are
|
||||
specific to Guile. GDS is now included in the Guile distribution; for
|
||||
previous Guile releases (1.8.x and earlier) it can be obtained as part
|
||||
previous Guile releases (1.8.4 and earlier) it can be obtained as part
|
||||
of the @code{guile-debugging} package from
|
||||
@uref{http://www.ossau.uklinux.net/guile}.
|
||||
|
||||
|
@ -540,7 +541,7 @@ Emacs. This code, consisting of the installed files @file{gds.el} and
|
|||
@file{gds-server.el}, is responsible for displaying information from
|
||||
Guile in Emacs windows, and for responding to Emacs commands and
|
||||
keystrokes by sending instructions back to the Guile program being
|
||||
debugged.
|
||||
worked on.
|
||||
|
||||
@item
|
||||
The GDS @dfn{server} code is written in Scheme and runs as an Emacs
|
||||
|
@ -584,12 +585,12 @@ The data exchanged between client and server components, and between
|
|||
server and interface, is a sequence of sexps (parenthesised expressions)
|
||||
that are designed so as to be directly readable by both Scheme and Emacs
|
||||
Lisp. The use of a TCP connection means that the server and Emacs
|
||||
interface can theoretically be on a different computer from the programs
|
||||
being debugged, but in practice there are currently two problems with
|
||||
interface can theoretically be on a different computer from the client
|
||||
programs, but in practice there are currently two problems with
|
||||
this. Firstly the GDS API doesn't provide any way of specifying a
|
||||
non-local server to connect to, and secondly there is no security or
|
||||
authentication mechanism in the GDS protocol. These are issues that
|
||||
should be addressed in the near future.
|
||||
should be addressed in the future.
|
||||
|
||||
|
||||
@node GDS Getting Started
|
||||
|
@ -620,7 +621,7 @@ and the @code{gds-debug} buffer will contain a Scheme backtrace ending
|
|||
with the message:
|
||||
|
||||
@lisp
|
||||
no code for module (ossau gds-server)
|
||||
no code for module (ice-9 gds-server)
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
|
@ -645,10 +646,10 @@ Emacs to open the file @file{gds-tutorial.txt} (which should have been
|
|||
installed as part of Guile, perhaps under @file{/usr/share/doc/guile}),
|
||||
and then follow the steps in that file.
|
||||
|
||||
When you want to use GDS to explore or debug an independent Guile
|
||||
When you want to use GDS to work on an independent Guile
|
||||
application, you need to add something to that application's Scheme code
|
||||
to cause it to connect to and interact with GDS at the right times. The
|
||||
following subsections describe the various ways of doing this.
|
||||
following subsections describe the ways of doing this.
|
||||
|
||||
@subsubsection Setting Specific Breakpoints
|
||||
|
||||
|
@ -667,10 +668,10 @@ the following.
|
|||
@end lisp
|
||||
|
||||
@noindent
|
||||
The @code{#:behaviour gds-debug-trap} clauses mean to use GDS to display
|
||||
the stack when one of these breakpoints is hit. For more on
|
||||
breakpoints, @code{break-in} and @code{break-at}, see @ref{Intro to
|
||||
Breakpoints}.
|
||||
The @code{#:behaviour gds-debug-trap} clauses mean to use GDS to
|
||||
display the stack when one of these breakpoints is hit. For more on
|
||||
breakpoints, @code{break-in} and @code{break-at}, see
|
||||
@ref{Breakpoints}.
|
||||
|
||||
@subsubsection Setting GDS-managed Breakpoints
|
||||
|
||||
|
@ -723,7 +724,7 @@ is pre-1.8) around the code of interest like this:
|
|||
(gds-debug-trap (throw->trap-context key args))))
|
||||
@end lisp
|
||||
|
||||
In all cases you will need to use the @code{(ice-9 gds-client)} and
|
||||
Either way, you will need to use the @code{(ice-9 gds-client)} and
|
||||
@code{(ice-9 debugging traps)} modules.
|
||||
|
||||
Two special cases of this are the lazy-catch that the Guile REPL code
|
||||
|
@ -738,7 +739,6 @@ procedure as follows.
|
|||
@lisp
|
||||
(use-modules (ice-9 gds-client)
|
||||
(ice-9 debugging traps))
|
||||
|
||||
(on-lazy-handler-dispatch gds-debug-trap)
|
||||
@end lisp
|
||||
|
||||
|
@ -787,16 +787,12 @@ This approach is not yet implemented, though.
|
|||
|
||||
@subsubsection Utility Guile Implementation
|
||||
|
||||
We conclude this subsection with an aside, by noting that the
|
||||
``utility'' Guile client described above is nothing more than a
|
||||
combination of the previous options.
|
||||
|
||||
To be precise, the code for the utility Guile client is essentially just
|
||||
this:
|
||||
The ``utility'' Guile client mentioned above is a simple combination
|
||||
of the mechanisms that we have just described. In fact the code for
|
||||
the utility Guile client is essentially just this:
|
||||
|
||||
@lisp
|
||||
(use-modules (ice-9 gds-client))
|
||||
|
||||
(set-gds-breakpoints)
|
||||
(named-module-use! '(guile-user) '(ice-9 session))
|
||||
(gds-accept-input #f))
|
||||
|
@ -805,17 +801,22 @@ this:
|
|||
@code{set-gds-breakpoints} works as already described. The
|
||||
@code{named-module-use!} line ensures that the client can process
|
||||
@code{help} and @code{apropos} expressions, to implement lookups in
|
||||
Guile's online help. The @code{#f} parameter to @code{gds-accept-input}
|
||||
means that the @code{continue} instruction will not cause the
|
||||
instruction loop to exit, which makes sense here because the utility
|
||||
client has nothing to do except to process GDS instructions.
|
||||
Guile's online help. The @code{#f} parameter to
|
||||
@code{gds-accept-input} means that the @code{continue} instruction
|
||||
will not cause the instruction loop to exit, which makes sense here
|
||||
because the utility client has nothing to do except to process GDS
|
||||
instructions.
|
||||
|
||||
(The utility client does not use @code{on-lazy-handler-dispatch},
|
||||
because it has its own mechanism for catching and reporting exceptions
|
||||
in the code that it is asked to evaluate. This mechanism summarizes the
|
||||
exception and gives the user a button they can click to see the full
|
||||
stack, so the end result is very similar to what
|
||||
@code{on-lazy-handler-dispatch} provides.)
|
||||
The utility client does not use @code{on-lazy-handler-dispatch} at its
|
||||
top level, because it has its own mechanism for catching and reporting
|
||||
exceptions in the code that it is asked to evaluate. This mechanism
|
||||
summarizes the exception and gives the user a button they can click to
|
||||
see the full stack, so the end result is very similar to what
|
||||
@code{on-lazy-handler-dispatch} provides. Deep inside
|
||||
@code{gds-accept-input}, in the part that handles evaluating
|
||||
expressions from Emacs, the GDS client code uses
|
||||
@code{throw->trap-context} and @code{gds-debug-trap} to implement
|
||||
this.
|
||||
|
||||
|
||||
@node Working with GDS in Scheme Buffers
|
||||
|
@ -850,7 +851,7 @@ or before the cursor but can also be entered or edited in the
|
|||
minibuffer. The available help is popped up in a temporary Emacs
|
||||
window.
|
||||
|
||||
@item C-h C-g
|
||||
@item C-h G
|
||||
@findex gds-apropos
|
||||
List all accessible Guile symbols matching a given regular expression,
|
||||
with the same results as if you had typed @code{(apropos REGEXP)} into
|
||||
|
@ -987,6 +988,14 @@ region contains a balanced expression, or try to expand the region so
|
|||
that it does; it uses the region exactly as it is.
|
||||
@end table
|
||||
|
||||
If you type @kbd{C-u} before one of these commands, GDS will
|
||||
immediately pop up a Scheme stack buffer, showing the requested
|
||||
evaluation, so that you can single step through it. (This is achieved
|
||||
by setting a @code{<source-trap>} trap at the start of the requested
|
||||
evaluation; see @ref{Source Traps} for more on how those work.) The
|
||||
Scheme stack display, and the options for continuing through the code,
|
||||
are described in the next two sections.
|
||||
|
||||
|
||||
@node Displaying the Scheme Stack
|
||||
@subsection Displaying the Scheme Stack
|
||||
|
@ -1211,35 +1220,9 @@ display in action. To do this add
|
|||
|
||||
@noindent
|
||||
to your @file{testgds.scm} buffer and type @kbd{C-x C-e} (which
|
||||
evaluates the expression that the cursor is just after the end of). The
|
||||
result is:
|
||||
|
||||
@lisp
|
||||
(fact1 4)
|
||||
|
||||
;;; Evaluating in current module (guile-user)
|
||||
@result{} 24
|
||||
|
||||
--:** *Guile Evaluation* (Scheme:ready)--All------------
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
which is correct, but indicates that we forgot the step needed to enable
|
||||
the trap mechanism. To do this, type @kbd{C-c C-e} and then enter
|
||||
|
||||
@lisp
|
||||
(trap-enable 'traps)
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
into the minibuffer. (You could equally have typed this into your test
|
||||
file and evaluated it from there; we use @kbd{C-c C-e} here to
|
||||
demonstrate the minibuffer option and because you typically wouldn't
|
||||
want to leave this kind of global setting in the source code that you
|
||||
are working on.)
|
||||
|
||||
If you now type @kbd{C-x C-e} to evaluate @code{(fact1 4)} again, a GDS
|
||||
stack window like the following appears:
|
||||
evaluates the expression that the cursor is just after the end of).
|
||||
The result should be that a GDS stack window like the following
|
||||
appears:
|
||||
|
||||
@lisp
|
||||
Calling procedure:
|
||||
|
@ -1250,19 +1233,10 @@ Calling procedure:
|
|||
--:** PID 28729 (Guile-Debug)--All------------
|
||||
@end lisp
|
||||
|
||||
GDS's most compelling feature is its single-stepping. To get an
|
||||
immediate feel for what this is like, make sure your Emacs is prepared
|
||||
as described in @ref{GDS Getting Started}, then type the following code
|
||||
into an interactive Guile session.
|
||||
|
||||
@lisp
|
||||
(fact1 4)
|
||||
@end lisp
|
||||
|
||||
@noindent
|
||||
This will cause the GDS Guile-Debug window to pop up in Emacs, where
|
||||
you can then press @kbd{i} once and @kbd{@key{SPC}} repeatedly to
|
||||
single-step through the code from the point of the initial trap.
|
||||
This stack tells you that Guile is about to call the @code{fact1}
|
||||
procedure, with argument 4, and you can step through this call in
|
||||
detail by pressing @kbd{i} once and then @kbd{@key{SPC}}
|
||||
(@pxref{Continuing Execution}).
|
||||
|
||||
(@kbd{i} is needed as the first keystroke rather than @kbd{@key{SPC}},
|
||||
because the aim here is to step through code in the @code{(ice-9
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@c -*-texinfo-*-
|
||||
@c This is part of the GNU Guile Reference Manual.
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007
|
||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008
|
||||
@c Free Software Foundation, Inc.
|
||||
@c See the file guile.texi for copying conditions.
|
||||
|
||||
|
@ -34,6 +34,7 @@ get the relevant SRFI documents from the SRFI home page
|
|||
* SRFI-14:: Character-set library.
|
||||
* SRFI-16:: case-lambda
|
||||
* SRFI-17:: Generalized set!
|
||||
* SRFI-18:: Multithreading support
|
||||
* SRFI-19:: Time/Date library.
|
||||
* SRFI-26:: Specializing parameters
|
||||
* SRFI-31:: A special form `rec' for recursive evaluation
|
||||
|
@ -44,6 +45,8 @@ get the relevant SRFI documents from the SRFI home page
|
|||
* SRFI-55:: Requiring Features.
|
||||
* SRFI-60:: Integers as bits.
|
||||
* SRFI-61:: A more general `cond' clause
|
||||
* SRFI-69:: Basic hash tables.
|
||||
* SRFI-88:: Keyword objects.
|
||||
@end menu
|
||||
|
||||
|
||||
|
@ -1676,6 +1679,344 @@ The same as the Guile core @code{make-procedure-with-setter}
|
|||
@end defun
|
||||
|
||||
|
||||
@node SRFI-18
|
||||
@subsection SRFI-18 - Multithreading support
|
||||
@cindex SRFI-18
|
||||
|
||||
This is an implementation of the SRFI-18 threading and synchronization
|
||||
library. The functions and variables described here are provided by
|
||||
|
||||
@example
|
||||
(use-modules (srfi srfi-18))
|
||||
@end example
|
||||
|
||||
As a general rule, the data types and functions in this SRFI-18
|
||||
implementation are compatible with the types and functions in Guile's
|
||||
core threading code. For example, mutexes created with the SRFI-18
|
||||
@code{make-mutex} function can be passed to the built-in Guile
|
||||
function @code{lock-mutex} (@pxref{Mutexes and Condition Variables}),
|
||||
and mutexes created with the built-in Guile function @code{make-mutex}
|
||||
can be passed to the SRFI-18 function @code{mutex-lock!}. Cases in
|
||||
which this does not hold true are noted in the following sections.
|
||||
|
||||
@menu
|
||||
* SRFI-18 Threads:: Executing code
|
||||
* SRFI-18 Mutexes:: Mutual exclusion devices
|
||||
* SRFI-18 Condition variables:: Synchronizing of groups of threads
|
||||
* SRFI-18 Time:: Representation of times and durations
|
||||
* SRFI-18 Exceptions:: Signalling and handling errors
|
||||
@end menu
|
||||
|
||||
@node SRFI-18 Threads
|
||||
@subsubsection SRFI-18 Threads
|
||||
|
||||
Threads created by SRFI-18 differ in two ways from threads created by
|
||||
Guile's built-in thread functions. First, a thread created by SRFI-18
|
||||
@code{make-thread} begins in a blocked state and will not start
|
||||
execution until @code{thread-start!} is called on it. Second, SRFI-18
|
||||
threads are constructed with a top-level exception handler that
|
||||
captures any exceptions that are thrown on thread exit. In all other
|
||||
regards, SRFI-18 threads are identical to normal Guile threads.
|
||||
|
||||
@defun current-thread
|
||||
Returns the thread that called this function. This is the same
|
||||
procedure as the same-named built-in procedure @code{current-thread}
|
||||
(@pxref{Threads}).
|
||||
@end defun
|
||||
|
||||
@defun thread? obj
|
||||
Returns @code{#t} if @var{obj} is a thread, @code{#f} otherwise. This
|
||||
is the same procedure as the same-named built-in procedure
|
||||
@code{thread?} (@pxref{Threads}).
|
||||
@end defun
|
||||
|
||||
@defun make-thread thunk [name]
|
||||
Call @code{thunk} in a new thread and with a new dynamic state,
|
||||
returning the new thread and optionally assigning it the object name
|
||||
@var{name}, which may be any Scheme object.
|
||||
|
||||
Note that the name @code{make-thread} conflicts with the
|
||||
@code{(ice-9 threads)} function @code{make-thread}. Applications
|
||||
wanting to use both of these functions will need to refer to them by
|
||||
different names.
|
||||
@end defun
|
||||
|
||||
@defun thread-name thread
|
||||
Returns the name assigned to @var{thread} at the time of its creation,
|
||||
or @code{#f} if it was not given a name.
|
||||
@end defun
|
||||
|
||||
@defun thread-specific thread
|
||||
@defunx thread-specific-set! thread obj
|
||||
Get or set the ``object-specific'' property of @var{thread}. In
|
||||
Guile's implementation of SRFI-18, this value is stored as an object
|
||||
property, and will be @code{#f} if not set.
|
||||
@end defun
|
||||
|
||||
@defun thread-start! thread
|
||||
Unblocks @var{thread} and allows it to begin execution if it has not
|
||||
done so already.
|
||||
@end defun
|
||||
|
||||
@defun thread-yield!
|
||||
If one or more threads are waiting to execute, calling
|
||||
@code{thread-yield!} forces an immediate context switch to one of them.
|
||||
Otherwise, @code{thread-yield!} has no effect. @code{thread-yield!}
|
||||
behaves identically to the Guile built-in function @code{yield}.
|
||||
@end defun
|
||||
|
||||
@defun thread-sleep! timeout
|
||||
The current thread waits until the point specified by the time object
|
||||
@var{timeout} is reached (@pxref{SRFI-18 Time}). This blocks the
|
||||
thread only if @var{timeout} represents a point in the future. it is
|
||||
an error for @var{timeout} to be @code{#f}.
|
||||
@end defun
|
||||
|
||||
@defun thread-terminate! thread
|
||||
Causes an abnormal termination of @var{thread}. If @var{thread} is
|
||||
not already terminated, all mutexes owned by @var{thread} become
|
||||
unlocked/abandoned. If @var{thread} is the current thread,
|
||||
@code{thread-terminate!} does not return. Otherwise
|
||||
@code{thread-terminate!} returns an unspecified value; the termination
|
||||
of @var{thread} will occur before @code{thread-terminate!} returns.
|
||||
Subsequent attempts to join on @var{thread} will cause a ``terminated
|
||||
thread exception'' to be raised.
|
||||
|
||||
@code{thread-terminate!} is compatible with the thread cancellation
|
||||
procedures in the core threads API (@pxref{Threads}) in that if a
|
||||
cleanup handler has been installed for the target thread, it will be
|
||||
called before the thread exits and its return value (or exception, if
|
||||
any) will be stored for later retrieval via a call to
|
||||
@code{thread-join!}.
|
||||
@end defun
|
||||
|
||||
@defun thread-join! thread [timeout [timeout-val]]
|
||||
Wait for @var{thread} to terminate and return its exit value. When a
|
||||
time value @var{timeout} is given, it specifies a point in time where
|
||||
the waiting should be aborted. When the waiting is aborted,
|
||||
@var{timeoutval} is returned if it is specified; otherwise, a
|
||||
@code{join-timeout-exception} exception is raised
|
||||
(@pxref{SRFI-18 Exceptions}). Exceptions may also be raised if the
|
||||
thread was terminated by a call to @code{thread-terminate!}
|
||||
(@code{terminated-thread-exception} will be raised) or if the thread
|
||||
exited by raising an exception that was handled by the top-level
|
||||
exception handler (@code{uncaught-exception} will be raised; the
|
||||
original exception can be retrieved using
|
||||
@code{uncaught-exception-reason}).
|
||||
@end defun
|
||||
|
||||
|
||||
@node SRFI-18 Mutexes
|
||||
@subsubsection SRFI-18 Mutexes
|
||||
|
||||
The behavior of Guile's built-in mutexes is parameterized via a set of
|
||||
flags passed to the @code{make-mutex} procedure in the core
|
||||
(@pxref{Mutexes and Condition Variables}). To satisfy the requirements
|
||||
for mutexes specified by SRFI-18, the @code{make-mutex} procedure
|
||||
described below sets the following flags:
|
||||
@itemize @bullet
|
||||
@item
|
||||
@code{recursive}: the mutex can be locked recursively
|
||||
@item
|
||||
@code{unchecked-unlock}: attempts to unlock a mutex that is already
|
||||
unlocked will not raise an exception
|
||||
@item
|
||||
@code{allow-external-unlock}: the mutex can be unlocked by any thread,
|
||||
not just the thread that locked it originally
|
||||
@end itemize
|
||||
|
||||
@defun make-mutex [name]
|
||||
Returns a new mutex, optionally assigning it the object name
|
||||
@var{name}, which may be any Scheme object. The returned mutex will be
|
||||
created with the configuration described above. Note that the name
|
||||
@code{make-mutex} conflicts with Guile core function @code{make-mutex}.
|
||||
Applications wanting to use both of these functions will need to refer
|
||||
to them by different names.
|
||||
@end defun
|
||||
|
||||
@defun mutex-name mutex
|
||||
Returns the name assigned to @var{mutex} at the time of its creation,
|
||||
or @code{#f} if it was not given a name.
|
||||
@end defun
|
||||
|
||||
@defun mutex-specific mutex
|
||||
@defunx mutex-specific-set! mutex obj
|
||||
Get or set the ``object-specific'' property of @var{mutex}. In Guile's
|
||||
implementation of SRFI-18, this value is stored as an object property,
|
||||
and will be @code{#f} if not set.
|
||||
@end defun
|
||||
|
||||
@defun mutex-state mutex
|
||||
Returns information about the state of @var{mutex}. Possible values
|
||||
are:
|
||||
@itemize @bullet
|
||||
@item
|
||||
thread @code{T}: the mutex is in the locked/owned state and thread T
|
||||
is the owner of the mutex
|
||||
@item
|
||||
symbol @code{not-owned}: the mutex is in the locked/not-owned state
|
||||
@item
|
||||
symbol @code{abandoned}: the mutex is in the unlocked/abandoned state
|
||||
@item
|
||||
symbol @code{not-abandoned}: the mutex is in the
|
||||
unlocked/not-abandoned state
|
||||
@end itemize
|
||||
@end defun
|
||||
|
||||
@defun mutex-lock! mutex [timeout [thread]]
|
||||
Lock @var{mutex}, optionally specifying a time object @var{timeout}
|
||||
after which to abort the lock attempt and a thread @var{thread} giving
|
||||
a new owner for @var{mutex} different than the current thread. This
|
||||
procedure has the same behavior as the @code{lock-mutex} procedure in
|
||||
the core library.
|
||||
@end defun
|
||||
|
||||
@defun mutex-unlock! mutex [condition-variable [timeout]]
|
||||
Unlock @var{mutex}, optionally specifying a condition variable
|
||||
@var{condition-variable} on which to wait, either indefinitely or,
|
||||
optionally, until the time object @var{timeout} has passed, to be
|
||||
signalled. This procedure has the same behavior as the
|
||||
@code{unlock-mutex} procedure in the core library.
|
||||
@end defun
|
||||
|
||||
|
||||
@node SRFI-18 Condition variables
|
||||
@subsubsection SRFI-18 Condition variables
|
||||
|
||||
SRFI-18 does not specify a ``wait'' function for condition variables.
|
||||
Waiting on a condition variable can be simulated using the SRFI-18
|
||||
@code{mutex-unlock!} function described in the previous section, or
|
||||
Guile's built-in @code{wait-condition-variable} procedure can be used.
|
||||
|
||||
@defun condition-variable? obj
|
||||
Returns @code{#t} if @var{obj} is a condition variable, @code{#f}
|
||||
otherwise. This is the same procedure as the same-named built-in
|
||||
procedure
|
||||
(@pxref{Mutexes and Condition Variables, @code{condition-variable?}}).
|
||||
@end defun
|
||||
|
||||
@defun make-condition-variable [name]
|
||||
Returns a new condition variable, optionally assigning it the object
|
||||
name @var{name}, which may be any Scheme object. This procedure
|
||||
replaces a procedure of the same name in the core library.
|
||||
@end defun
|
||||
|
||||
@defun condition-variable-name condition-variable
|
||||
Returns the name assigned to @var{thread} at the time of its creation,
|
||||
or @code{#f} if it was not given a name.
|
||||
@end defun
|
||||
|
||||
@defun condition-variable-specific condition-variable
|
||||
@defunx condition-variable-specific-set! condition-variable obj
|
||||
Get or set the ``object-specific'' property of
|
||||
@var{condition-variable}. In Guile's implementation of SRFI-18, this
|
||||
value is stored as an object property, and will be @code{#f} if not
|
||||
set.
|
||||
@end defun
|
||||
|
||||
@defun condition-variable-signal! condition-variable
|
||||
@defunx condition-variable-broadcast! condition-variable
|
||||
Wake up one thread that is waiting for @var{condition-variable}, in
|
||||
the case of @code{condition-variable-signal!}, or all threads waiting
|
||||
for it, in the case of @code{condition-variable-broadcast!}. The
|
||||
behavior of these procedures is equivalent to that of the procedures
|
||||
@code{signal-condition-variable} and
|
||||
@code{broadcast-condition-variable} in the core library.
|
||||
@end defun
|
||||
|
||||
|
||||
@node SRFI-18 Time
|
||||
@subsubsection SRFI-18 Time
|
||||
|
||||
The SRFI-18 time functions manipulate time in two formats: a
|
||||
``time object'' type that represents an absolute point in time in some
|
||||
implementation-specific way; and the number of seconds since some
|
||||
unspecified ``epoch''. In Guile's implementation, the epoch is the
|
||||
Unix epoch, 00:00:00 UTC, January 1, 1970.
|
||||
|
||||
@defun current-time
|
||||
Return the current time as a time object. This procedure replaces
|
||||
the procedure of the same name in the core library, which returns the
|
||||
current time in seconds since the epoch.
|
||||
@end defun
|
||||
|
||||
@defun time? obj
|
||||
Returns @code{#t} if @var{obj} is a time object, @code{#f} otherwise.
|
||||
@end defun
|
||||
|
||||
@defun time->seconds time
|
||||
@defunx seconds->time seconds
|
||||
Convert between time objects and numerical values representing the
|
||||
number of seconds since the epoch. When converting from a time object
|
||||
to seconds, the return value is the number of seconds between
|
||||
@var{time} and the epoch. When converting from seconds to a time
|
||||
object, the return value is a time object that represents a time
|
||||
@var{seconds} seconds after the epoch.
|
||||
@end defun
|
||||
|
||||
|
||||
@node SRFI-18 Exceptions
|
||||
@subsubsection SRFI-18 Exceptions
|
||||
|
||||
SRFI-18 exceptions are identical to the exceptions provided by
|
||||
Guile's implementation of SRFI-34. The behavior of exception
|
||||
handlers invoked to handle exceptions thrown from SRFI-18 functions,
|
||||
however, differs from the conventional behavior of SRFI-34 in that
|
||||
the continuation of the handler is the same as that of the call to
|
||||
the function. Handlers are called in a tail-recursive manner; the
|
||||
exceptions do not ``bubble up''.
|
||||
|
||||
@defun current-exception-handler
|
||||
Returns the current exception handler.
|
||||
@end defun
|
||||
|
||||
@defun with-exception-handler handler thunk
|
||||
Installs @var{handler} as the current exception handler and calls the
|
||||
procedure @var{thunk} with no arguments, returning its value as the
|
||||
value of the exception. @var{handler} must be a procedure that accepts
|
||||
a single argument. The current exception handler at the time this
|
||||
procedure is called will be restored after the call returns.
|
||||
@end defun
|
||||
|
||||
@defun raise obj
|
||||
Raise @var{obj} as an exception. This is the same procedure as the
|
||||
same-named procedure defined in SRFI 34.
|
||||
@end defun
|
||||
|
||||
@defun join-timeout-exception? obj
|
||||
Returns @code{#t} if @var{obj} is an exception raised as the result of
|
||||
performing a timed join on a thread that does not exit within the
|
||||
specified timeout, @code{#f} otherwise.
|
||||
@end defun
|
||||
|
||||
@defun abandoned-mutex-exception? obj
|
||||
Returns @code{#t} if @var{obj} is an exception raised as the result of
|
||||
attempting to lock a mutex that has been abandoned by its owner thread,
|
||||
@code{#f} otherwise.
|
||||
@end defun
|
||||
|
||||
@defun terminated-thread-exception? obj
|
||||
Returns @code{#t} if @var{obj} is an exception raised as the result of
|
||||
joining on a thread that exited as the result of a call to
|
||||
@code{thread-terminate!}.
|
||||
@end defun
|
||||
|
||||
@defun uncaught-exception? obj
|
||||
@defunx uncaught-exception-reason exc
|
||||
@code{uncaught-exception?} returns @code{#t} if @var{obj} is an
|
||||
exception thrown as the result of joining a thread that exited by
|
||||
raising an exception that was handled by the top-level exception
|
||||
handler installed by @code{make-thread}. When this occurs, the
|
||||
original exception is preserved as part of the exception thrown by
|
||||
@code{thread-join!} and can be accessed by calling
|
||||
@code{uncaught-exception-reason} on that exception. Note that
|
||||
because this exception-preservation mechanism is a side-effect of
|
||||
@code{make-thread}, joining on threads that exited as described above
|
||||
but were created by other means will not raise this
|
||||
@code{uncaught-exception} error.
|
||||
@end defun
|
||||
|
||||
|
||||
@node SRFI-19
|
||||
@subsection SRFI-19 - Time/Date Library
|
||||
@cindex SRFI-19
|
||||
|
@ -1843,8 +2184,10 @@ Return the current time of the given @var{type}. The default
|
|||
@var{type} is @code{time-utc}.
|
||||
|
||||
Note that the name @code{current-time} conflicts with the Guile core
|
||||
@code{current-time} function (@pxref{Time}). Applications wanting to
|
||||
use both will need to use a different name for one of them.
|
||||
@code{current-time} function (@pxref{Time}) as well as the SRFI-18
|
||||
@code{current-time} function (@pxref{SRFI-18 Time}). Applications
|
||||
wanting to use more than one of these functions will need to refer to
|
||||
them by different names.
|
||||
@end defun
|
||||
|
||||
@defun time-resolution [type]
|
||||
|
@ -2470,7 +2813,7 @@ specified by @var{field+value}, a sequence of field names (symbols) and
|
|||
values as in the following example:
|
||||
|
||||
@lisp
|
||||
(let* ((&ct (make-condition-type 'foo &condition '(a b c))))
|
||||
(let ((&ct (make-condition-type 'foo &condition '(a b c))))
|
||||
(make-condition &ct 'a 1 'b 2 'c 3))
|
||||
@end lisp
|
||||
|
||||
|
@ -3027,6 +3370,245 @@ needed to get SRFI-61 itself. Extended @code{cond} is documented in
|
|||
@ref{if cond case,, Simple Conditional Evaluation}.
|
||||
|
||||
|
||||
@node SRFI-69
|
||||
@subsection SRFI-69 - Basic hash tables
|
||||
@cindex SRFI-69
|
||||
|
||||
This is a portable wrapper around Guile's built-in hash table and weak
|
||||
table support. @xref{Hash Tables}, for information on that built-in
|
||||
support. Above that, this hash-table interface provides association
|
||||
of equality and hash functions with tables at creation time, so
|
||||
variants of each function are not required, as well as a procedure
|
||||
that takes care of most uses for Guile hash table handles, which this
|
||||
SRFI does not provide as such.
|
||||
|
||||
Access it with:
|
||||
|
||||
@lisp
|
||||
(use-modules (srfi srfi-69))
|
||||
@end lisp
|
||||
|
||||
@menu
|
||||
* SRFI-69 Creating hash tables::
|
||||
* SRFI-69 Accessing table items::
|
||||
* SRFI-69 Table properties::
|
||||
* SRFI-69 Hash table algorithms::
|
||||
@end menu
|
||||
|
||||
@node SRFI-69 Creating hash tables
|
||||
@subsubsection Creating hash tables
|
||||
|
||||
@deffn {Scheme Procedure} make-hash-table [equal-proc hash-proc #:weak weakness start-size]
|
||||
Create and answer a new hash table with @var{equal-proc} as the
|
||||
equality function and @var{hash-proc} as the hashing function.
|
||||
|
||||
By default, @var{equal-proc} is @code{equal?}. It can be any
|
||||
two-argument procedure, and should answer whether two keys are the
|
||||
same for this table's purposes.
|
||||
|
||||
My default @var{hash-proc} assumes that @code{equal-proc} is no
|
||||
coarser than @code{equal?} unless it is literally @code{string-ci=?}.
|
||||
If provided, @var{hash-proc} should be a two-argument procedure that
|
||||
takes a key and the current table size, and answers a reasonably good
|
||||
hash integer between 0 (inclusive) and the size (exclusive).
|
||||
|
||||
@var{weakness} should be @code{#f} or a symbol indicating how ``weak''
|
||||
the hash table is:
|
||||
|
||||
@table @code
|
||||
@item #f
|
||||
An ordinary non-weak hash table. This is the default.
|
||||
|
||||
@item key
|
||||
When the key has no more non-weak references at GC, remove that entry.
|
||||
|
||||
@item value
|
||||
When the value has no more non-weak references at GC, remove that
|
||||
entry.
|
||||
|
||||
@item key-or-value
|
||||
When either has no more non-weak references at GC, remove the
|
||||
association.
|
||||
@end table
|
||||
|
||||
As a legacy of the time when Guile couldn't grow hash tables,
|
||||
@var{start-size} is an optional integer argument that specifies the
|
||||
approximate starting size for the hash table, which will be rounded to
|
||||
an algorithmically-sounder number.
|
||||
@end deffn
|
||||
|
||||
By @dfn{coarser} than @code{equal?}, we mean that for all @var{x} and
|
||||
@var{y} values where @code{(@var{equal-proc} @var{x} @var{y})},
|
||||
@code{(equal? @var{x} @var{y})} as well. If that does not hold for
|
||||
your @var{equal-proc}, you must provide a @var{hash-proc}.
|
||||
|
||||
In the case of weak tables, remember that @dfn{references} above
|
||||
always refers to @code{eq?}-wise references. Just because you have a
|
||||
reference to some string @code{"foo"} doesn't mean that an association
|
||||
with key @code{"foo"} in a weak-key table @emph{won't} be collected;
|
||||
it only counts as a reference if the two @code{"foo"}s are @code{eq?},
|
||||
regardless of @var{equal-proc}. As such, it is usually only sensible
|
||||
to use @code{eq?} and @code{hashq} as the equivalence and hash
|
||||
functions for a weak table. @xref{Weak References}, for more
|
||||
information on Guile's built-in weak table support.
|
||||
|
||||
@deffn {Scheme Procedure} alist->hash-table alist [equal-proc hash-proc #:weak weakness start-size]
|
||||
As with @code{make-hash-table}, but initialize it with the
|
||||
associations in @var{alist}. Where keys are repeated in @var{alist},
|
||||
the leftmost association takes precedence.
|
||||
@end deffn
|
||||
|
||||
@node SRFI-69 Accessing table items
|
||||
@subsubsection Accessing table items
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-ref table key [default-thunk]
|
||||
@deffnx {Scheme Procedure} hash-table-ref/default table key default
|
||||
Answer the value associated with @var{key} in @var{table}. If
|
||||
@var{key} is not present, answer the result of invoking the thunk
|
||||
@var{default-thunk}, which signals an error instead by default.
|
||||
|
||||
@code{hash-table-ref/default} is a variant that requires a third
|
||||
argument, @var{default}, and answers @var{default} itself instead of
|
||||
invoking it.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-set! table key new-value
|
||||
Set @var{key} to @var{new-value} in @var{table}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-delete! table key
|
||||
Remove the association of @var{key} in @var{table}, if present. If
|
||||
absent, do nothing.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-exists? table key
|
||||
Answer whether @var{key} has an association in @var{table}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-update! table key modifier [default-thunk]
|
||||
@deffnx {Scheme Procedure} hash-table-update!/default table key modifier default
|
||||
Replace @var{key}'s associated value in @var{table} by invoking
|
||||
@var{modifier} with one argument, the old value.
|
||||
|
||||
If @var{key} is not present, and @var{default-thunk} is provided,
|
||||
invoke it with no arguments to get the ``old value'' to be passed to
|
||||
@var{modifier} as above. If @var{default-thunk} is not provided in
|
||||
such a case, signal an error.
|
||||
|
||||
@code{hash-table-update!/default} is a variant that requires the
|
||||
fourth argument, which is used directly as the ``old value'' rather
|
||||
than as a thunk to be invoked to retrieve the ``old value''.
|
||||
@end deffn
|
||||
|
||||
@node SRFI-69 Table properties
|
||||
@subsubsection Table properties
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-size table
|
||||
Answer the number of associations in @var{table}. This is guaranteed
|
||||
to run in constant time for non-weak tables.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-keys table
|
||||
Answer an unordered list of the keys in @var{table}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-values table
|
||||
Answer an unordered list of the values in @var{table}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-walk table proc
|
||||
Invoke @var{proc} once for each association in @var{table}, passing
|
||||
the key and value as arguments.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-fold table proc init
|
||||
Invoke @code{(@var{proc} @var{key} @var{value} @var{previous})} for
|
||||
each @var{key} and @var{value} in @var{table}, where @var{previous} is
|
||||
the result of the previous invocation, using @var{init} as the first
|
||||
@var{previous} value. Answer the final @var{proc} result.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash-table->alist table
|
||||
Answer an alist where each association in @var{table} is an
|
||||
association in the result.
|
||||
@end deffn
|
||||
|
||||
@node SRFI-69 Hash table algorithms
|
||||
@subsubsection Hash table algorithms
|
||||
|
||||
Each hash table carries an @dfn{equivalence function} and a @dfn{hash
|
||||
function}, used to implement key lookups. Beginning users should
|
||||
follow the rules for consistency of the default @var{hash-proc}
|
||||
specified above. Advanced users can use these to implement their own
|
||||
equivalence and hash functions for specialized lookup semantics.
|
||||
|
||||
@deffn {Scheme Procedure} hash-table-equivalence-function hash-table
|
||||
@deffnx {Scheme Procedure} hash-table-hash-function hash-table
|
||||
Answer the equivalence and hash function of @var{hash-table}, respectively.
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} hash obj [size]
|
||||
@deffnx {Scheme Procedure} string-hash obj [size]
|
||||
@deffnx {Scheme Procedure} string-ci-hash obj [size]
|
||||
@deffnx {Scheme Procedure} hash-by-identity obj [size]
|
||||
Answer a hash value appropriate for equality predicate @code{equal?},
|
||||
@code{string=?}, @code{string-ci=?}, and @code{eq?}, respectively.
|
||||
@end deffn
|
||||
|
||||
@code{hash} is a backwards-compatible replacement for Guile's built-in
|
||||
@code{hash}.
|
||||
|
||||
@node SRFI-88
|
||||
@subsection SRFI-88 Keyword Objects
|
||||
@cindex SRFI-88
|
||||
@cindex keyword objects
|
||||
|
||||
@uref{http://srfi.schemers.org/srfi-88/srfi-88.html, SRFI-88} provides
|
||||
@dfn{keyword objects}, which are equivalent to Guile's keywords
|
||||
(@pxref{Keywords}). SRFI-88 keywords can be entered using the
|
||||
@dfn{postfix keyword syntax}, which consists of an identifier followed
|
||||
by @code{:} (@pxref{Reader options, @code{postfix} keyword syntax}).
|
||||
SRFI-88 can be made available with:
|
||||
|
||||
@example
|
||||
(use-modules (srfi srfi-88))
|
||||
@end example
|
||||
|
||||
Doing so installs the right reader option for keyword syntax, using
|
||||
@code{(read-set! keywords 'postfix)}. It also provides the procedures
|
||||
described below.
|
||||
|
||||
@deffn {Scheme Procedure} keyword? obj
|
||||
Return @code{#t} if @var{obj} is a keyword. This is the same procedure
|
||||
as the same-named built-in procedure (@pxref{Keyword Procedures,
|
||||
@code{keyword?}}).
|
||||
|
||||
@example
|
||||
(keyword? foo:) @result{} #t
|
||||
(keyword? 'foo:) @result{} #t
|
||||
(keyword? "foo") @result{} #f
|
||||
@end example
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} keyword->string kw
|
||||
Return the name of @var{kw} as a string, i.e., without the trailing
|
||||
colon. The returned string may not be modified, e.g., with
|
||||
@code{string-set!}.
|
||||
|
||||
@example
|
||||
(keyword->string foo:) @result{} "foo"
|
||||
@end example
|
||||
@end deffn
|
||||
|
||||
@deffn {Scheme Procedure} string->keyword str
|
||||
Return the keyword object whose name is @var{str}.
|
||||
|
||||
@example
|
||||
(keyword->string (string->keyword "a b c")) @result{} "a b c"
|
||||
@end example
|
||||
@end deffn
|
||||
|
||||
|
||||
@c srfi-modules.texi ends here
|
||||
|
||||
@c Local Variables:
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2008-07-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* gds-scheme.el (gds-eval-region, gds-eval-expression)
|
||||
(gds-eval-defun, gds-eval-last-sexp): Support `C-u' prefix,
|
||||
meaning that user wants to single step through the code.
|
||||
|
||||
2007-02-06 Clinton Ebadi <clinton@unknownlamer.org>
|
||||
|
||||
* gds-scheme.el (gds-display-results): Use save-selected-window
|
||||
|
|
|
@ -279,9 +279,12 @@ region's code."
|
|||
(setq line (count-lines (point-min) (point))))
|
||||
(cons line column)))
|
||||
|
||||
(defun gds-eval-region (start end)
|
||||
"Evaluate the current region."
|
||||
(interactive "r")
|
||||
(defun gds-eval-region (start end &optional debugp)
|
||||
"Evaluate the current region. If invoked with `C-u' prefix (or, in
|
||||
a program, with optional DEBUGP arg non-nil), pause and pop up the
|
||||
stack at the start of the evaluation, so that the user can single-step
|
||||
through the code."
|
||||
(interactive "r\nP")
|
||||
(or gds-client
|
||||
(gds-auto-associate-buffer)
|
||||
(call-interactively 'gds-associate-buffer))
|
||||
|
@ -289,24 +292,29 @@ region's code."
|
|||
(port-name (gds-port-name start end))
|
||||
(lc (gds-line-and-column start)))
|
||||
(let ((code (buffer-substring-no-properties start end)))
|
||||
(gds-send (format "eval (region . %S) %s %S %d %d %S"
|
||||
(gds-send (format "eval (region . %S) %s %S %d %d %S %s"
|
||||
(gds-abbreviated code)
|
||||
(if module (prin1-to-string module) "#f")
|
||||
port-name (car lc) (cdr lc)
|
||||
code)
|
||||
code
|
||||
(if debugp '(debug) '(none)))
|
||||
gds-client))))
|
||||
|
||||
(defun gds-eval-expression (expr &optional correlator)
|
||||
"Evaluate the supplied EXPR (a string)."
|
||||
(interactive "sEvaluate expression: \nP")
|
||||
(defun gds-eval-expression (expr &optional correlator debugp)
|
||||
"Evaluate the supplied EXPR (a string). If invoked with `C-u'
|
||||
prefix (or, in a program, with optional DEBUGP arg non-nil), pause and
|
||||
pop up the stack at the start of the evaluation, so that the user can
|
||||
single-step through the code."
|
||||
(interactive "sEvaluate expression: \ni\nP")
|
||||
(or gds-client
|
||||
(gds-auto-associate-buffer)
|
||||
(call-interactively 'gds-associate-buffer))
|
||||
(set-text-properties 0 (length expr) nil expr)
|
||||
(gds-send (format "eval (%S . %S) #f \"Emacs expression\" 0 0 %S"
|
||||
(gds-send (format "eval (%S . %S) #f \"Emacs expression\" 0 0 %S %s"
|
||||
(or correlator 'expression)
|
||||
(gds-abbreviated expr)
|
||||
expr)
|
||||
expr
|
||||
(if debugp '(debug) '(none)))
|
||||
gds-client))
|
||||
|
||||
(defconst gds-abbreviated-length 35)
|
||||
|
@ -325,19 +333,25 @@ region's code."
|
|||
(concat (substring code 0 (- gds-abbreviated-length 3)) "...")
|
||||
code))
|
||||
|
||||
(defun gds-eval-defun ()
|
||||
"Evaluate the defun (top-level form) at point."
|
||||
(interactive)
|
||||
(defun gds-eval-defun (&optional debugp)
|
||||
"Evaluate the defun (top-level form) at point. If invoked with
|
||||
`C-u' prefix (or, in a program, with optional DEBUGP arg non-nil),
|
||||
pause and pop up the stack at the start of the evaluation, so that the
|
||||
user can single-step through the code."
|
||||
(interactive "P")
|
||||
(save-excursion
|
||||
(end-of-defun)
|
||||
(let ((end (point)))
|
||||
(beginning-of-defun)
|
||||
(gds-eval-region (point) end))))
|
||||
(gds-eval-region (point) end debugp))))
|
||||
|
||||
(defun gds-eval-last-sexp ()
|
||||
"Evaluate the sexp before point."
|
||||
(interactive)
|
||||
(gds-eval-region (save-excursion (backward-sexp) (point)) (point)))
|
||||
(defun gds-eval-last-sexp (&optional debugp)
|
||||
"Evaluate the sexp before point. If invoked with `C-u' prefix (or,
|
||||
in a program, with optional DEBUGP arg non-nil), pause and pop up the
|
||||
stack at the start of the evaluation, so that the user can single-step
|
||||
through the code."
|
||||
(interactive "P")
|
||||
(gds-eval-region (save-excursion (backward-sexp) (point)) (point) debugp))
|
||||
|
||||
;;;; Help.
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* compat/compat.h: Update copyright statement to LGPL.
|
||||
|
||||
2002-11-17 Mikael Djurfeldt <mdj@linnaeus>
|
||||
|
||||
* README: Added description of compat.
|
||||
|
|
|
@ -2,46 +2,22 @@
|
|||
|
||||
#ifndef COMPATH
|
||||
#define COMPATH
|
||||
/* Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2001, 2002, 2006, 2008 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,
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* As a special exception, the Free Software Foundation gives permission
|
||||
* for additional uses of the text contained in its release of GUILE.
|
||||
*
|
||||
* The exception is that, if you link the GUILE library with other files
|
||||
* to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the GUILE library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the
|
||||
* Free Software Foundation under the name GUILE. If you copy
|
||||
* code from other Free Software Foundation releases into a copy of
|
||||
* GUILE, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for GUILE, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice. */
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SCM_GC8MARKP
|
||||
|
|
15
guile-1.8.pc.in
Normal file
15
guile-1.8.pc.in
Normal file
|
@ -0,0 +1,15 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
datarootdir=@datarootdir@
|
||||
datadir=@datadir@
|
||||
|
||||
sitedir=@sitedir@
|
||||
libguileinterface=@LIBGUILE_INTERFACE@
|
||||
|
||||
Name: GNU Guile
|
||||
Description: GNU's Ubiquitous Intelligent Language for Extension
|
||||
Version: @GUILE_VERSION@
|
||||
Libs: -L${libdir} -lguile @GUILE_LIBS@
|
||||
Cflags: -I${includedir} @GUILE_CFLAGS@
|
|
@ -1,3 +1,16 @@
|
|||
2008-06-02 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* guile-config.in (build-link): Show `-L' before `-lguile'.
|
||||
Reported by Peter O'Gorman <pogma@thewrittenword.com>.
|
||||
|
||||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
2007-12-30 Mike Gran <spk121@yahoo.com>
|
||||
|
||||
* guile.m4: add serial number to m4
|
||||
|
||||
2007-01-04 Kevin Ryde <user42@zip.com.au>
|
||||
|
||||
* Makefile.am (guile-config): Use "|" as the sed delimiter, for the
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
;;;; guile-config --- utility for linking programs with Guile
|
||||
;;;; Jim Blandy <jim@red-bean.com> --- September 1997
|
||||
;;;;
|
||||
;;;; Copyright (C) 1998, 2001, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 1998, 2001, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
|
||||
;;;;
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -151,11 +151,11 @@
|
|||
(display (string-join
|
||||
(list
|
||||
(get-build-info 'CFLAGS)
|
||||
"-lguile -lltdl"
|
||||
(if (or (string=? libdir "/usr/lib")
|
||||
(string=? libdir "/usr/lib/"))
|
||||
""
|
||||
(string-append "-L" (get-build-info 'libdir)))
|
||||
"-lguile -lltdl"
|
||||
(string-join other-flags)
|
||||
|
||||
)))
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
## License along with this library; if not, write to the Free Software
|
||||
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
# serial 9
|
||||
|
||||
## Index
|
||||
## -----
|
||||
##
|
||||
|
|
|
@ -1,165 +0,0 @@
|
|||
dnl Autoconf macros for configuring the QuickThreads package
|
||||
dnl Jim Blandy <jimb@red-bean.com> --- July 1998
|
||||
dnl
|
||||
dnl Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
|
||||
dnl
|
||||
dnl This file is part of GUILE.
|
||||
dnl
|
||||
dnl GUILE is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as
|
||||
dnl published by the Free Software Foundation; either version 2, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl GUILE is distributed in the hope that it will be useful, but
|
||||
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public
|
||||
dnl License along with GUILE; see the file COPYING. If not, write
|
||||
dnl to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||||
dnl Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
|
||||
dnl QTHREADS_CONFIGURE configures the QuickThreads package. The QT
|
||||
dnl sources should be in $srcdir/qt. If configuration succeeds, this
|
||||
dnl macro creates the appropriate symlinks in the qt object directory,
|
||||
dnl and sets the following variables, used in building libqthreads.a:
|
||||
dnl QTHREAD_LTLIBS --- set to libqthreads.la if configuration
|
||||
dnl succeeds, or the empty string if configuration fails.
|
||||
dnl qtmd_h, qtmds_s, qtmdc_c, qtdmdb_s --- the names of the machine-
|
||||
dnl dependent source files.
|
||||
dnl qthread_asflags --- flags to pass to the compiler when processing
|
||||
dnl assembly-language files.
|
||||
dnl
|
||||
dnl It also sets the following variables, which describe how clients
|
||||
dnl can link against libqthreads.a:
|
||||
dnl THREAD_PACKAGE --- set to "QT" if configuration succeeds, or
|
||||
dnl the empty string if configuration fails.
|
||||
dnl THREAD_LIBS_LOCAL --- linker options for use in this source tree
|
||||
dnl THREAD_LIBS_INSTALLED --- linker options for use after this package
|
||||
dnl is installed
|
||||
dnl It would be nice if all thread configuration packages for Guile
|
||||
dnl followed the same conventions.
|
||||
dnl
|
||||
dnl All of the above variables will be substituted into Makefiles in
|
||||
dnl the usual autoconf fashion.
|
||||
dnl
|
||||
dnl We distinguish between THREAD_LIBS_LOCAL and
|
||||
dnl THREAD_LIBS_INSTALLED because the thread library might be in
|
||||
dnl this tree, and be built using libtool. This means that:
|
||||
dnl 1) when building other executables in this tree, one must
|
||||
dnl pass the relative path to the ../libfoo.la file, but
|
||||
dnl 2) once the whole package has been installed, users should
|
||||
dnl link using -lfoo.
|
||||
dnl Normally, we only care about the first case, but since the
|
||||
dnl guile-config script needs to give users all the flags they need
|
||||
dnl to link programs against guile, the GUILE_WITH_THREADS macro
|
||||
dnl needs to supply the second piece of information as well.
|
||||
dnl
|
||||
dnl This whole thing is a little confused about what ought to be
|
||||
dnl done in the top-level configure script, and what ought to be
|
||||
dnl taken care of in the subdirectory. For example, qtmds_s and
|
||||
dnl friends really ought not to be even mentioned in the top-level
|
||||
dnl configure script, but here they are.
|
||||
|
||||
AC_DEFUN([QTHREADS_CONFIGURE],[
|
||||
AC_REQUIRE([AC_PROG_LN_S])
|
||||
|
||||
AC_MSG_CHECKING(QuickThreads configuration)
|
||||
|
||||
changequote(,)dnl We use [ and ] in a regexp in the case
|
||||
|
||||
THREAD_PACKAGE=QT
|
||||
qthread_asflags=''
|
||||
case "$host" in
|
||||
i[3456]86-*-*)
|
||||
port_name=i386
|
||||
qtmd_h=md/i386.h
|
||||
qtmds_s=md/i386.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=
|
||||
case "$host" in
|
||||
*-*-netbsd* )
|
||||
## NetBSD needs to be told to pass the assembly code through
|
||||
## the C preprocessor. Other GCC installations seem to do
|
||||
## this by default, but NetBSD's doesn't. We could get the
|
||||
## same effect by giving the file a name ending with .S
|
||||
## instead of .s, but I don't see how to tell automake to do
|
||||
## that.
|
||||
qthread_asflags='-x assembler-with-cpp'
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
mips-sgi-irix[56]*)
|
||||
port_name=irix
|
||||
qtmd_h=md/mips.h
|
||||
qtmds_s=md/mips-irix5.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=md/mips_b.s
|
||||
;;
|
||||
mips-*-*)
|
||||
port_name=mips
|
||||
qtmd_h=md/mips.h
|
||||
qtmds_s=md/mips.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=md/mips_b.s
|
||||
;;
|
||||
sparc-*-sunos*)
|
||||
port_name=sparc-sunos
|
||||
qtmd_h=md/sparc.h
|
||||
qtmds_s=md/_sparc.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=md/_sparc_b.s
|
||||
;;
|
||||
sparc*-*-*)
|
||||
port_name=sparc
|
||||
qtmd_h=md/sparc.h
|
||||
qtmds_s=md/sparc.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=md/sparc_b.s
|
||||
;;
|
||||
alpha*-*-*)
|
||||
port_name=alpha
|
||||
qtmd_h=md/axp.h
|
||||
qtmds_s=md/axp.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=md/axp_b.s
|
||||
;;
|
||||
arm*-*-*)
|
||||
port_name=arm
|
||||
qtmd_h=md/arm.h
|
||||
qtmds_s=md/arm.s
|
||||
qtmdc_c=md/null.c
|
||||
qtdmdb_s=
|
||||
;;
|
||||
*)
|
||||
echo "Unknown configuration; threads package disabled"
|
||||
THREAD_PACKAGE=""
|
||||
;;
|
||||
esac
|
||||
changequote([, ])
|
||||
|
||||
# Did configuration succeed?
|
||||
if test -n "$THREAD_PACKAGE"; then
|
||||
AC_MSG_RESULT($port_name)
|
||||
QTHREAD_LTLIBS=libqthreads.la
|
||||
THREAD_LIBS_LOCAL="../qt/libqthreads.la"
|
||||
THREAD_LIBS_INSTALLED="-lqthreads"
|
||||
else
|
||||
AC_MSG_RESULT(none; disabled)
|
||||
fi
|
||||
|
||||
AC_SUBST(QTHREAD_LTLIBS)
|
||||
AC_SUBST(qtmd_h)
|
||||
AC_SUBST(qtmds_s)
|
||||
AC_SUBST(qtmdc_c)
|
||||
AC_SUBST(qtdmdb_s)
|
||||
AC_SUBST(qthread_asflags)
|
||||
AC_SUBST(THREAD_PACKAGE)
|
||||
AC_SUBST(THREAD_LIBS_LOCAL)
|
||||
AC_SUBST(THREAD_LIBS_INSTALLED)
|
||||
])
|
||||
|
||||
dnl qthreads.m4 ends here
|
|
@ -1,3 +1,28 @@
|
|||
2008-05-07 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* ice-9/Makefile.am (guile_pdd): Don't use `patsubst': it's GNU
|
||||
Make and broke BSD Make as found on FreeBSD 6.2.
|
||||
|
||||
2008-04-16 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* configure.in (AC_INIT): Don't use "echo -n", which is not
|
||||
available on MacOS X; use `patsubst' instead to remove the
|
||||
newline. Reported by Steven Wu <wus@qwest.net>.
|
||||
|
||||
2008-02-16 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* LIBGUILEREADLINE-VERSION
|
||||
(LIBGUILEREADLINE_INTERFACE_REVISION): Increment for release.
|
||||
|
||||
2008-01-29 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* readline.c (scm_init_readline): Only do init_bouncing_parens ()
|
||||
if HAVE_RL_GET_KEYMAP.
|
||||
(init_bouncing_parens, find_matching_paren, match_paren): Compile
|
||||
out if ! HAVE_RL_GET_KEYMAP.
|
||||
|
||||
* configure.in: Add check for rl_get_keymap.
|
||||
|
||||
2007-07-29 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* Makefile.am (INCLUDES): Add Gnulib includes.
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
AC_PREREQ(2.50)
|
||||
|
||||
dnl Don't use "echo -n", which is not portable (e.g., not available on
|
||||
dnl MacOS X). Instead, use `patsubst' to remove the newline.
|
||||
AC_INIT(guile-readline,
|
||||
m4_esyscmd(. ../GUILE-VERSION && echo -n ${GUILE_VERSION}))
|
||||
patsubst(m4_esyscmd(. ../GUILE-VERSION && echo ${GUILE_VERSION}), [
|
||||
]),
|
||||
[bug-guile@gnu.org])
|
||||
|
||||
AC_CONFIG_AUX_DIR([.])
|
||||
AC_CONFIG_SRCDIR(readline.c)
|
||||
AM_CONFIG_HEADER([guile-readline-config.h])
|
||||
|
@ -43,6 +48,11 @@ AC_CHECK_FUNCS(siginterrupt rl_clear_signals rl_cleanup_after_signal)
|
|||
dnl Check for modern readline naming
|
||||
AC_CHECK_FUNCS(rl_filename_completion_function)
|
||||
|
||||
dnl Check for rl_get_keymap. We only use this for deciding whether to
|
||||
dnl install paren matching on the Guile command line (when using
|
||||
dnl readline for input), so it's completely optional.
|
||||
AC_CHECK_FUNCS(rl_get_keymap)
|
||||
|
||||
dnl Check for rl_pre_input_hook. This is more complicated because on
|
||||
dnl some systems (HP/UX), the linker wont let us treat
|
||||
dnl rl_pre_input_hook as a function when it really is a function
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
## Process this file with Automake to create Makefile.in
|
||||
##
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
|
||||
## Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -20,7 +19,9 @@
|
|||
## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||||
## Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
guile_pdd = $(patsubst %/guile-readline,%/guile,$(pkgdatadir))
|
||||
# Guile's `pkgdatadir'.
|
||||
guile_pdd = $(datadir)/guile
|
||||
|
||||
ice9dir = $(guile_pdd)/$(GUILE_EFFECTIVE_VERSION)/ice-9
|
||||
ice9_DATA = readline.scm
|
||||
ETAGS_ARGS = $(ice9_DATA)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* readline.c --- line editing support for Guile */
|
||||
|
||||
/* Copyright (C) 1997,1999,2000,2001, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997,1999,2000,2001, 2002, 2003, 2006, 2007, 2008 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
|
||||
|
@ -425,6 +425,7 @@ completion_function (char *text, int continuep)
|
|||
}
|
||||
}
|
||||
|
||||
#if HAVE_RL_GET_KEYMAP
|
||||
/*Bouncing parenthesis (reimplemented by GH, 11/23/98, since readline is strict gpl)*/
|
||||
|
||||
static int match_paren (int x, int k);
|
||||
|
@ -528,6 +529,7 @@ match_paren (int x, int k)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_RL_GET_KEYMAP */
|
||||
|
||||
#if defined (HAVE_RL_PRE_INPUT_HOOK) && defined (GUILE_SIGWINCH_SA_RESTART_CLEARED)
|
||||
/* Readline disables SA_RESTART on SIGWINCH.
|
||||
|
@ -575,7 +577,9 @@ scm_init_readline ()
|
|||
reentry_barrier_mutex = scm_permanent_object (scm_make_mutex ());
|
||||
scm_init_opts (scm_readline_options,
|
||||
scm_readline_opts);
|
||||
#if HAVE_RL_GET_KEYMAP
|
||||
init_bouncing_parens();
|
||||
#endif
|
||||
scm_add_feature ("readline");
|
||||
#endif /* HAVE_RL_GETC_FUNCTION */
|
||||
}
|
||||
|
|
|
@ -1,3 +1,28 @@
|
|||
2008-07-17 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* gds-client.scm (handle-nondebug-protocol): Add support for
|
||||
setting a trap on code that is about to be evaluated.
|
||||
|
||||
2008-04-14 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* gds-client.scm (gds-debug-trap): Ensure that frame index passed
|
||||
to Emacs is always positive.
|
||||
|
||||
2008-03-19 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* debugging/ice-9-debugger-extensions.scm (command-loop): Use
|
||||
needed modules.
|
||||
|
||||
2008-02-22 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* match.scm: Export `match:andmap'. This fixes evaluation of
|
||||
expressions like `(match expr (((_ ...) ...) #t))' where a list
|
||||
of lists is to be matched.
|
||||
|
||||
2008-01-22 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* COPYING: Removed.
|
||||
|
||||
2007-10-02 Ludovic Courtès <ludo@gnu.org>
|
||||
|
||||
* slib.scm: Let SLIB's `guile.init' do most of the job. See the
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
## Process this file with automake to produce Makefile.in.
|
||||
##
|
||||
## Copyright (C) 1998,1999,2000,2001,2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998,1999,2000,2001,2003, 2004, 2006, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -46,7 +46,6 @@ TAGS_FILES = $(subpkgdata_DATA)
|
|||
## test.scm is not currently installed.
|
||||
EXTRA_DIST = $(ice9_sources) test.scm compile-psyntax.scm
|
||||
|
||||
if MAINTAINER_MODE
|
||||
# We expect this to never be invoked when there is not already
|
||||
# ice-9/psyntax.pp in %load-path, since compile-psyntax.scm depends
|
||||
# on ice-9/syncase.scm, which does `(load-from-path "ice-9/psyntax.pp")'.
|
||||
|
@ -56,4 +55,4 @@ include $(top_srcdir)/am/pre-inst-guile
|
|||
psyntax.pp: psyntax.ss
|
||||
$(preinstguile) -s $(srcdir)/compile-psyntax.scm \
|
||||
$(srcdir)/psyntax.ss $(srcdir)/psyntax.pp
|
||||
endif
|
||||
|
||||
|
|
|
@ -28,7 +28,10 @@
|
|||
|
||||
(cond ((string>=? (version) "1.7")
|
||||
(use-modules (ice-9 debugger command-loop))
|
||||
(define-module (ice-9 debugger command-loop))
|
||||
(define-module (ice-9 debugger command-loop)
|
||||
#:use-module (ice-9 debugger)
|
||||
#:use-module (ice-9 debugger state)
|
||||
#:use-module (ice-9 debugging traps))
|
||||
(define new-define-command define-command)
|
||||
(set! define-command
|
||||
(lambda (name argument-template documentation procedure)
|
||||
|
|
|
@ -73,7 +73,9 @@
|
|||
(slot-ref (car fired-traps) 'depth)))))
|
||||
;; Write current stack to the frontend.
|
||||
(write-form (list 'stack
|
||||
(or special-index 0)
|
||||
(if (and special-index (> special-index 0))
|
||||
special-index
|
||||
0)
|
||||
(stack->emacs-readable stack)
|
||||
(append (flags->emacs-readable flags)
|
||||
(slot-ref trap-context
|
||||
|
@ -352,7 +354,7 @@ Thanks!\n\n"
|
|||
|
||||
((eval)
|
||||
(set! last-lazy-trap-context #f)
|
||||
(apply (lambda (correlator module port-name line column code)
|
||||
(apply (lambda (correlator module port-name line column code flags)
|
||||
(with-input-from-string code
|
||||
(lambda ()
|
||||
(set-port-filename! (current-input-port) port-name)
|
||||
|
@ -382,6 +384,11 @@ Thanks!\n\n"
|
|||
;; it to the list.
|
||||
(begin
|
||||
(for-each-breakpoint setup-after-read x)
|
||||
(if (and (pair? x)
|
||||
(memq 'debug flags))
|
||||
(install-trap (make <source-trap>
|
||||
#:expression x
|
||||
#:behaviour gds-debug-trap)))
|
||||
(loop (cons x exprs) (read))))))
|
||||
(lambda (key . args)
|
||||
(write-form `(eval-results
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
;;; installed-scm-file
|
||||
|
||||
;;;; Copyright (C) 2001, 2006 Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 2001, 2006, 2008 Free Software Foundation, Inc.
|
||||
;;;;
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -22,6 +22,7 @@
|
|||
:export (match match-lambda match-lambda* match-define
|
||||
match-let match-let* match-letrec
|
||||
define-structure define-const-structure
|
||||
match:andmap
|
||||
match:error match:set-error
|
||||
match:error-control match:set-error-control
|
||||
match:structure-control match:set-structure-control
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2008-04-14 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* primitives/symprop.scm (get): Use lambda->nil.
|
||||
|
||||
* primitives/strings.scm (aset): New primitive.
|
||||
|
||||
* internals/load.scm (load): Use in-vicinity (instead of
|
||||
string-append) to add a slash if needed.
|
||||
|
||||
2004-02-08 Mikael Djurfeldt <djurfeldt@nada.kth.se>
|
||||
|
||||
* primitives/Makefile.am (TAGS_FILES), internals/Makefile.am
|
||||
|
|
|
@ -15,9 +15,8 @@
|
|||
'("")
|
||||
load-path)))
|
||||
(cond ((null? dirs) #f)
|
||||
((file-exists? (string-append (car dirs)
|
||||
filename))
|
||||
(string-append (car dirs) filename))
|
||||
((file-exists? (in-vicinity (car dirs) filename))
|
||||
(in-vicinity (car dirs) filename))
|
||||
(else (loop (cdr dirs)))))))
|
||||
(if pathname
|
||||
(begin
|
||||
|
|
|
@ -29,6 +29,12 @@
|
|||
((string? array) (char->integer (string-ref array idx)))
|
||||
(else (wta 'arrayp array 1)))))
|
||||
|
||||
(fset 'aset
|
||||
(lambda (array idx newelt)
|
||||
(cond ((vector? array) (vector-set! array idx newelt))
|
||||
((string? array) (string-set! array idx (integer->char newelt)))
|
||||
(else (wta 'arrayp array 1)))))
|
||||
|
||||
(fset 'stringp (lambda->nil string?))
|
||||
|
||||
(fset 'vector vector)
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
(fset 'put set-symbol-property!)
|
||||
|
||||
(fset 'get symbol-property)
|
||||
(fset 'get (lambda->nil symbol-property))
|
||||
|
||||
(fset 'set set)
|
||||
|
||||
|
|
222
lib/Makefile.am
Normal file
222
lib/Makefile.am
Normal file
|
@ -0,0 +1,222 @@
|
|||
## DO NOT EDIT! GENERATED AUTOMATICALLY!
|
||||
## Process this file with automake to produce Makefile.in.
|
||||
# Copyright (C) 2002-2008 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software, distributed under the terms of the GNU
|
||||
# General Public License. As a special exception to the GNU General
|
||||
# Public License, this file may be distributed as part of a program
|
||||
# that contains a configuration script generated by Autoconf, under
|
||||
# the same distribution terms as the rest of that program.
|
||||
#
|
||||
# Generated by gnulib-tool.
|
||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --aux-dir=build-aux --lgpl --libtool --macro-prefix=gl alloca count-one-bits extensions strcase strftime
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.5 gnits
|
||||
|
||||
noinst_HEADERS =
|
||||
noinst_LIBRARIES =
|
||||
noinst_LTLIBRARIES =
|
||||
EXTRA_DIST =
|
||||
BUILT_SOURCES =
|
||||
SUFFIXES =
|
||||
MOSTLYCLEANFILES = core *.stackdump
|
||||
MOSTLYCLEANDIRS =
|
||||
CLEANFILES =
|
||||
DISTCLEANFILES =
|
||||
MAINTAINERCLEANFILES =
|
||||
|
||||
AM_CPPFLAGS =
|
||||
|
||||
noinst_LTLIBRARIES += libgnu.la
|
||||
|
||||
libgnu_la_SOURCES =
|
||||
libgnu_la_LIBADD = $(gl_LTLIBOBJS)
|
||||
libgnu_la_DEPENDENCIES = $(gl_LTLIBOBJS)
|
||||
EXTRA_libgnu_la_SOURCES =
|
||||
libgnu_la_LDFLAGS = $(AM_LDFLAGS)
|
||||
|
||||
## begin gnulib module alloca
|
||||
|
||||
|
||||
EXTRA_DIST += alloca.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += alloca.c
|
||||
|
||||
libgnu_la_LIBADD += @LTALLOCA@
|
||||
libgnu_la_DEPENDENCIES += @LTALLOCA@
|
||||
## end gnulib module alloca
|
||||
|
||||
## begin gnulib module alloca-opt
|
||||
|
||||
BUILT_SOURCES += $(ALLOCA_H)
|
||||
|
||||
# We need the following in order to create <alloca.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
alloca.h: alloca.in.h
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/alloca.in.h; \
|
||||
} > $@-t
|
||||
mv -f $@-t $@
|
||||
MOSTLYCLEANFILES += alloca.h alloca.h-t
|
||||
|
||||
EXTRA_DIST += alloca.in.h
|
||||
|
||||
## end gnulib module alloca-opt
|
||||
|
||||
## begin gnulib module count-one-bits
|
||||
|
||||
|
||||
EXTRA_DIST += count-one-bits.h
|
||||
|
||||
## end gnulib module count-one-bits
|
||||
|
||||
## begin gnulib module link-warning
|
||||
|
||||
LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h
|
||||
|
||||
EXTRA_DIST += $(top_srcdir)/build-aux/link-warning.h
|
||||
|
||||
## end gnulib module link-warning
|
||||
|
||||
## begin gnulib module stdbool
|
||||
|
||||
BUILT_SOURCES += $(STDBOOL_H)
|
||||
|
||||
# We need the following in order to create <stdbool.h> when the system
|
||||
# doesn't have one that works.
|
||||
stdbool.h: stdbool.in.h
|
||||
rm -f $@-t $@
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
|
||||
} > $@-t
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stdbool.h stdbool.h-t
|
||||
|
||||
EXTRA_DIST += stdbool.in.h
|
||||
|
||||
## end gnulib module stdbool
|
||||
|
||||
## begin gnulib module strcase
|
||||
|
||||
|
||||
EXTRA_DIST += strcasecmp.c strncasecmp.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += strcasecmp.c strncasecmp.c
|
||||
|
||||
## end gnulib module strcase
|
||||
|
||||
## begin gnulib module strftime
|
||||
|
||||
|
||||
EXTRA_DIST += strftime.c strftime.h
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += strftime.c
|
||||
|
||||
## end gnulib module strftime
|
||||
|
||||
## begin gnulib module strings
|
||||
|
||||
BUILT_SOURCES += strings.h
|
||||
|
||||
# We need the following in order to create <strings.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
strings.h: strings.in.h
|
||||
rm -f $@-t $@
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
|
||||
-e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
|
||||
-e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/strings.in.h; \
|
||||
} > $@-t
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += strings.h strings.h-t
|
||||
|
||||
EXTRA_DIST += strings.in.h
|
||||
|
||||
## end gnulib module strings
|
||||
|
||||
## begin gnulib module time
|
||||
|
||||
BUILT_SOURCES += time.h
|
||||
|
||||
# We need the following in order to create <time.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
time.h: time.in.h
|
||||
rm -f $@-t $@
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
|
||||
-e 's|@REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
|
||||
-e 's|@REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
|
||||
-e 's|@REPLACE_STRPTIME''@|$(REPLACE_STRPTIME)|g' \
|
||||
-e 's|@REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \
|
||||
-e 's|@SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
|
||||
-e 's|@TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
|
||||
< $(srcdir)/time.in.h; \
|
||||
} > $@-t
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += time.h time.h-t
|
||||
|
||||
EXTRA_DIST += time.in.h
|
||||
|
||||
## end gnulib module time
|
||||
|
||||
## begin gnulib module time_r
|
||||
|
||||
|
||||
EXTRA_DIST += time_r.c
|
||||
|
||||
EXTRA_libgnu_la_SOURCES += time_r.c
|
||||
|
||||
## end gnulib module time_r
|
||||
|
||||
## begin gnulib module verify
|
||||
|
||||
libgnu_la_SOURCES += verify.h
|
||||
|
||||
## end gnulib module verify
|
||||
|
||||
## begin gnulib module wchar
|
||||
|
||||
BUILT_SOURCES += $(WCHAR_H)
|
||||
|
||||
# We need the following in order to create <wchar.h> when the system
|
||||
# version does not work standalone.
|
||||
wchar.h: wchar.in.h
|
||||
rm -f $@-t $@
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
|
||||
-e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
|
||||
-e 's|@''GNULIB_WCWIDTH''@|$(GNULIB_WCWIDTH)|g' \
|
||||
-e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
|
||||
-e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/wchar.in.h; \
|
||||
} > $@-t
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += wchar.h wchar.h-t
|
||||
|
||||
EXTRA_DIST += wchar.in.h
|
||||
|
||||
## end gnulib module wchar
|
||||
|
||||
## begin gnulib module dummy
|
||||
|
||||
libgnu_la_SOURCES += dummy.c
|
||||
|
||||
## end gnulib module dummy
|
||||
|
||||
|
||||
mostlyclean-local: mostlyclean-generic
|
||||
@for dir in '' $(MOSTLYCLEANDIRS); do \
|
||||
if test -n "$$dir" && test -d $$dir; then \
|
||||
echo "rmdir $$dir"; rmdir $$dir; \
|
||||
fi; \
|
||||
done; \
|
||||
:
|
489
lib/alloca.c
Normal file
489
lib/alloca.c
Normal file
|
@ -0,0 +1,489 @@
|
|||
/* alloca.c -- allocate automatically reclaimed memory
|
||||
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||
|
||||
This implementation of the PWB library alloca function,
|
||||
which is used to allocate space off the run-time stack so
|
||||
that it is automatically reclaimed upon procedure exit,
|
||||
was inspired by discussions with J. Q. Johnson of Cornell.
|
||||
J.Otto Tennant <jot@cray.com> contributed the Cray support.
|
||||
|
||||
There are some preprocessor constants that can
|
||||
be defined when compiling for your specific system, for
|
||||
improved efficiency; however, the defaults should be okay.
|
||||
|
||||
The general concept of this implementation is to keep
|
||||
track of all alloca-allocated blocks, and reclaim any
|
||||
that are found to be deeper in the stack than the current
|
||||
invocation. This heuristic does not reclaim storage as
|
||||
soon as it becomes invalid, but it will do so eventually.
|
||||
|
||||
As a special case, alloca(0) reclaims storage without
|
||||
allocating any. It is a good idea to use alloca(0) in
|
||||
your main control loop, etc. to force garbage collection. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <alloca.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef emacs
|
||||
# include "lisp.h"
|
||||
# include "blockinput.h"
|
||||
# ifdef EMACS_FREE
|
||||
# undef free
|
||||
# define free EMACS_FREE
|
||||
# endif
|
||||
#else
|
||||
# define memory_full() abort ()
|
||||
#endif
|
||||
|
||||
/* If compiling with GCC 2, this file's not needed. */
|
||||
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||
|
||||
/* If someone has defined alloca as a macro,
|
||||
there must be some other way alloca is supposed to work. */
|
||||
# ifndef alloca
|
||||
|
||||
# ifdef emacs
|
||||
# ifdef static
|
||||
/* actually, only want this if static is defined as ""
|
||||
-- this is for usg, in which emacs must undefine static
|
||||
in order to make unexec workable
|
||||
*/
|
||||
# ifndef STACK_DIRECTION
|
||||
you
|
||||
lose
|
||||
-- must know STACK_DIRECTION at compile-time
|
||||
/* Using #error here is not wise since this file should work for
|
||||
old and obscure compilers. */
|
||||
# endif /* STACK_DIRECTION undefined */
|
||||
# endif /* static */
|
||||
# endif /* emacs */
|
||||
|
||||
/* If your stack is a linked list of frames, you have to
|
||||
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
long i00afunc ();
|
||||
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||
# else
|
||||
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||
# endif
|
||||
|
||||
/* Define STACK_DIRECTION if you know the direction of stack
|
||||
growth for your system; otherwise it will be automatically
|
||||
deduced at run-time.
|
||||
|
||||
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||
|
||||
# ifndef STACK_DIRECTION
|
||||
# define STACK_DIRECTION 0 /* Direction unknown. */
|
||||
# endif
|
||||
|
||||
# if STACK_DIRECTION != 0
|
||||
|
||||
# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||
|
||||
# else /* STACK_DIRECTION == 0; need run-time code. */
|
||||
|
||||
static int stack_dir; /* 1 or -1 once known. */
|
||||
# define STACK_DIR stack_dir
|
||||
|
||||
static void
|
||||
find_stack_direction (void)
|
||||
{
|
||||
static char *addr = NULL; /* Address of first `dummy', once known. */
|
||||
auto char dummy; /* To get stack address. */
|
||||
|
||||
if (addr == NULL)
|
||||
{ /* Initial entry. */
|
||||
addr = ADDRESS_FUNCTION (dummy);
|
||||
|
||||
find_stack_direction (); /* Recurse once. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Second entry. */
|
||||
if (ADDRESS_FUNCTION (dummy) > addr)
|
||||
stack_dir = 1; /* Stack grew upward. */
|
||||
else
|
||||
stack_dir = -1; /* Stack grew downward. */
|
||||
}
|
||||
}
|
||||
|
||||
# endif /* STACK_DIRECTION == 0 */
|
||||
|
||||
/* An "alloca header" is used to:
|
||||
(a) chain together all alloca'ed blocks;
|
||||
(b) keep track of stack depth.
|
||||
|
||||
It is very important that sizeof(header) agree with malloc
|
||||
alignment chunk size. The following default should work okay. */
|
||||
|
||||
# ifndef ALIGN_SIZE
|
||||
# define ALIGN_SIZE sizeof(double)
|
||||
# endif
|
||||
|
||||
typedef union hdr
|
||||
{
|
||||
char align[ALIGN_SIZE]; /* To force sizeof(header). */
|
||||
struct
|
||||
{
|
||||
union hdr *next; /* For chaining headers. */
|
||||
char *deep; /* For stack depth measure. */
|
||||
} h;
|
||||
} header;
|
||||
|
||||
static header *last_alloca_header = NULL; /* -> last alloca header. */
|
||||
|
||||
/* Return a pointer to at least SIZE bytes of storage,
|
||||
which will be automatically reclaimed upon exit from
|
||||
the procedure that called alloca. Originally, this space
|
||||
was supposed to be taken from the current stack frame of the
|
||||
caller, but that method cannot be made to work for some
|
||||
implementations of C, for example under Gould's UTX/32. */
|
||||
|
||||
void *
|
||||
alloca (size_t size)
|
||||
{
|
||||
auto char probe; /* Probes stack depth: */
|
||||
register char *depth = ADDRESS_FUNCTION (probe);
|
||||
|
||||
# if STACK_DIRECTION == 0
|
||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||
find_stack_direction ();
|
||||
# endif
|
||||
|
||||
/* Reclaim garbage, defined as all alloca'd storage that
|
||||
was allocated from deeper in the stack than currently. */
|
||||
|
||||
{
|
||||
register header *hp; /* Traverses linked list. */
|
||||
|
||||
# ifdef emacs
|
||||
BLOCK_INPUT;
|
||||
# endif
|
||||
|
||||
for (hp = last_alloca_header; hp != NULL;)
|
||||
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||
|| (STACK_DIR < 0 && hp->h.deep < depth))
|
||||
{
|
||||
register header *np = hp->h.next;
|
||||
|
||||
free (hp); /* Collect garbage. */
|
||||
|
||||
hp = np; /* -> next header. */
|
||||
}
|
||||
else
|
||||
break; /* Rest are not deeper. */
|
||||
|
||||
last_alloca_header = hp; /* -> last valid storage. */
|
||||
|
||||
# ifdef emacs
|
||||
UNBLOCK_INPUT;
|
||||
# endif
|
||||
}
|
||||
|
||||
if (size == 0)
|
||||
return NULL; /* No allocation required. */
|
||||
|
||||
/* Allocate combined header + user data storage. */
|
||||
|
||||
{
|
||||
/* Address of header. */
|
||||
register header *new;
|
||||
|
||||
size_t combined_size = sizeof (header) + size;
|
||||
if (combined_size < sizeof (header))
|
||||
memory_full ();
|
||||
|
||||
new = malloc (combined_size);
|
||||
|
||||
if (! new)
|
||||
memory_full ();
|
||||
|
||||
new->h.next = last_alloca_header;
|
||||
new->h.deep = depth;
|
||||
|
||||
last_alloca_header = new;
|
||||
|
||||
/* User storage begins just after header. */
|
||||
|
||||
return (void *) (new + 1);
|
||||
}
|
||||
}
|
||||
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
# include <stdio.h>
|
||||
# endif
|
||||
|
||||
# ifndef CRAY_STACK
|
||||
# define CRAY_STACK
|
||||
# ifndef CRAY2
|
||||
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||
struct stack_control_header
|
||||
{
|
||||
long shgrow:32; /* Number of times stack has grown. */
|
||||
long shaseg:32; /* Size of increments to stack. */
|
||||
long shhwm:32; /* High water mark of stack. */
|
||||
long shsize:32; /* Current size of stack (all segments). */
|
||||
};
|
||||
|
||||
/* The stack segment linkage control information occurs at
|
||||
the high-address end of a stack segment. (The stack
|
||||
grows from low addresses to high addresses.) The initial
|
||||
part of the stack segment linkage control information is
|
||||
0200 (octal) words. This provides for register storage
|
||||
for the routine which overflows the stack. */
|
||||
|
||||
struct stack_segment_linkage
|
||||
{
|
||||
long ss[0200]; /* 0200 overflow words. */
|
||||
long sssize:32; /* Number of words in this segment. */
|
||||
long ssbase:32; /* Offset to stack base. */
|
||||
long:32;
|
||||
long sspseg:32; /* Offset to linkage control of previous
|
||||
segment of stack. */
|
||||
long:32;
|
||||
long sstcpt:32; /* Pointer to task common address block. */
|
||||
long sscsnm; /* Private control structure number for
|
||||
microtasking. */
|
||||
long ssusr1; /* Reserved for user. */
|
||||
long ssusr2; /* Reserved for user. */
|
||||
long sstpid; /* Process ID for pid based multi-tasking. */
|
||||
long ssgvup; /* Pointer to multitasking thread giveup. */
|
||||
long sscray[7]; /* Reserved for Cray Research. */
|
||||
long ssa0;
|
||||
long ssa1;
|
||||
long ssa2;
|
||||
long ssa3;
|
||||
long ssa4;
|
||||
long ssa5;
|
||||
long ssa6;
|
||||
long ssa7;
|
||||
long sss0;
|
||||
long sss1;
|
||||
long sss2;
|
||||
long sss3;
|
||||
long sss4;
|
||||
long sss5;
|
||||
long sss6;
|
||||
long sss7;
|
||||
};
|
||||
|
||||
# else /* CRAY2 */
|
||||
/* The following structure defines the vector of words
|
||||
returned by the STKSTAT library routine. */
|
||||
struct stk_stat
|
||||
{
|
||||
long now; /* Current total stack size. */
|
||||
long maxc; /* Amount of contiguous space which would
|
||||
be required to satisfy the maximum
|
||||
stack demand to date. */
|
||||
long high_water; /* Stack high-water mark. */
|
||||
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
|
||||
long hits; /* Number of internal buffer hits. */
|
||||
long extends; /* Number of block extensions. */
|
||||
long stko_mallocs; /* Block allocations by $STKOFEN. */
|
||||
long underflows; /* Number of stack underflow calls ($STKRETN). */
|
||||
long stko_free; /* Number of deallocations by $STKRETN. */
|
||||
long stkm_free; /* Number of deallocations by $STKMRET. */
|
||||
long segments; /* Current number of stack segments. */
|
||||
long maxs; /* Maximum number of stack segments so far. */
|
||||
long pad_size; /* Stack pad size. */
|
||||
long current_address; /* Current stack segment address. */
|
||||
long current_size; /* Current stack segment size. This
|
||||
number is actually corrupted by STKSTAT to
|
||||
include the fifteen word trailer area. */
|
||||
long initial_address; /* Address of initial segment. */
|
||||
long initial_size; /* Size of initial segment. */
|
||||
};
|
||||
|
||||
/* The following structure describes the data structure which trails
|
||||
any stack segment. I think that the description in 'asdef' is
|
||||
out of date. I only describe the parts that I am sure about. */
|
||||
|
||||
struct stk_trailer
|
||||
{
|
||||
long this_address; /* Address of this block. */
|
||||
long this_size; /* Size of this block (does not include
|
||||
this trailer). */
|
||||
long unknown2;
|
||||
long unknown3;
|
||||
long link; /* Address of trailer block of previous
|
||||
segment. */
|
||||
long unknown5;
|
||||
long unknown6;
|
||||
long unknown7;
|
||||
long unknown8;
|
||||
long unknown9;
|
||||
long unknown10;
|
||||
long unknown11;
|
||||
long unknown12;
|
||||
long unknown13;
|
||||
long unknown14;
|
||||
};
|
||||
|
||||
# endif /* CRAY2 */
|
||||
# endif /* not CRAY_STACK */
|
||||
|
||||
# ifdef CRAY2
|
||||
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||
I doubt that "lint" will like this much. */
|
||||
|
||||
static long
|
||||
i00afunc (long *address)
|
||||
{
|
||||
struct stk_stat status;
|
||||
struct stk_trailer *trailer;
|
||||
long *block, size;
|
||||
long result = 0;
|
||||
|
||||
/* We want to iterate through all of the segments. The first
|
||||
step is to get the stack status structure. We could do this
|
||||
more quickly and more directly, perhaps, by referencing the
|
||||
$LM00 common block, but I know that this works. */
|
||||
|
||||
STKSTAT (&status);
|
||||
|
||||
/* Set up the iteration. */
|
||||
|
||||
trailer = (struct stk_trailer *) (status.current_address
|
||||
+ status.current_size
|
||||
- 15);
|
||||
|
||||
/* There must be at least one stack segment. Therefore it is
|
||||
a fatal error if "trailer" is null. */
|
||||
|
||||
if (trailer == 0)
|
||||
abort ();
|
||||
|
||||
/* Discard segments that do not contain our argument address. */
|
||||
|
||||
while (trailer != 0)
|
||||
{
|
||||
block = (long *) trailer->this_address;
|
||||
size = trailer->this_size;
|
||||
if (block == 0 || size == 0)
|
||||
abort ();
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
if ((block <= address) && (address < (block + size)))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the result to the offset in this segment and add the sizes
|
||||
of all predecessor segments. */
|
||||
|
||||
result = address - block;
|
||||
|
||||
if (trailer == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (trailer->this_size <= 0)
|
||||
abort ();
|
||||
result += trailer->this_size;
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
}
|
||||
while (trailer != 0);
|
||||
|
||||
/* We are done. Note that if you present a bogus address (one
|
||||
not in any segment), you will get a different number back, formed
|
||||
from subtracting the address of the first block. This is probably
|
||||
not what you want. */
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
# else /* not CRAY2 */
|
||||
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||
Determine the number of the cell within the stack,
|
||||
given the address of the cell. The purpose of this
|
||||
routine is to linearize, in some sense, stack addresses
|
||||
for alloca. */
|
||||
|
||||
static long
|
||||
i00afunc (long address)
|
||||
{
|
||||
long stkl = 0;
|
||||
|
||||
long size, pseg, this_segment, stack;
|
||||
long result = 0;
|
||||
|
||||
struct stack_segment_linkage *ssptr;
|
||||
|
||||
/* Register B67 contains the address of the end of the
|
||||
current stack segment. If you (as a subprogram) store
|
||||
your registers on the stack and find that you are past
|
||||
the contents of B67, you have overflowed the segment.
|
||||
|
||||
B67 also points to the stack segment linkage control
|
||||
area, which is what we are really interested in. */
|
||||
|
||||
stkl = CRAY_STACKSEG_END ();
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
|
||||
/* If one subtracts 'size' from the end of the segment,
|
||||
one has the address of the first word of the segment.
|
||||
|
||||
If this is not the first segment, 'pseg' will be
|
||||
nonzero. */
|
||||
|
||||
pseg = ssptr->sspseg;
|
||||
size = ssptr->sssize;
|
||||
|
||||
this_segment = stkl - size;
|
||||
|
||||
/* It is possible that calling this routine itself caused
|
||||
a stack overflow. Discard stack segments which do not
|
||||
contain the target address. */
|
||||
|
||||
while (!(this_segment <= address && address <= stkl))
|
||||
{
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||
# endif
|
||||
if (pseg == 0)
|
||||
break;
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
this_segment = stkl - size;
|
||||
}
|
||||
|
||||
result = address - this_segment;
|
||||
|
||||
/* If you subtract pseg from the current end of the stack,
|
||||
you get the address of the previous stack segment's end.
|
||||
This seems a little convoluted to me, but I'll bet you save
|
||||
a cycle somewhere. */
|
||||
|
||||
while (pseg != 0)
|
||||
{
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||
# endif
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
result += size;
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
# endif /* not CRAY2 */
|
||||
# endif /* CRAY */
|
||||
|
||||
# endif /* no alloca */
|
||||
#endif /* not GCC version 2 */
|
56
lib/alloca.in.h
Normal file
56
lib/alloca.in.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* Memory allocation on the stack.
|
||||
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2008 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2, 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 Lesser General Public
|
||||
License along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
USA. */
|
||||
|
||||
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||
means there is a real alloca function. */
|
||||
#ifndef _GL_ALLOCA_H
|
||||
#define _GL_ALLOCA_H
|
||||
|
||||
/* alloca (N) returns a pointer to N bytes of memory
|
||||
allocated on the stack, which will last until the function returns.
|
||||
Use of alloca should be avoided:
|
||||
- inside arguments of function calls - undefined behaviour,
|
||||
- in inline functions - the allocation may actually last until the
|
||||
calling function returns,
|
||||
- for huge N (say, N >= 65536) - you never know how large (or small)
|
||||
the stack is, and when the stack cannot fulfill the memory allocation
|
||||
request, the program just crashes.
|
||||
*/
|
||||
|
||||
#ifndef alloca
|
||||
# ifdef __GNUC__
|
||||
# define alloca __builtin_alloca
|
||||
# elif defined _AIX
|
||||
# define alloca __alloca
|
||||
# elif defined _MSC_VER
|
||||
# include <malloc.h>
|
||||
# define alloca _alloca
|
||||
# elif defined __DECC && defined __VMS
|
||||
# define alloca __ALLOCA
|
||||
# else
|
||||
# include <stddef.h>
|
||||
# ifdef __cplusplus
|
||||
extern "C"
|
||||
# endif
|
||||
void *alloca (size_t);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* _GL_ALLOCA_H */
|
77
lib/count-one-bits.h
Normal file
77
lib/count-one-bits.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
/* count-one-bits.h -- counts the number of 1-bits in a word.
|
||||
Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Ben Pfaff. */
|
||||
|
||||
#ifndef COUNT_ONE_BITS_H
|
||||
# define COUNT_ONE_BITS_H 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "verify.h"
|
||||
|
||||
/* Expand the code which computes the number of 1-bits of the local
|
||||
variable 'x' of type TYPE (an unsigned integer type) and returns it
|
||||
from the current function. */
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
#define COUNT_ONE_BITS(BUILTIN, TYPE) \
|
||||
return BUILTIN (x);
|
||||
#else
|
||||
#define COUNT_ONE_BITS(BUILTIN, TYPE) \
|
||||
/* This condition is written so as to avoid shifting by more than \
|
||||
31 bits at once, and also avoids a random HP-UX cc bug. */ \
|
||||
verify (((TYPE) -1 >> 31 >> 31 >> 2) == 0); /* TYPE has at most 64 bits */ \
|
||||
int count = count_one_bits_32 (x); \
|
||||
if (1 < (TYPE) -1 >> 31) /* TYPE has more than 32 bits? */ \
|
||||
count += count_one_bits_32 (x >> 31 >> 1); \
|
||||
return count;
|
||||
|
||||
/* Compute and return the the number of 1-bits set in the least
|
||||
significant 32 bits of X. */
|
||||
static inline int
|
||||
count_one_bits_32 (unsigned int x)
|
||||
{
|
||||
x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U);
|
||||
x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U);
|
||||
x = (x >> 16) + (x & 0xffff);
|
||||
x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f);
|
||||
return (x >> 8) + (x & 0x00ff);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Compute and return the number of 1-bits set in X. */
|
||||
static inline int
|
||||
count_one_bits (unsigned int x)
|
||||
{
|
||||
COUNT_ONE_BITS (__builtin_popcount, unsigned int);
|
||||
}
|
||||
|
||||
/* Compute and return the number of 1-bits set in X. */
|
||||
static inline int
|
||||
count_one_bits_l (unsigned long int x)
|
||||
{
|
||||
COUNT_ONE_BITS (__builtin_popcountl, unsigned long int);
|
||||
}
|
||||
|
||||
#if HAVE_UNSIGNED_LONG_LONG_INT
|
||||
/* Compute and return the number of 1-bits set in X. */
|
||||
static inline int
|
||||
count_one_bits_ll (unsigned long long int x)
|
||||
{
|
||||
COUNT_ONE_BITS (__builtin_popcountll, unsigned long long int);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* COUNT_ONE_BITS_H */
|
42
lib/dummy.c
Normal file
42
lib/dummy.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/* A dummy file, to prevent empty libraries from breaking builds.
|
||||
Copyright (C) 2004, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Some systems, reportedly OpenBSD and Mac OS X, refuse to create
|
||||
libraries without any object files. You might get an error like:
|
||||
|
||||
> ar cru .libs/libgl.a
|
||||
> ar: no archive members specified
|
||||
|
||||
Compiling this file, and adding its object file to the library, will
|
||||
prevent the library from being empty. */
|
||||
|
||||
/* Some systems, such as Solaris with cc 5.0, refuse to work with libraries
|
||||
that don't export any symbol. You might get an error like:
|
||||
|
||||
> cc ... libgnu.a
|
||||
> ild: (bad file) garbled symbol table in archive ../gllib/libgnu.a
|
||||
|
||||
Compiling this file, and adding its object file to the library, will
|
||||
prevent the library from exporting no symbols. */
|
||||
|
||||
#ifdef __sun
|
||||
/* This declaration ensures that the library will export at least 1 symbol. */
|
||||
int gl_dummy_symbol;
|
||||
#else
|
||||
/* This declaration is solely to ensure that after preprocessing
|
||||
this file is never empty. */
|
||||
typedef int dummy;
|
||||
#endif
|
119
lib/stdbool.in.h
Normal file
119
lib/stdbool.in.h
Normal file
|
@ -0,0 +1,119 @@
|
|||
/* Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef _GL_STDBOOL_H
|
||||
#define _GL_STDBOOL_H
|
||||
|
||||
/* ISO C 99 <stdbool.h> for platforms that lack it. */
|
||||
|
||||
/* Usage suggestions:
|
||||
|
||||
Programs that use <stdbool.h> should be aware of some limitations
|
||||
and standards compliance issues.
|
||||
|
||||
Standards compliance:
|
||||
|
||||
- <stdbool.h> must be #included before 'bool', 'false', 'true'
|
||||
can be used.
|
||||
|
||||
- You cannot assume that sizeof (bool) == 1.
|
||||
|
||||
- Programs should not undefine the macros bool, true, and false,
|
||||
as C99 lists that as an "obsolescent feature".
|
||||
|
||||
Limitations of this substitute, when used in a C89 environment:
|
||||
|
||||
- <stdbool.h> must be #included before the '_Bool' type can be used.
|
||||
|
||||
- You cannot assume that _Bool is a typedef; it might be a macro.
|
||||
|
||||
- Bit-fields of type 'bool' are not supported. Portable code
|
||||
should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
|
||||
|
||||
- In C99, casts and automatic conversions to '_Bool' or 'bool' are
|
||||
performed in such a way that every nonzero value gets converted
|
||||
to 'true', and zero gets converted to 'false'. This doesn't work
|
||||
with this substitute. With this substitute, only the values 0 and 1
|
||||
give the expected result when converted to _Bool' or 'bool'.
|
||||
|
||||
Also, it is suggested that programs use 'bool' rather than '_Bool';
|
||||
this isn't required, but 'bool' is more common. */
|
||||
|
||||
|
||||
/* 7.16. Boolean type and values */
|
||||
|
||||
/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
|
||||
definitions below, but temporarily we have to #undef them. */
|
||||
#if defined __BEOS__ && !defined __HAIKU__
|
||||
# include <OS.h> /* defines bool but not _Bool */
|
||||
# undef false
|
||||
# undef true
|
||||
#endif
|
||||
|
||||
/* For the sake of symbolic names in gdb, we define true and false as
|
||||
enum constants, not only as macros.
|
||||
It is tempting to write
|
||||
typedef enum { false = 0, true = 1 } _Bool;
|
||||
so that gdb prints values of type 'bool' symbolically. But if we do
|
||||
this, values of type '_Bool' may promote to 'int' or 'unsigned int'
|
||||
(see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
|
||||
(see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
|
||||
enum; this ensures that '_Bool' promotes to 'int'. */
|
||||
#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__)
|
||||
/* A compiler known to have 'bool'. */
|
||||
/* If the compiler already has both 'bool' and '_Bool', we can assume they
|
||||
are the same types. */
|
||||
# if !@HAVE__BOOL@
|
||||
typedef bool _Bool;
|
||||
# endif
|
||||
#else
|
||||
# if !defined __GNUC__
|
||||
/* If @HAVE__BOOL@:
|
||||
Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
|
||||
the built-in _Bool type is used. See
|
||||
http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
|
||||
http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
|
||||
http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
|
||||
Similar bugs are likely with other compilers as well; this file
|
||||
wouldn't be used if <stdbool.h> was working.
|
||||
So we override the _Bool type.
|
||||
If !@HAVE__BOOL@:
|
||||
Need to define _Bool ourselves. As 'signed char' or as an enum type?
|
||||
Use of a typedef, with SunPRO C, leads to a stupid
|
||||
"warning: _Bool is a keyword in ISO C99".
|
||||
Use of an enum type, with IRIX cc, leads to a stupid
|
||||
"warning(1185): enumerated type mixed with another type".
|
||||
Even the existence of an enum type, without a typedef,
|
||||
"Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
|
||||
The only benefit of the enum, debuggability, is not important
|
||||
with these compilers. So use 'signed char' and no enum. */
|
||||
# define _Bool signed char
|
||||
# else
|
||||
/* With this compiler, trust the _Bool type if the compiler has it. */
|
||||
# if !@HAVE__BOOL@
|
||||
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#define bool _Bool
|
||||
|
||||
/* The other macros must be usable in preprocessor directives. */
|
||||
#define false 0
|
||||
#define true 1
|
||||
#define __bool_true_false_are_defined 1
|
||||
|
||||
#endif /* _GL_STDBOOL_H */
|
63
lib/strcasecmp.c
Normal file
63
lib/strcasecmp.c
Normal file
|
@ -0,0 +1,63 @@
|
|||
/* Case-insensitive string comparison function.
|
||||
Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||
|
||||
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
|
||||
greater than zero if S1 is lexicographically less than, equal to or greater
|
||||
than S2.
|
||||
Note: This function does not work with multibyte strings! */
|
||||
|
||||
int
|
||||
strcasecmp (const char *s1, const char *s2)
|
||||
{
|
||||
const unsigned char *p1 = (const unsigned char *) s1;
|
||||
const unsigned char *p2 = (const unsigned char *) s2;
|
||||
unsigned char c1, c2;
|
||||
|
||||
if (p1 == p2)
|
||||
return 0;
|
||||
|
||||
do
|
||||
{
|
||||
c1 = TOLOWER (*p1);
|
||||
c2 = TOLOWER (*p2);
|
||||
|
||||
if (c1 == '\0')
|
||||
break;
|
||||
|
||||
++p1;
|
||||
++p2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
if (UCHAR_MAX <= INT_MAX)
|
||||
return c1 - c2;
|
||||
else
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
1461
lib/strftime.c
Normal file
1461
lib/strftime.c
Normal file
File diff suppressed because it is too large
Load diff
26
lib/strftime.h
Normal file
26
lib/strftime.h
Normal file
|
@ -0,0 +1,26 @@
|
|||
/* declarations for strftime.c
|
||||
|
||||
Copyright (C) 2002, 2004, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <time.h>
|
||||
|
||||
/* Just like strftime, but with two more arguments:
|
||||
POSIX requires that strftime use the local timezone information.
|
||||
When __UTC is nonzero and tm->tm_zone is NULL or the empty string,
|
||||
use UTC instead. Use __NS as the number of nanoseconds in the
|
||||
%N directive. */
|
||||
size_t nstrftime (char *, size_t, char const *, struct tm const *,
|
||||
int __utc, int __ns);
|
88
lib/strings.in.h
Normal file
88
lib/strings.in.h
Normal file
|
@ -0,0 +1,88 @@
|
|||
/* A substitute <strings.h>.
|
||||
|
||||
Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef _GL_STRINGS_H
|
||||
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
#@INCLUDE_NEXT@ @NEXT_STRINGS_H@
|
||||
|
||||
#ifndef _GL_STRINGS_H
|
||||
#define _GL_STRINGS_H
|
||||
|
||||
|
||||
/* The definition of GL_LINK_WARNING is copied here. */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
|
||||
greater than zero if S1 is lexicographically less than, equal to or greater
|
||||
than S2.
|
||||
Note: This function does not work in multibyte locales. */
|
||||
#if ! @HAVE_STRCASECMP@
|
||||
extern int strcasecmp (char const *s1, char const *s2);
|
||||
#endif
|
||||
#if defined GNULIB_POSIXCHECK
|
||||
/* strcasecmp() does not work with multibyte strings:
|
||||
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||
as a sequence of bytes, not of characters. */
|
||||
# undef strcasecmp
|
||||
# define strcasecmp(a,b) \
|
||||
(GL_LINK_WARNING ("strcasecmp cannot work correctly on character strings " \
|
||||
"in multibyte locales - " \
|
||||
"use mbscasecmp if you care about " \
|
||||
"internationalization, or use c_strcasecmp (from " \
|
||||
"gnulib module c-strcase) if you want a locale " \
|
||||
"independent function"), \
|
||||
strcasecmp (a, b))
|
||||
#endif
|
||||
|
||||
/* Compare no more than N bytes of strings S1 and S2, ignoring case,
|
||||
returning less than, equal to or greater than zero if S1 is
|
||||
lexicographically less than, equal to or greater than S2.
|
||||
Note: This function cannot work correctly in multibyte locales. */
|
||||
#if ! @HAVE_DECL_STRNCASECMP@
|
||||
extern int strncasecmp (char const *s1, char const *s2, size_t n);
|
||||
#endif
|
||||
#if defined GNULIB_POSIXCHECK
|
||||
/* strncasecmp() does not work with multibyte strings:
|
||||
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||
as a sequence of bytes, not of characters. */
|
||||
# undef strncasecmp
|
||||
# define strncasecmp(a,b,n) \
|
||||
(GL_LINK_WARNING ("strncasecmp cannot work correctly on character " \
|
||||
"strings in multibyte locales - " \
|
||||
"use mbsncasecmp or mbspcasecmp if you care about " \
|
||||
"internationalization, or use c_strncasecmp (from " \
|
||||
"gnulib module c-strcase) if you want a locale " \
|
||||
"independent function"), \
|
||||
strncasecmp (a, b, n))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GL_STRING_H */
|
||||
#endif /* _GL_STRING_H */
|
63
lib/strncasecmp.c
Normal file
63
lib/strncasecmp.c
Normal file
|
@ -0,0 +1,63 @@
|
|||
/* strncasecmp.c -- case insensitive string comparator
|
||||
Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||
|
||||
/* Compare no more than N bytes of strings S1 and S2, ignoring case,
|
||||
returning less than, equal to or greater than zero if S1 is
|
||||
lexicographically less than, equal to or greater than S2.
|
||||
Note: This function cannot work correctly in multibyte locales. */
|
||||
|
||||
int
|
||||
strncasecmp (const char *s1, const char *s2, size_t n)
|
||||
{
|
||||
register const unsigned char *p1 = (const unsigned char *) s1;
|
||||
register const unsigned char *p2 = (const unsigned char *) s2;
|
||||
unsigned char c1, c2;
|
||||
|
||||
if (p1 == p2 || n == 0)
|
||||
return 0;
|
||||
|
||||
do
|
||||
{
|
||||
c1 = TOLOWER (*p1);
|
||||
c2 = TOLOWER (*p2);
|
||||
|
||||
if (--n == 0 || c1 == '\0')
|
||||
break;
|
||||
|
||||
++p1;
|
||||
++p2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
if (UCHAR_MAX <= INT_MAX)
|
||||
return c1 - c2;
|
||||
else
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
116
lib/time.in.h
Normal file
116
lib/time.in.h
Normal file
|
@ -0,0 +1,116 @@
|
|||
/* A more-standard <time.h>.
|
||||
|
||||
Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
|
||||
/* Don't get in the way of glibc when it includes time.h merely to
|
||||
declare a few standard symbols, rather than to declare all the
|
||||
symbols. Also, Solaris 8 <time.h> eventually includes itself
|
||||
recursively; if that is happening, just include the system <time.h>
|
||||
without adding our own declarations. */
|
||||
#if (defined __need_time_t || defined __need_clock_t \
|
||||
|| defined __need_timespec \
|
||||
|| defined _GL_TIME_H)
|
||||
|
||||
# @INCLUDE_NEXT@ @NEXT_TIME_H@
|
||||
|
||||
#else
|
||||
|
||||
# define _GL_TIME_H
|
||||
|
||||
# @INCLUDE_NEXT@ @NEXT_TIME_H@
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
|
||||
/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
|
||||
Or they define it with the wrong member names or define it in <sys/time.h>
|
||||
(e.g., FreeBSD circa 1997). */
|
||||
# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
|
||||
# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# undef timespec
|
||||
# define timespec rpl_timespec
|
||||
struct timespec
|
||||
{
|
||||
time_t tv_sec;
|
||||
long int tv_nsec;
|
||||
};
|
||||
# endif
|
||||
# endif
|
||||
|
||||
/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
|
||||
return -1 and store the remaining time into RMTP. See
|
||||
<http://www.opengroup.org/susv3xsh/nanosleep.html>. */
|
||||
# if @REPLACE_NANOSLEEP@
|
||||
# define nanosleep rpl_nanosleep
|
||||
int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp);
|
||||
# endif
|
||||
|
||||
/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
|
||||
<http://www.opengroup.org/susv3xsh/localtime_r.html> and
|
||||
<http://www.opengroup.org/susv3xsh/gmtime_r.html>. */
|
||||
# if @REPLACE_LOCALTIME_R@
|
||||
# undef localtime_r
|
||||
# define localtime_r rpl_localtime_r
|
||||
# undef gmtime_r
|
||||
# define gmtime_r rpl_gmtime_r
|
||||
struct tm *localtime_r (time_t const *restrict __timer,
|
||||
struct tm *restrict __result);
|
||||
struct tm *gmtime_r (time_t const *restrict __timer,
|
||||
struct tm *restrict __result);
|
||||
# endif
|
||||
|
||||
/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
|
||||
the resulting broken-down time into TM. See
|
||||
<http://www.opengroup.org/susv3xsh/strptime.html>. */
|
||||
# if @REPLACE_STRPTIME@
|
||||
# undef strptime
|
||||
# define strptime rpl_strptime
|
||||
char *strptime (char const *restrict __buf, char const *restrict __format,
|
||||
struct tm *restrict __tm);
|
||||
# endif
|
||||
|
||||
/* Convert TM to a time_t value, assuming UTC. */
|
||||
# if @REPLACE_TIMEGM@
|
||||
# undef timegm
|
||||
# define timegm rpl_timegm
|
||||
time_t timegm (struct tm *__tm);
|
||||
# endif
|
||||
|
||||
/* Encourage applications to avoid unsafe functions that can overrun
|
||||
buffers when given outlandish struct tm values. Portable
|
||||
applications should use strftime (or even sprintf) instead. */
|
||||
# if GNULIB_PORTCHECK
|
||||
# undef asctime
|
||||
# define asctime eschew_asctime
|
||||
# undef asctime_r
|
||||
# define asctime_r eschew_asctime_r
|
||||
# undef ctime
|
||||
# define ctime eschew_ctime
|
||||
# undef ctime_r
|
||||
# define ctime_r eschew_ctime_r
|
||||
# endif
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif
|
47
lib/time_r.c
Normal file
47
lib/time_r.c
Normal file
|
@ -0,0 +1,47 @@
|
|||
/* Reentrant time functions like localtime_r.
|
||||
|
||||
Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static struct tm *
|
||||
copy_tm_result (struct tm *dest, struct tm const *src)
|
||||
{
|
||||
if (! src)
|
||||
return 0;
|
||||
*dest = *src;
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
struct tm *
|
||||
gmtime_r (time_t const * restrict t, struct tm * restrict tp)
|
||||
{
|
||||
return copy_tm_result (tp, gmtime (t));
|
||||
}
|
||||
|
||||
struct tm *
|
||||
localtime_r (time_t const * restrict t, struct tm * restrict tp)
|
||||
{
|
||||
return copy_tm_result (tp, localtime (t));
|
||||
}
|
140
lib/verify.h
Normal file
140
lib/verify.h
Normal file
|
@ -0,0 +1,140 @@
|
|||
/* Compile-time assert-like macros.
|
||||
|
||||
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 3 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
|
||||
|
||||
#ifndef VERIFY_H
|
||||
# define VERIFY_H 1
|
||||
|
||||
/* Each of these macros verifies that its argument R is nonzero. To
|
||||
be portable, R should be an integer constant expression. Unlike
|
||||
assert (R), there is no run-time overhead.
|
||||
|
||||
There are two macros, since no single macro can be used in all
|
||||
contexts in C. verify_true (R) is for scalar contexts, including
|
||||
integer constant expression contexts. verify (R) is for declaration
|
||||
contexts, e.g., the top level.
|
||||
|
||||
Symbols ending in "__" are private to this header.
|
||||
|
||||
The code below uses several ideas.
|
||||
|
||||
* The first step is ((R) ? 1 : -1). Given an expression R, of
|
||||
integral or boolean or floating-point type, this yields an
|
||||
expression of integral type, whose value is later verified to be
|
||||
constant and nonnegative.
|
||||
|
||||
* Next this expression W is wrapped in a type
|
||||
struct verify_type__ { unsigned int verify_error_if_negative_size__: W; }.
|
||||
If W is negative, this yields a compile-time error. No compiler can
|
||||
deal with a bit-field of negative size.
|
||||
|
||||
One might think that an array size check would have the same
|
||||
effect, that is, that the type struct { unsigned int dummy[W]; }
|
||||
would work as well. However, inside a function, some compilers
|
||||
(such as C++ compilers and GNU C) allow local parameters and
|
||||
variables inside array size expressions. With these compilers,
|
||||
an array size check would not properly diagnose this misuse of
|
||||
the verify macro:
|
||||
|
||||
void function (int n) { verify (n < 0); }
|
||||
|
||||
* For the verify macro, the struct verify_type__ will need to
|
||||
somehow be embedded into a declaration. To be portable, this
|
||||
declaration must declare an object, a constant, a function, or a
|
||||
typedef name. If the declared entity uses the type directly,
|
||||
such as in
|
||||
|
||||
struct dummy {...};
|
||||
typedef struct {...} dummy;
|
||||
extern struct {...} *dummy;
|
||||
extern void dummy (struct {...} *);
|
||||
extern struct {...} *dummy (void);
|
||||
|
||||
two uses of the verify macro would yield colliding declarations
|
||||
if the entity names are not disambiguated. A workaround is to
|
||||
attach the current line number to the entity name:
|
||||
|
||||
#define GL_CONCAT0(x, y) x##y
|
||||
#define GL_CONCAT(x, y) GL_CONCAT0 (x, y)
|
||||
extern struct {...} * GL_CONCAT(dummy,__LINE__);
|
||||
|
||||
But this has the problem that two invocations of verify from
|
||||
within the same macro would collide, since the __LINE__ value
|
||||
would be the same for both invocations.
|
||||
|
||||
A solution is to use the sizeof operator. It yields a number,
|
||||
getting rid of the identity of the type. Declarations like
|
||||
|
||||
extern int dummy [sizeof (struct {...})];
|
||||
extern void dummy (int [sizeof (struct {...})]);
|
||||
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||
|
||||
can be repeated.
|
||||
|
||||
* Should the implementation use a named struct or an unnamed struct?
|
||||
Which of the following alternatives can be used?
|
||||
|
||||
extern int dummy [sizeof (struct {...})];
|
||||
extern int dummy [sizeof (struct verify_type__ {...})];
|
||||
extern void dummy (int [sizeof (struct {...})]);
|
||||
extern void dummy (int [sizeof (struct verify_type__ {...})]);
|
||||
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||
extern int (*dummy (void)) [sizeof (struct verify_type__ {...})];
|
||||
|
||||
In the second and sixth case, the struct type is exported to the
|
||||
outer scope; two such declarations therefore collide. GCC warns
|
||||
about the first, third, and fourth cases. So the only remaining
|
||||
possibility is the fifth case:
|
||||
|
||||
extern int (*dummy (void)) [sizeof (struct {...})];
|
||||
|
||||
* This implementation exploits the fact that GCC does not warn about
|
||||
the last declaration mentioned above. If a future version of GCC
|
||||
introduces a warning for this, the problem could be worked around
|
||||
by using code specialized to GCC, e.g.,:
|
||||
|
||||
#if 4 <= __GNUC__
|
||||
# define verify(R) \
|
||||
extern int (* verify_function__ (void)) \
|
||||
[__builtin_constant_p (R) && (R) ? 1 : -1]
|
||||
#endif
|
||||
|
||||
* In C++, any struct definition inside sizeof is invalid.
|
||||
Use a template type to work around the problem. */
|
||||
|
||||
|
||||
/* Verify requirement R at compile-time, as an integer constant expression.
|
||||
Return 1. */
|
||||
|
||||
# ifdef __cplusplus
|
||||
template <int w>
|
||||
struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
|
||||
# define verify_true(R) \
|
||||
(!!sizeof (verify_type__<(R) ? 1 : -1>))
|
||||
# else
|
||||
# define verify_true(R) \
|
||||
(!!sizeof \
|
||||
(struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
|
||||
# endif
|
||||
|
||||
/* Verify requirement R at compile-time, as a declaration without a
|
||||
trailing ';'. */
|
||||
|
||||
# define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]
|
||||
|
||||
#endif
|
93
lib/wchar.in.h
Normal file
93
lib/wchar.in.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
|
||||
|
||||
Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2, 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Written by Eric Blake. */
|
||||
|
||||
/*
|
||||
* ISO C 99 <wchar.h> for platforms that have issues.
|
||||
* <http://www.opengroup.org/susv3xbd/wchar.h.html>
|
||||
*
|
||||
* For now, this just ensures proper prerequisite inclusion order and
|
||||
* the declaration of wcwidth().
|
||||
*/
|
||||
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
|
||||
#ifdef __need_mbstate_t
|
||||
/* Special invocation convention inside uClibc header files. */
|
||||
|
||||
#@INCLUDE_NEXT@ @NEXT_WCHAR_H@
|
||||
|
||||
#else
|
||||
/* Normal invocation convention. */
|
||||
|
||||
#ifndef _GL_WCHAR_H
|
||||
|
||||
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
|
||||
<wchar.h>.
|
||||
BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
|
||||
included before <wchar.h>. */
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
/* Include the original <wchar.h> if it exists.
|
||||
Some builds of uClibc lack it. */
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
#if @HAVE_WCHAR_H@
|
||||
# @INCLUDE_NEXT@ @NEXT_WCHAR_H@
|
||||
#endif
|
||||
|
||||
#ifndef _GL_WCHAR_H
|
||||
#define _GL_WCHAR_H
|
||||
|
||||
/* The definition of GL_LINK_WARNING is copied here. */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Return the number of screen columns needed for WC. */
|
||||
#if @GNULIB_WCWIDTH@
|
||||
# if @REPLACE_WCWIDTH@
|
||||
# undef wcwidth
|
||||
# define wcwidth rpl_wcwidth
|
||||
extern int wcwidth (wchar_t);
|
||||
# else
|
||||
# if !defined wcwidth && !@HAVE_DECL_WCWIDTH@
|
||||
/* wcwidth exists but is not declared. */
|
||||
extern int wcwidth (int /* actually wchar_t */);
|
||||
# endif
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef wcwidth
|
||||
# define wcwidth(w) \
|
||||
(GL_LINK_WARNING ("wcwidth is unportable - " \
|
||||
"use gnulib module wcwidth for portability"), \
|
||||
wcwidth (w))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GL_WCHAR_H */
|
||||
#endif /* _GL_WCHAR_H */
|
||||
#endif
|
50
libguile.h
50
libguile.h
|
@ -1,46 +1,22 @@
|
|||
#ifndef SCM_LIBGUILE_H
|
||||
#define SCM_LIBGUILE_H
|
||||
|
||||
/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2003, 2004, 2006, 2008 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,
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* As a special exception, the Free Software Foundation gives permission
|
||||
* for additional uses of the text contained in its release of GUILE.
|
||||
*
|
||||
* The exception is that, if you link the GUILE library with other files
|
||||
* to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the GUILE library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the
|
||||
* Free Software Foundation under the name GUILE. If you copy
|
||||
* code from other Free Software Foundation releases into a copy of
|
||||
* GUILE, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for GUILE, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice. */
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
/* This needs to be included outside of the extern "C" block.
|
||||
|
|
15
libguile/.gitignore
vendored
Normal file
15
libguile/.gitignore
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
c-tokenize.c
|
||||
cpp_err_symbols.c
|
||||
cpp_sig_symbols.c
|
||||
gen-scmconfig
|
||||
gen-scmconfig.h
|
||||
guile
|
||||
guile-doc-snarf
|
||||
guile-func-name-check
|
||||
guile-procedures.texi
|
||||
guile-snarf
|
||||
guile-snarf-docs
|
||||
guile_filter_doc_snarfage
|
||||
libpath.h
|
||||
scmconfig.h
|
||||
version.h
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
## Process this file with Automake to create Makefile.in
|
||||
##
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
||||
## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
##
|
||||
## This file is part of GUILE.
|
||||
##
|
||||
|
@ -23,11 +23,19 @@ AUTOMAKE_OPTIONS = gnu
|
|||
|
||||
## Prevent automake from adding extra -I options
|
||||
DEFS = @DEFS@
|
||||
|
||||
# Override Automake's `DEFAULT_INCLUDES'. By default, it contains
|
||||
# "-I$(srcdir)", which causes problems on Tru64 where our "random.h"
|
||||
# is picked up by <stdlib.h> instead of the libc's <random.h>.
|
||||
DEFAULT_INCLUDES =
|
||||
|
||||
## Check for headers in $(srcdir)/.., so that #include
|
||||
## <libguile/MUMBLE.h> will find MUMBLE.h in this dir when we're
|
||||
## building. Also look for Gnulib headers in `lib'.
|
||||
INCLUDES = -I.. -I$(top_srcdir) \
|
||||
-I$(top_srcdir)/lib -I$(top_builddir)/lib
|
||||
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) \
|
||||
-I$(top_srcdir)/lib -I$(top_builddir)/lib
|
||||
|
||||
AM_CFLAGS = $(GCC_CFLAGS)
|
||||
|
||||
## The Gnulib Libtool archive.
|
||||
gnulib_library = $(top_builddir)/lib/libgnu.la
|
||||
|
@ -47,7 +55,7 @@ gen_scmconfig_SOURCES = gen-scmconfig.c
|
|||
## For some reason, OBJEXT does not include the dot
|
||||
gen-scmconfig.$(OBJEXT): gen-scmconfig.c
|
||||
if [ "$(cross_compiling)" = "yes" ]; then \
|
||||
$(CC_FOR_BUILD) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) -c -o $@ $<; \
|
||||
$(CC_FOR_BUILD) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) -c -o $@ $<; \
|
||||
else \
|
||||
$(COMPILE) -c -o $@ $<; \
|
||||
fi
|
||||
|
@ -75,7 +83,7 @@ guile_filter_doc_snarfage_SOURCES = c-tokenize.c
|
|||
## For some reason, OBJEXT does not include the dot
|
||||
c-tokenize.$(OBJEXT): c-tokenize.c
|
||||
if [ "$(cross_compiling)" = "yes" ]; then \
|
||||
$(CC_FOR_BUILD) $(DEFS) $(INCLUDES) -c -o $@ $<; \
|
||||
$(CC_FOR_BUILD) $(DEFS) $(AM_CPPFLAGS) -c -o $@ $<; \
|
||||
else \
|
||||
$(COMPILE) -c -o $@ $<; \
|
||||
fi
|
||||
|
@ -91,11 +99,11 @@ guile_filter_doc_snarfage$(EXEEXT): $(guile_filter_doc_snarfage_OBJECTS) $(guile
|
|||
|
||||
|
||||
guile_SOURCES = guile.c
|
||||
guile_CFLAGS = $(GUILE_CFLAGS)
|
||||
guile_CFLAGS = $(GUILE_CFLAGS) $(AM_CFLAGS)
|
||||
guile_LDADD = libguile.la
|
||||
guile_LDFLAGS = @DLPREOPEN@ $(GUILE_CFLAGS)
|
||||
|
||||
libguile_la_CFLAGS = $(GUILE_CFLAGS)
|
||||
libguile_la_CFLAGS = $(GUILE_CFLAGS) $(AM_CFLAGS)
|
||||
|
||||
libguile_la_SOURCES = alist.c arbiters.c async.c backtrace.c boolean.c \
|
||||
chars.c continuations.c convert.c debug.c deprecation.c \
|
||||
|
@ -282,7 +290,7 @@ libpath.h: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|||
@mv libpath.tmp libpath.h
|
||||
|
||||
|
||||
snarfcppopts = $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||
snarfcppopts = $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS)
|
||||
|
||||
SUFFIXES = .x .doc
|
||||
.c.x:
|
||||
|
@ -332,7 +340,7 @@ schemelibdir = $(pkgdatadir)/$(GUILE_EFFECTIVE_VERSION)
|
|||
schemelib_DATA = guile-procedures.txt
|
||||
|
||||
## Add -MG to make the .x magic work with auto-dep code.
|
||||
MKDEP = gcc -M -MG $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||
MKDEP = gcc -M -MG $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS)
|
||||
|
||||
cpp_err_symbols.c: cpp_err_symbols.in cpp_cnvt.awk
|
||||
$(AWK) -f $(srcdir)/cpp_cnvt.awk < $(srcdir)/cpp_err_symbols.in > \
|
||||
|
|
129
libguile/__scm.h
129
libguile/__scm.h
|
@ -3,46 +3,22 @@
|
|||
#ifndef SCM___SCM_H
|
||||
#define SCM___SCM_H
|
||||
|
||||
/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006, 2007, 2008 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 library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*
|
||||
* As a special exception, the Free Software Foundation gives permission
|
||||
* for additional uses of the text contained in its release of GUILE.
|
||||
*
|
||||
* The exception is that, if you link the GUILE library with other files
|
||||
* to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the GUILE library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the
|
||||
* Free Software Foundation under the name GUILE. If you copy
|
||||
* code from other Free Software Foundation releases into a copy of
|
||||
* GUILE, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for GUILE, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice. */
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -109,6 +85,29 @@
|
|||
#endif
|
||||
|
||||
|
||||
/* The SCM_EXPECT macros provide branch prediction hints to the compiler. To
|
||||
* use only in places where the result of the expression under "normal"
|
||||
* circumstances is known. */
|
||||
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
||||
# define SCM_EXPECT __builtin_expect
|
||||
#else
|
||||
# define SCM_EXPECT(_expr, _value) (_expr)
|
||||
#endif
|
||||
|
||||
#define SCM_LIKELY(_expr) SCM_EXPECT ((_expr), 1)
|
||||
#define SCM_UNLIKELY(_expr) SCM_EXPECT ((_expr), 0)
|
||||
|
||||
/* The SCM_INTERNAL macro makes it possible to explicitly declare a function
|
||||
* as having "internal" linkage. */
|
||||
#if (defined __GNUC__) && \
|
||||
((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ == 3))
|
||||
# define SCM_INTERNAL extern __attribute__ ((__visibility__ ("internal")))
|
||||
#else
|
||||
# define SCM_INTERNAL extern
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* {Supported Options}
|
||||
*
|
||||
* These may be defined or undefined.
|
||||
|
@ -198,6 +197,14 @@
|
|||
#define SCM_DEBUG 0
|
||||
#endif
|
||||
|
||||
/* For debugging purposes: define this is to ensure nobody is using
|
||||
* the mark bits outside of the marking phase. This is meant for
|
||||
* debugging purposes only.
|
||||
*/
|
||||
#ifndef SCM_DEBUG_MARKING_API
|
||||
#define SCM_DEBUG_MARKING_API 0
|
||||
#endif
|
||||
|
||||
/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
|
||||
* exhaustive parameter checking: It will be verified that cell parameters
|
||||
* actually point to a valid heap cell. Note: If this option is enabled,
|
||||
|
@ -412,7 +419,23 @@
|
|||
# define setjmp setjump
|
||||
# define longjmp longjump
|
||||
# else /* ndef _CRAY1 */
|
||||
# include <setjmp.h>
|
||||
# if defined (__ia64__)
|
||||
/* For IA64, emulate the setjmp API using getcontext. */
|
||||
# include <signal.h>
|
||||
# include <ucontext.h>
|
||||
typedef struct {
|
||||
ucontext_t ctx;
|
||||
int fresh;
|
||||
} jmp_buf;
|
||||
# define setjmp(JB) \
|
||||
( (JB).fresh = 1, \
|
||||
getcontext (&((JB).ctx)), \
|
||||
((JB).fresh ? ((JB).fresh = 0, 0) : 1) )
|
||||
# define longjmp(JB,VAL) scm_ia64_longjmp (&(JB), VAL)
|
||||
void scm_ia64_longjmp (jmp_buf *, int);
|
||||
# else /* ndef __ia64__ */
|
||||
# include <setjmp.h>
|
||||
# endif /* ndef __ia64__ */
|
||||
# endif /* ndef _CRAY1 */
|
||||
#endif /* ndef vms */
|
||||
|
||||
|
@ -500,14 +523,14 @@ do { \
|
|||
#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
|
||||
#define SCM_ASRTGO(_cond, _label)
|
||||
#else
|
||||
#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
|
||||
do { if (!(_cond)) \
|
||||
#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
|
||||
do { if (SCM_UNLIKELY (!(_cond))) \
|
||||
scm_wrong_type_arg (_subr, _pos, _arg); } while (0)
|
||||
#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
|
||||
do { if (!(_cond)) \
|
||||
#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
|
||||
do { if (SCM_UNLIKELY (!(_cond))) \
|
||||
scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0)
|
||||
#define SCM_ASRTGO(_cond, _label) \
|
||||
do { if (!(_cond)) \
|
||||
#define SCM_ASRTGO(_cond, _label) \
|
||||
do { if (SCM_UNLIKELY (!(_cond))) \
|
||||
goto _label; } while (0)
|
||||
#endif
|
||||
|
||||
|
@ -526,8 +549,9 @@ SCM_API SCM scm_call_generic_0 (SCM gf);
|
|||
return (SCM_UNPACK (gf) \
|
||||
? scm_call_generic_0 ((gf)) \
|
||||
: (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
|
||||
#define SCM_GASSERT0(cond, gf, subr) \
|
||||
if (!(cond)) SCM_WTA_DISPATCH_0((gf), (subr))
|
||||
#define SCM_GASSERT0(cond, gf, subr) \
|
||||
if (SCM_UNLIKELY(!(cond))) \
|
||||
SCM_WTA_DISPATCH_0((gf), (subr))
|
||||
|
||||
SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
|
||||
|
||||
|
@ -535,8 +559,9 @@ SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
|
|||
return (SCM_UNPACK (gf) \
|
||||
? scm_call_generic_1 ((gf), (a1)) \
|
||||
: (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
|
||||
#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
|
||||
if (!(cond)) SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
|
||||
#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
|
||||
if (SCM_UNLIKELY (!(cond))) \
|
||||
SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
|
||||
|
||||
SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
|
||||
|
||||
|
@ -546,8 +571,9 @@ SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
|
|||
: (scm_wrong_type_arg ((subr), (pos), \
|
||||
(pos) == SCM_ARG1 ? (a1) : (a2)), \
|
||||
SCM_UNSPECIFIED))
|
||||
#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
|
||||
if (!(cond)) SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
|
||||
#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
|
||||
if (SCM_UNLIKELY (!(cond))) \
|
||||
SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
|
||||
|
||||
SCM_API SCM scm_apply_generic (SCM gf, SCM args);
|
||||
|
||||
|
@ -558,8 +584,9 @@ SCM_API SCM scm_apply_generic (SCM gf, SCM args);
|
|||
scm_list_ref ((args), \
|
||||
scm_from_int ((pos) - 1))), \
|
||||
SCM_UNSPECIFIED))
|
||||
#define SCM_GASSERTn(cond, gf, args, pos, subr) \
|
||||
if (!(cond)) SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
|
||||
#define SCM_GASSERTn(cond, gf, args, pos, subr) \
|
||||
if (SCM_UNLIKELY (!(cond))) \
|
||||
SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
|
||||
|
||||
#ifndef SCM_MAGIC_SNARFER
|
||||
/* Let these macros pass through if
|
||||
|
|
|
@ -3,46 +3,22 @@
|
|||
#ifndef SCM__SCM_H
|
||||
#define SCM__SCM_H
|
||||
|
||||
/* Copyright (C) 1995,1996,2000,2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,2000,2001, 2002, 2006, 2008 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 library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA
|
||||
*
|
||||
* As a special exception, the Free Software Foundation gives permission
|
||||
* for additional uses of the text contained in its release of GUILE.
|
||||
*
|
||||
* The exception is that, if you link the GUILE library with other files
|
||||
* to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the GUILE library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the
|
||||
* Free Software Foundation under the name GUILE. If you copy
|
||||
* code from other Free Software Foundation releases into a copy of
|
||||
* GUILE, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for GUILE, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice. */
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
@ -119,14 +95,6 @@
|
|||
# define SCM_SYSCALL(line) line;
|
||||
#endif /* ndef SCM_SYSCALL */
|
||||
|
||||
#if !defined (MSDOS) && !defined (__MINGW32__)
|
||||
# ifdef ARM_ULIB
|
||||
extern volatile int errno;
|
||||
# else
|
||||
extern int errno;
|
||||
# endif /* def ARM_ULIB */
|
||||
#endif /* ndef MSDOS && ndef __MINGW32__*/
|
||||
|
||||
|
||||
|
||||
#ifndef min
|
||||
|
@ -138,14 +106,18 @@
|
|||
|
||||
|
||||
|
||||
#if HAVE_STAT64
|
||||
#if GUILE_USE_64_CALLS && HAVE_STAT64
|
||||
#define CHOOSE_LARGEFILE(foo,foo64) foo64
|
||||
#else
|
||||
#define CHOOSE_LARGEFILE(foo,foo64) foo
|
||||
#endif
|
||||
|
||||
/* These names are a bit long, but they make it clear what they represent. */
|
||||
#define dirent_or_dirent64 CHOOSE_LARGEFILE(dirent,dirent64)
|
||||
#if SCM_HAVE_STRUCT_DIRENT64 == 1
|
||||
# define dirent_or_dirent64 CHOOSE_LARGEFILE(dirent,dirent64)
|
||||
#else
|
||||
# define dirent_or_dirent64 dirent
|
||||
#endif
|
||||
#define fstat_or_fstat64 CHOOSE_LARGEFILE(fstat,fstat64)
|
||||
#define ftruncate_or_ftruncate64 CHOOSE_LARGEFILE(ftruncate,ftruncate64)
|
||||
#define lseek_or_lseek64 CHOOSE_LARGEFILE(lseek,lseek64)
|
||||
|
@ -153,7 +125,11 @@
|
|||
#define off_t_or_off64_t CHOOSE_LARGEFILE(off_t,off64_t)
|
||||
#define open_or_open64 CHOOSE_LARGEFILE(open,open64)
|
||||
#define readdir_or_readdir64 CHOOSE_LARGEFILE(readdir,readdir64)
|
||||
#define readdir_r_or_readdir64_r CHOOSE_LARGEFILE(readdir_r,readdir64_r)
|
||||
#if SCM_HAVE_READDIR64_R == 1
|
||||
# define readdir_r_or_readdir64_r CHOOSE_LARGEFILE(readdir_r,readdir64_r)
|
||||
#else
|
||||
# define readdir_r_or_readdir64_r readdir_r
|
||||
#endif
|
||||
#define stat_or_stat64 CHOOSE_LARGEFILE(stat,stat64)
|
||||
#define truncate_or_truncate64 CHOOSE_LARGEFILE(truncate,truncate64)
|
||||
#define scm_from_off_t_or_off64_t CHOOSE_LARGEFILE(scm_from_off_t,scm_from_int64)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#ifndef SCM_ALIST_H
|
||||
#define SCM_ALIST_H
|
||||
|
||||
/* Copyright (C) 1995,1996,2000, 2006 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,2000, 2006, 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -42,7 +42,7 @@ SCM_API SCM scm_assoc_set_x (SCM alist, SCM key, SCM val);
|
|||
SCM_API SCM scm_assq_remove_x (SCM alist, SCM key);
|
||||
SCM_API SCM scm_assv_remove_x (SCM alist, SCM key);
|
||||
SCM_API SCM scm_assoc_remove_x (SCM alist, SCM key);
|
||||
SCM_API void scm_init_alist (void);
|
||||
SCM_INTERNAL void scm_init_alist (void);
|
||||
|
||||
#endif /* SCM_ALIST_H */
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue