Imported to git.
This commit is contained in:
commit
5d018dc035
|
@ -0,0 +1,18 @@
|
|||
|
||||
Authors of LZMA Utils
|
||||
---------------------
|
||||
|
||||
Igor Pavlov
|
||||
* designed LZMA as an algorithm;
|
||||
* wrote an implementation known as LZMA SDK, which is part of
|
||||
the bigger 7-Zip project.
|
||||
|
||||
Ville Koskinen
|
||||
* wrote the first version of the gzip-like lzma command line
|
||||
utility (C++)
|
||||
* helped a lot with the documentation.
|
||||
|
||||
Lasse Collin
|
||||
* ported LZMA SDK to C and zlib-like API (liblzma);
|
||||
* rewrote the command line tool again to use liblzma and pthreads.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
LZMA Utils Licenses
|
||||
-------------------
|
||||
|
||||
Different licenses apply to different files in this package. Here
|
||||
is a rough summary of which license apply to which parts of this
|
||||
package (but check the individual files to be sure!):
|
||||
- Everything under src/liblzma/check is public domain.
|
||||
- Everything else under the src directory is under the GNU LGPL
|
||||
2.1 or (at your opinion) any later version.
|
||||
- Outside the src directory, there are some files that are under
|
||||
the GNU GPL 2 or (at your opinion) any later version, or under
|
||||
the GNU GPL 3 or (at your opinion) any later version.
|
||||
- Most documentation files are under an all-permissive license.
|
||||
|
||||
The following license texts are included in the following files
|
||||
in this package:
|
||||
- COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1
|
||||
- COPYING.GPLv2: GNU General Public License version 2
|
||||
- COPYING.GPLv3: GNU General Public License version 3
|
||||
|
||||
If you have questions, don't hesitate to ask the copyright holder(s)
|
||||
for more information.
|
||||
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, 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.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If 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 convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, 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 Street, 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!
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
See the commit log in the git repository:
|
||||
git://ctrl.tukaani.org/lzma-utils.git
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,38 @@
|
|||
##
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
SUBDIRS =
|
||||
|
||||
if COND_GNULIB
|
||||
SUBDIRS += lib
|
||||
endif
|
||||
|
||||
SUBDIRS += src po tests
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
m4 \
|
||||
extra \
|
||||
config.rpath \
|
||||
Doxyfile.in \
|
||||
FAQ \
|
||||
INSTALL.generic \
|
||||
COPYING.GPLv2 \
|
||||
COPYING.GPLv3 \
|
||||
COPYING.LGPLv2.1 \
|
||||
README-liblzma \
|
||||
README-lzma
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
AUTOMAKE_OPTIONS = foreign
|
|
@ -0,0 +1,151 @@
|
|||
|
||||
LZMA Utils
|
||||
----------
|
||||
|
||||
Warning
|
||||
|
||||
This is an early alpha version. Don't trust the files produced by
|
||||
this version of the software - not even if the software can
|
||||
uncompress the files properly! This is because the file format
|
||||
isn't completely frozen yet.
|
||||
|
||||
So please test a lot, but don't use for anything serious yet.
|
||||
|
||||
|
||||
Overview
|
||||
|
||||
LZMA is a general purporse compression algorithm designed by
|
||||
Igor Pavlov as part of 7-Zip. It provides high compression ratio
|
||||
while keeping the decompression speed fast.
|
||||
|
||||
LZMA Utils are an attempt to make LZMA compression easy to use
|
||||
on free (as in freedom) operating systems. This is achieved by
|
||||
providing tools and libraries which are similar to use than the
|
||||
equivalents of the most popular existing compression algorithms.
|
||||
|
||||
LZMA Utils consist of a few relatively separate parts:
|
||||
* liblzma is an encoder/decoder library with support for several
|
||||
filters (algorithm implementations). The primary filter is LZMA.
|
||||
* libzfile enables reading from and writing to gzip, bzip2 and
|
||||
LZMA compressed and uncompressed files with an API similar to
|
||||
the standard ANSI-C file I/O.
|
||||
[ NOTE: libzfile is not implemented yet. ]
|
||||
* lzma command line tool has almost identical syntax than gzip
|
||||
and bzip2. It makes LZMA easy for average users, but also
|
||||
provides advanced options to finetune the compression settings.
|
||||
* A few shell scripts make diffing and grepping LZMA compressed
|
||||
files easy. The scripts were adapted from gzip and bzip2.
|
||||
|
||||
|
||||
Supported platforms
|
||||
|
||||
LZMA Utils are developed on GNU+Linux, but they should work at
|
||||
least on *BSDs and Solaris. They probably work on some other
|
||||
POSIX-like operating systems too.
|
||||
|
||||
If you use GCC to compile LZMA Utils, you need at least version
|
||||
3.x.x. GCC version 2.xx.x doesn't support some C99 features used
|
||||
in LZMA Utils source code, thus GCC 2 won't compile LZMA Utils.
|
||||
|
||||
If you have written patches to make LZMA Utils to work on previously
|
||||
unsupported platform, please send the patches to me! I will consider
|
||||
including them to the official version. It's nice to minimize the
|
||||
need of third-party patching.
|
||||
|
||||
One exception: Don't request or send patches to change the whole
|
||||
source package to C89. I find C99 substantially nicer to write and
|
||||
maintain. However, the public library headers must be in C89 to
|
||||
avoid frustrating those who maintain programs, which are strictly
|
||||
in C89 or C++.
|
||||
|
||||
|
||||
configure options
|
||||
|
||||
If you are not familiar with `configure' scripts, read the file
|
||||
INSTALL first.
|
||||
|
||||
In most cases, the default --enable/--disable/--with/--without options
|
||||
are what you want. Don't touch them if you are unsure.
|
||||
|
||||
--disable-encoder
|
||||
Do not compile the encoder component of liblzma. This
|
||||
implies --disable-match-finders. If you need only
|
||||
the decoder, you can decrease the library size
|
||||
dramatically with this option.
|
||||
|
||||
The default is to build the encoder.
|
||||
|
||||
--disable-decoder
|
||||
Do not compile the decoder component of liblzma.
|
||||
|
||||
The default is to build the decoder.
|
||||
|
||||
--enable-filters=
|
||||
liblzma supports several filters. See liblzma-intro.txt
|
||||
for a little more information about these.
|
||||
|
||||
The default is to build all the filters.
|
||||
|
||||
--enable-match-finders=
|
||||
liblzma includes two categories of match finders:
|
||||
hash chains and binary trees. Hash chains (hc3 and hc4)
|
||||
are quite fast but they don't provide the best compression
|
||||
ratio. Binary trees (bt2, bt3 and bt4) give excellent
|
||||
compression ratio, but they are slower and need more
|
||||
memory than hash chains.
|
||||
|
||||
You need to enable at least one match finder to build the
|
||||
LZMA filter encoder. Usually hash chains are used only in
|
||||
the fast mode, while binary trees are used to when the best
|
||||
compression ratio is wanted.
|
||||
|
||||
The default is to build all the match finders.
|
||||
|
||||
--enable-checks=
|
||||
liblzma support multiple integrity checks. CRC32 is
|
||||
mandatory, and cannot be omitted. See liblzma-intro.txt
|
||||
for more information about usage of the integrity checks.
|
||||
|
||||
--disable-assembler
|
||||
liblzma includes some assembler optimizations. Currently
|
||||
there is only assembler code for CRC32 and CRC64 for
|
||||
32-bit x86.
|
||||
|
||||
All the assembler code in liblzma is position-independent
|
||||
code, which is suitable for use in shared libraries and
|
||||
position-independent executables.
|
||||
|
||||
--enable-small
|
||||
Omits precomputed tables. This makes liblzma a few KiB
|
||||
smaller. Startup time increases, because the tables need
|
||||
to be computed first.
|
||||
|
||||
--enable-debug
|
||||
This enables the assert() macro and possibly some other
|
||||
run-time consistency checks. It slows down things somewhat,
|
||||
so you normally don't want to have this enabled.
|
||||
|
||||
--enable-werror
|
||||
Makes all compiler warnings an error, that abort the
|
||||
compilation. This may help catching bugs, and should work
|
||||
on most systems. This has no effect on the resulting
|
||||
binaries.
|
||||
|
||||
|
||||
Static vs. dynamic linking of the command line tools
|
||||
|
||||
By default, the command line tools are linked statically against
|
||||
liblzma. There a are a few reasons:
|
||||
|
||||
- The executable(s) can be in /bin while the shared liblzma can still
|
||||
be in /usr/lib (if the distro uses such file system hierachy).
|
||||
|
||||
- It's easier to copy the executables to other systems, since they
|
||||
depend only on libc.
|
||||
|
||||
- It's slightly faster on some architectures like x86.
|
||||
|
||||
If you don't like this, you can get the command line tools linked
|
||||
against the shared liblzma by specifying --disable-static to configure.
|
||||
This disables building static liblzma completely.
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
Thanks
|
||||
------
|
||||
|
||||
Some people have helped more, some less, some don't even know they have
|
||||
been helpful, but nevertheless everyone's help has been important. :-)
|
||||
In alphabetical order:
|
||||
- Mark Adler
|
||||
- Anders F. Björklund
|
||||
- İsmail Dönmez
|
||||
- Jean-loup Gailly
|
||||
- Per Øyvind Karlsen
|
||||
- Ville Koskinen
|
||||
- Jim Meyering
|
||||
- Igor Pavlov
|
||||
- Mikko Pouru
|
||||
- Alexandre Sauvé
|
||||
- Julian Seward
|
||||
- Mohammed Adnène Trojette
|
||||
|
||||
Also thanks to all the people who have participated the Tukaani project
|
||||
and others who I have forgot.
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
|
||||
LZMA Utils TODO List
|
||||
--------------------
|
||||
|
||||
Major missing features
|
||||
|
||||
Memory limits in the command line tool apply only to compression.
|
||||
|
||||
Threading support in the lzma command line tool is still primitive.
|
||||
It cannot split a file in pieces yet.
|
||||
|
||||
The --list mode isn't implemented in the command line tool.
|
||||
|
||||
Handling of Multi-Block Stream information should be separated
|
||||
from Stream encoder and decoder. Those would be useful to implement
|
||||
multi-threaded coding in applications.
|
||||
|
||||
Buffer to buffer coding is not implemented in liblzma. Probably
|
||||
a naive version should be written first, which would simply wrap
|
||||
things around lzma_stream. Later, there should be separate buffer
|
||||
coding functions, that are slightly faster (less memcpy()) and
|
||||
have smaller memory usage than the functions using lzma_stream.
|
||||
|
||||
libzfile is not implemented.
|
||||
|
||||
LZMA filter doesn't support predefined history buffer.
|
||||
|
||||
|
||||
Security
|
||||
|
||||
Search for bugs, especially security related issues. Security is
|
||||
important in every piece of code in LZMA Utils, but it is extremely
|
||||
important in the decoder part of liblzma.
|
||||
|
||||
Subblock: If there is LZMA as a Subfilter but without EOPM, can it
|
||||
trigger infinite loop when Subblock's "Unset Subfilter" flag is hit?
|
||||
|
||||
Similarly, can LZ decoder get stuck in infinite loop if the next
|
||||
filter in the chain returns LZMA_STREAM_END but the decoded data
|
||||
doesn't allow finishing the LZ decoding?
|
||||
|
||||
|
||||
Reliability
|
||||
|
||||
Create a test suite to be run with "make check".
|
||||
|
||||
Should we use strlimit() and getrlimit() for memory usage limitting?
|
||||
|
||||
|
||||
Performance
|
||||
|
||||
Benchmark the CRC code on non-x86 CPUs. Won't have huge effect on
|
||||
overall speed, but it would still be nice to know what algorithm
|
||||
variant is the best on different CPUs.
|
||||
|
||||
|
||||
Third party support
|
||||
|
||||
Add support for LZMA to various applications. This naturally requires
|
||||
cooperating with the authors of the specific applications.
|
||||
* GNU grep and GNU diffutils: BSD grep already uses zlib directly
|
||||
instead of ugly shell scripts. It would be nice to get similar
|
||||
feature into relevant GNU tools. With libzfile, multiple
|
||||
compression formats would be easy to support.
|
||||
* kioslave for KDE
|
||||
* Magic for the `file' command
|
||||
* GNU Midnight Commander
|
||||
* GNU Texinfo
|
||||
* The `man' command
|
||||
* Package managers
|
||||
|
||||
Test the patches already written. The patches should be sent to
|
||||
upstream developers _once_ LZMA Utils APIs are stable enough (so
|
||||
people don't need to fix those patches all the time).
|
||||
|
||||
Mandriva has quite a few patches. Some of them are OK, some need
|
||||
adapting for new LZMA Utils.
|
||||
|
||||
|
||||
Documentation
|
||||
|
||||
Revise the man page of lzma command line tool.
|
||||
|
||||
If the Doxygen docs aren't enough, write good Texinfo manual for
|
||||
liblzma. It's been a long time I've even tried to build the Doxygen
|
||||
docs, so they may look quite bad at the moment.
|
||||
|
||||
Document LZMA as an algorithm. It would be great to have detailed
|
||||
description of the algorithm in English. Many people think, that
|
||||
reading the source code is not the optimal way to learn how LZMA
|
||||
works.
|
||||
|
||||
|
||||
Other
|
||||
|
||||
Some things return LZMA_PROG_ERROR with invalid options, some
|
||||
LZMA_HEADER_ERROR. These must be checked carefully and made so
|
||||
that LZMA_HEADER_ERROR is used only when the given option could
|
||||
make sense in future version of libzma.
|
||||
|
||||
lzma_restrict vs. restrict
|
||||
|
||||
Usage of LZMA_RUN vs. LZMA_FINISH with Metadata coders.
|
||||
|
||||
Port the Deflate implementation from 7-Zip into liblzma. 7-Zip's
|
||||
Deflate compresses better than zlib, gzip or Info-ZIP. I don't
|
||||
know if Deflate will be included in .lzma format (probably not),
|
||||
but it's still useful once we also add support for .gz file format.
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e -x
|
||||
|
||||
# autooint copies all kinds of crap even though we have told in
|
||||
# configure.ac that we don't want the intl directory. It is able
|
||||
# to omit the intl directory but still copies the m4 files needed
|
||||
# only by the stuff in the non-existing intl directory.
|
||||
autopoint -f
|
||||
rm -f \
|
||||
codeset.m4 \
|
||||
glibc2.m4 \
|
||||
glibc21.m4 \
|
||||
intdiv0.m4 \
|
||||
intl.m4 \
|
||||
intldir.m4 \
|
||||
intmax.m4 \
|
||||
inttypes-pri.m4 \
|
||||
inttypes_h.m4 \
|
||||
lcmessage.m4 \
|
||||
lock.m4 \
|
||||
longdouble.m4 \
|
||||
longlong.m4 \
|
||||
printf-posix.m4 \
|
||||
size_max.m4 \
|
||||
stdint_h.m4 \
|
||||
uintmax_t.m4 \
|
||||
ulonglong.m4 \
|
||||
visibility.m4 \
|
||||
wchar_t.m4 \
|
||||
wint_t.m4 \
|
||||
xsize.m4
|
||||
|
||||
aclocal -I m4
|
||||
libtoolize -c -f || glibtoolize -c -f
|
||||
autoconf
|
||||
autoheader
|
||||
automake -acf --foreign
|
|
@ -0,0 +1,611 @@
|
|||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright (C) 2007 Lasse Collin
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# NOTE: Don't add useless checks. autoscan detects this and that, but don't
|
||||
# let it confuse you. For example, we don't care about checking for behavior
|
||||
# of malloc(), stat(), or lstat(), since we don't use those functions in
|
||||
# a way that would cause the problems the autoconf macros check.
|
||||
|
||||
AC_PREREQ(2.61)
|
||||
|
||||
# [LZMA] instead of [LZMA utils] since I prefer to have lzma-version.tar.gz
|
||||
# instead of lzma-utils-version.tar.gz.
|
||||
AC_INIT([LZMA], [4.42.2alpha], [lasse.collin@tukaani.org])
|
||||
|
||||
AC_CONFIG_SRCDIR([src/liblzma/common/common.h])
|
||||
AC_CONFIG_HEADER([config.h])
|
||||
|
||||
echo
|
||||
echo "LZMA Utils $PACKAGE_VERSION"
|
||||
|
||||
echo
|
||||
echo "System type:"
|
||||
# This is needed to know if assembler optimizations can be used.
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
echo
|
||||
echo "Configure options:"
|
||||
|
||||
# Enable/disable debugging code:
|
||||
AC_MSG_CHECKING([if debugging code should be compiled])
|
||||
AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [Enable debugging code.]),
|
||||
[], enable_debug=no)
|
||||
if test "x$enable_debug" = xyes; then
|
||||
CFLAGS="-g $CFLAGS"
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_DEFINE(NDEBUG, 1, [Define to disable debugging code.])
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
# Enable/disable the encoder components:
|
||||
AC_MSG_CHECKING([if encoder components should be built])
|
||||
AC_ARG_ENABLE(encoder, AC_HELP_STRING([--disable-encoder],
|
||||
[Do not build the encoder components.]),
|
||||
[], enable_encoder=yes)
|
||||
if test "x$enable_encoder" = xyes; then
|
||||
AC_DEFINE([HAVE_ENCODER], 1,
|
||||
[Define to 1 if encoder components are enabled.])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AM_CONDITIONAL(COND_MAIN_ENCODER, test "x$enable_encoder" = xyes)
|
||||
|
||||
# Enable/disable the decoder components:
|
||||
AC_MSG_CHECKING([if decoder components should be built])
|
||||
AC_ARG_ENABLE(decoder, AC_HELP_STRING([--disable-decoder],
|
||||
[Do not build the decoder components.]),
|
||||
[], enable_decoder=yes)
|
||||
if test "x$enable_decoder" = xyes; then
|
||||
AC_DEFINE([HAVE_DECODER], 1,
|
||||
[Define to 1 if decoder components are enabled.])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
if test "x$enable_encoder" = xno; then
|
||||
AC_MSG_ERROR([Do not disable both encoder and decoder.])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(COND_MAIN_DECODER, test "x$enable_decoder" = xyes)
|
||||
|
||||
# Filters
|
||||
AC_MSG_CHECKING([which filters to build])
|
||||
AC_ARG_ENABLE(filters, AC_HELP_STRING([--enable-filters=],
|
||||
[Comma-separated list of filters to build. Default=all.
|
||||
Filters used in encoding are needed also in decoding.
|
||||
Available filters: copy subblock x86 powerpc ia64
|
||||
arm armthumb sparc delta lzma]),
|
||||
[], [enable_filters=copy,subblock,x86,powerpc,ia64,arm,armthumb,sparc,delta,lzma])
|
||||
enable_filters=`echo "$enable_filters" | sed 's/,/ /g'`
|
||||
enable_filters_copy=no
|
||||
enable_filters_subblock=no
|
||||
enable_filters_x86=no
|
||||
enable_filters_powerpc=no
|
||||
enable_filters_ia64=no
|
||||
enable_filters_arm=no
|
||||
enable_filters_armthumb=no
|
||||
enable_filters_sparc=no
|
||||
enable_filters_delta=no
|
||||
enable_filters_lzma=no
|
||||
enable_simple_filters=no
|
||||
if test "x$enable_filters" = xno || test "x$enable_filters" = x; then
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([Please enable at least one filter.])
|
||||
else
|
||||
for arg in $enable_filters
|
||||
do
|
||||
case $arg in
|
||||
copy)
|
||||
enable_filters_copy=yes
|
||||
AC_DEFINE([HAVE_FILTER_COPY], 1,
|
||||
[Define to 1 if support for the
|
||||
Copy filter is enabled.])
|
||||
;;
|
||||
subblock)
|
||||
enable_filters_subblock=yes
|
||||
AC_DEFINE([HAVE_FILTER_SUBBLOCK], 1,
|
||||
[Define to 1 if support for the
|
||||
Subblock filter is enabled.])
|
||||
;;
|
||||
x86)
|
||||
enable_filters_x86=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_X86], 1,
|
||||
[Define to 1 if support for the
|
||||
x86 (BCJ) filter is enabled.])
|
||||
;;
|
||||
powerpc)
|
||||
enable_filters_powerpc=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_POWERPC], 1,
|
||||
[Define to 1 if support for the
|
||||
PowerPC filter is enabled.])
|
||||
;;
|
||||
ia64)
|
||||
enable_filters_ia64=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_IA64], 1,
|
||||
[Define to 1 if support for the
|
||||
IA64 filter is enabled.])
|
||||
;;
|
||||
arm)
|
||||
enable_filters_arm=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_ARM], 1,
|
||||
[Define to 1 if support for the
|
||||
ARM filter is enabled.])
|
||||
;;
|
||||
armthumb)
|
||||
enable_filters_armthumb=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_ARMTHUMB], 1,
|
||||
[Define to 1 if support for the
|
||||
ARMThumb filter is enabled.])
|
||||
;;
|
||||
sparc)
|
||||
enable_filters_sparc=yes
|
||||
enable_simple_filters=yes
|
||||
AC_DEFINE([HAVE_FILTER_SPARC], 1,
|
||||
[Define to 1 if support for the
|
||||
SPARC filter is enabled.])
|
||||
;;
|
||||
delta)
|
||||
enable_filters_delta=yes
|
||||
AC_DEFINE([HAVE_FILTER_DELTA], 1,
|
||||
[Define to 1 if support for the
|
||||
Delta filter is enabled.])
|
||||
;;
|
||||
lzma)
|
||||
enable_filters_lzma=yes
|
||||
AC_DEFINE([HAVE_FILTER_LZMA], 1,
|
||||
[Define to 1 if support for the
|
||||
LZMA filter is enabled.])
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([unknown filter: $arg])
|
||||
;;
|
||||
esac
|
||||
done
|
||||
AC_MSG_RESULT([$enable_filters])
|
||||
fi
|
||||
if test "x$enable_simple_filters" = xyes ; then
|
||||
AC_DEFINE([HAVE_FILTER_SIMPLE], 1, [Define to 1 if support for any
|
||||
of the so called simple filters is enabled.])
|
||||
fi
|
||||
AM_CONDITIONAL(COND_FILTER_COPY, test "x$enable_filters_copy" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_SUBBLOCK, test "x$enable_filters_subblock" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_X86, test "x$enable_filters_x86" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_POWERPC, test "x$enable_filters_powerpc" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_IA64, test "x$enable_filters_ia64" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_ARM, test "x$enable_filters_arm" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_ARMTHUMB, test "x$enable_filters_armthumb" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_SPARC, test "x$enable_filters_sparc" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_DELTA, test "x$enable_filters_delta" = xyes)
|
||||
AM_CONDITIONAL(COND_FILTER_LZMA, test "x$enable_filters_lzma" = xyes)
|
||||
AM_CONDITIONAL(COND_MAIN_SIMPLE, test "x$enable_simple_filters" = xyes)
|
||||
|
||||
# Which match finders should be enabled:
|
||||
AC_MSG_CHECKING([which match finders to build])
|
||||
AC_ARG_ENABLE(match-finders, AC_HELP_STRING([--enable-match-finders=],
|
||||
[Comma-separated list of match finders to build. Default=all.
|
||||
At least one match finder is required for encoding with
|
||||
the LZMA filter.
|
||||
Available match finders: hc3 hc4 bt2 bt3 bt4]), [],
|
||||
[enable_match_finders=hc3,hc4,bt2,bt3,bt4])
|
||||
enable_match_finders=`echo "$enable_match_finders" | sed 's/,/ /g'`
|
||||
enable_match_finders_hc3=no
|
||||
enable_match_finders_hc4=no
|
||||
enable_match_finders_bt2=no
|
||||
enable_match_finders_bt3=no
|
||||
enable_match_finders_bt4=no
|
||||
if test "x$enable_encoder" = xyes && test "x$enable_filters_lzma" = xyes ; then
|
||||
for arg in $enable_match_finders
|
||||
do
|
||||
case $arg in
|
||||
hc3) enable_match_finders_hc3=yes ;;
|
||||
hc4) enable_match_finders_hc4=yes ;;
|
||||
bt2) enable_match_finders_bt2=yes ;;
|
||||
bt3) enable_match_finders_bt3=yes ;;
|
||||
bt4) enable_match_finders_bt4=yes ;;
|
||||
*)
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([unknown match finder: $arg])
|
||||
;;
|
||||
esac
|
||||
done
|
||||
AC_MSG_RESULT([$enable_match_finders])
|
||||
else
|
||||
AC_MSG_RESULT([(none because not building the LZMA encoder)])
|
||||
fi
|
||||
AM_CONDITIONAL(COND_MF_HC3, test "x$enable_match_finders_hc3" = xyes)
|
||||
AM_CONDITIONAL(COND_MF_HC4, test "x$enable_match_finders_hc4" = xyes)
|
||||
AM_CONDITIONAL(COND_MF_BT2, test "x$enable_match_finders_bt2" = xyes)
|
||||
AM_CONDITIONAL(COND_MF_BT3, test "x$enable_match_finders_bt3" = xyes)
|
||||
AM_CONDITIONAL(COND_MF_BT4, test "x$enable_match_finders_bt4" = xyes)
|
||||
|
||||
# Which integrity checks to build
|
||||
AC_MSG_CHECKING([which integrity checks to build])
|
||||
AC_ARG_ENABLE(checks, AC_HELP_STRING([--enable-checks=],
|
||||
[Comma-separated list of integrity checks to build.
|
||||
Default=all. Available integrity checks: crc32 crc64 sha256]),
|
||||
[], [enable_checks=crc32,crc64,sha256])
|
||||
enable_checks=`echo "$enable_checks" | sed 's/,/ /g'`
|
||||
enable_checks_crc32=no
|
||||
enable_checks_crc64=no
|
||||
enable_checks_sha256=no
|
||||
if test "x$enable_checks" = xno || test "x$enable_checks" = x; then
|
||||
AC_MSG_RESULT([(none)])
|
||||
else
|
||||
for arg in $enable_checks
|
||||
do
|
||||
case $arg in
|
||||
crc32)
|
||||
enable_checks_crc32=yes
|
||||
AC_DEFINE([HAVE_CHECK_CRC32], 1,
|
||||
[Define to 1 if CRC32 support
|
||||
is enabled.])
|
||||
;;
|
||||
crc64)
|
||||
enable_checks_crc64=yes
|
||||
AC_DEFINE([HAVE_CHECK_CRC64], 1,
|
||||
[Define to 1 if CRC64 support
|
||||
is enabled.])
|
||||
;;
|
||||
sha256)
|
||||
enable_checks_sha256=yes
|
||||
AC_DEFINE([HAVE_CHECK_SHA256], 1,
|
||||
[Define to 1 if SHA256 support
|
||||
is enabled.])
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([unknown integrity check: $arg])
|
||||
;;
|
||||
esac
|
||||
done
|
||||
AC_MSG_RESULT([$enable_checks])
|
||||
fi
|
||||
if test "x$enable_checks_crc32" = xno ; then
|
||||
AC_MSG_ERROR([For now, the CRC32 check must always be enabled.])
|
||||
fi
|
||||
AM_CONDITIONAL(COND_CHECK_CRC32, test "x$enable_checks_crc32" = xyes)
|
||||
AM_CONDITIONAL(COND_CHECK_CRC64, test "x$enable_checks_crc64" = xyes)
|
||||
AM_CONDITIONAL(COND_CHECK_SHA256, test "x$enable_checks_sha256" = xyes)
|
||||
|
||||
# Assembler optimizations
|
||||
AC_MSG_CHECKING([if assembler optimizations should be used])
|
||||
AC_ARG_ENABLE(assembler, AC_HELP_STRING([--disable-assembler],
|
||||
[Do not use assembler optimizations even if such exist
|
||||
for the architecture.]),
|
||||
[], [enable_assembler=yes])
|
||||
if test "x$enable_assembler" = xyes; then
|
||||
case $host_cpu in
|
||||
i?86) enable_assembler=x86 ;;
|
||||
*) enable_assembler=no ;;
|
||||
esac
|
||||
fi
|
||||
case $enable_assembler in
|
||||
x86|no) ;;
|
||||
*)
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([--enable-assembler accepts only \`yes', \`no', or \`x86'.])
|
||||
;;
|
||||
esac
|
||||
AC_MSG_RESULT([$enable_assembler])
|
||||
AM_CONDITIONAL(COND_ASM_X86, test "x$enable_assembler" = xx86)
|
||||
|
||||
# Size optimization
|
||||
AC_MSG_CHECKING([if small size is preferred over speed])
|
||||
AC_ARG_ENABLE(small, AC_HELP_STRING([--enable-small],
|
||||
[Omit precomputed tables to make liblzma a few kilobytes
|
||||
smaller. This will increase startup time of applications
|
||||
slightly, because the tables need to be computed first.]),
|
||||
[], [enable_small=no])
|
||||
if test "x$enable_small" = xyes; then
|
||||
AC_DEFINE([HAVE_SMALL], 1, [Define to 1 if optimizing for size.])
|
||||
elif test "x$enable_small" != xno; then
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_ERROR([--enable-small accepts only \`yes' or \`no'])
|
||||
fi
|
||||
AC_MSG_RESULT([$enable_small])
|
||||
AM_CONDITIONAL(COND_SMALL, test "x$enable_small" = xyes)
|
||||
|
||||
echo
|
||||
echo "Initializing Automake:"
|
||||
|
||||
# There's no C++ or Fortran in LZMA Utils:
|
||||
CXX=no
|
||||
F77=no
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
###############################################################################
|
||||
# Checks for programs.
|
||||
###############################################################################
|
||||
|
||||
AM_PROG_CC_C_O
|
||||
AM_PROG_AS
|
||||
AC_PROG_LN_S
|
||||
|
||||
echo
|
||||
echo "Threading support:"
|
||||
ACX_PTHREAD
|
||||
CC="$PTHREAD_CC"
|
||||
|
||||
echo
|
||||
echo "Initializing Libtool:"
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Checks for libraries.
|
||||
###############################################################################
|
||||
|
||||
echo
|
||||
echo "Initializing gettext:"
|
||||
AM_GNU_GETTEXT_VERSION([0.16.1])
|
||||
AM_GNU_GETTEXT([external])
|
||||
|
||||
###############################################################################
|
||||
# Checks for header files.
|
||||
###############################################################################
|
||||
|
||||
echo
|
||||
echo "System headers and functions:"
|
||||
|
||||
# There is currently no workarounds in this package if some of
|
||||
# these headers are missing.
|
||||
AC_CHECK_HEADERS([fcntl.h limits.h sys/time.h],
|
||||
[],
|
||||
[AC_MSG_ERROR([Required header file(s) are missing.])])
|
||||
|
||||
# If any of these headers are missing, things should still work correctly:
|
||||
AC_CHECK_HEADERS([assert.h errno.h byteswap.h sys/param.h sys/sysctl.h],
|
||||
[], [], [
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
###############################################################################
|
||||
|
||||
AC_HEADER_STDBOOL
|
||||
AC_C_INLINE
|
||||
AC_C_RESTRICT
|
||||
|
||||
# The command line tool can copy high resolution timestamps if such
|
||||
# information is availabe in struct stat. Otherwise one second accuracy
|
||||
# is used. Most systems seem to have st_xtim but BSDs have st_xtimespec.
|
||||
AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec, struct stat.st_mtim.tv_nsec,
|
||||
struct stat.st_atimespec.tv_nsec, struct stat.st_mtimespec.tv_nsec])
|
||||
|
||||
# It is very unlikely that you want to build liblzma without
|
||||
# large file support.
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
# At the moment, the only endian-dependent part should be the integrity checks.
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Checks for library functions.
|
||||
###############################################################################
|
||||
|
||||
# Gnulib replacements as needed
|
||||
gl_GETOPT
|
||||
|
||||
# Functions that are not mandatory i.e. we have alternatives for them
|
||||
# or we can just drop some functionality:
|
||||
AC_CHECK_FUNCS([memcpy memmove memset futimes futimesat])
|
||||
|
||||
# Check how to find out the amount of physical memory in the system. The
|
||||
# lzma command line tool uses this to automatically limits its memory usage.
|
||||
# - sysconf() gives all the needed info on GNU+Linux and Solaris.
|
||||
# - BSDs use sysctl().
|
||||
AC_MSG_CHECKING([how to detect the amount of physical memory])
|
||||
AC_COMPILE_IFELSE([
|
||||
#include <unistd.h>
|
||||
int
|
||||
main()
|
||||
{
|
||||
long i;
|
||||
i = sysconf(_SC_PAGESIZE);
|
||||
i = sysconf(_SC_PHYS_PAGES);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
AC_DEFINE([HAVE_PHYSMEM_SYSCONF], 1,
|
||||
[Define to 1 if the amount of physical memory can be detected
|
||||
with sysconf(_SC_PAGESIZE) and sysconf(_SC_PHYS_PAGES).])
|
||||
AC_MSG_RESULT([sysconf])
|
||||
], [
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
#include <sys/sysctl.h>
|
||||
int
|
||||
main()
|
||||
{
|
||||
int name[2] = { CTL_HW, HW_PHYSMEM };
|
||||
unsigned long mem;
|
||||
size_t mem_ptr_size = sizeof(mem);
|
||||
sysctl(name, 2, &mem, &mem_ptr_size, NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
]])], [
|
||||
AC_DEFINE([HAVE_PHYSMEM_SYSCTL], 1,
|
||||
[Define to 1 if the amount of physical memory can be detected
|
||||
with sysctl().])
|
||||
AC_MSG_RESULT([sysctl])
|
||||
], [
|
||||
AC_MSG_RESULT([unknown])
|
||||
])])
|
||||
|
||||
# Check how to find out the number of available CPU cores in the system.
|
||||
# sysconf(_SC_NPROCESSORS_ONLN) works on most systems, except that BSDs
|
||||
# use sysctl().
|
||||
AC_MSG_CHECKING([how to detect the number of available CPU cores])
|
||||
AC_COMPILE_IFELSE([
|
||||
#include <unistd.h>
|
||||
int
|
||||
main()
|
||||
{
|
||||
long i;
|
||||
i = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
AC_DEFINE([HAVE_NCPU_SYSCONF], 1,
|
||||
[Define to 1 if the number of available CPU cores can be
|
||||
detected with sysconf(_SC_NPROCESSORS_ONLN).])
|
||||
AC_MSG_RESULT([sysconf])
|
||||
], [
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
#include <sys/sysctl.h>
|
||||
int
|
||||
main()
|
||||
{
|
||||
int name[2] = { CTL_HW, HW_NCPU };
|
||||
int cpus;
|
||||
size_t cpus_size = sizeof(cpus);
|
||||
sysctl(name, 2, &cpus, &cpus_size, NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
]])], [
|
||||
AC_DEFINE([HAVE_NCPU_SYSCTL], 1,
|
||||
[Define to 1 if the number of available CPU cores can be
|
||||
detected with sysctl().])
|
||||
AC_MSG_RESULT([sysctl])
|
||||
], [
|
||||
AC_MSG_RESULT([unknown])
|
||||
])])
|
||||
|
||||
|
||||
###############################################################################
|
||||
# If using GCC, set some additional CFLAGS:
|
||||
###############################################################################
|
||||
|
||||
Wno_uninitialized=no
|
||||
|
||||
if test -n "$GCC" ; then
|
||||
echo
|
||||
echo "GCC extensions:"
|
||||
gl_VISIBILITY
|
||||
if test -n "$CFLAG_VISIBILITY" ; then
|
||||
CFLAGS="$CFLAG_VISIBILITY $CFLAGS"
|
||||
fi
|
||||
|
||||
# -Wno-uninitialized is needed with -Werror with SHA256 code
|
||||
# to omit a bogus warning.
|
||||
AC_MSG_CHECKING([if $CC accepts -Wno-uninitialized])
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Wno-uninitialized"
|
||||
AC_COMPILE_IFELSE([void foo(void) { }], [Wno_uninitialized=yes])
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
AC_MSG_RESULT([$Wno_uninitialized])
|
||||
|
||||
# Enable as much warnings as possible. These commented warnings won't
|
||||
# work for LZMA Utils though:
|
||||
# * -Wunreachable-code breaks several assert(0) cases, which are
|
||||
# backed up with "return LZMA_PROG_ERROR".
|
||||
# * -Wcast-qual would break various things where we need a non-const
|
||||
# pointer although we don't modify anything through it.
|
||||
# * -Wcast-align breaks optimized CRC32 and CRC64 implementation
|
||||
# on some architectures (not on x86), where this warning is bogus,
|
||||
# because we take care of correct alignment.
|
||||
for NEW_FLAG in -Wextra -Wformat=2 -Winit-self -Wstrict-aliasing=2 \
|
||||
-Wfloat-equal -Wshadow -Wunsafe-loop-optimizations \
|
||||
-Wpointer-arith -Wbad-function-cast -Wwrite-strings \
|
||||
-Waggregate-return -Wstrict-prototypes \
|
||||
-Wold-style-definition -Wmissing-prototypes \
|
||||
-Wmissing-declarations -Wmissing-noreturn \
|
||||
-Wredundant-decls -Winline -Wdisabled-optimization
|
||||
do
|
||||
AC_MSG_CHECKING([if $CC accepts $NEW_FLAG])
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$NEW_FLAG $CFLAGS"
|
||||
AC_COMPILE_IFELSE([void foo(void) { }], [
|
||||
AC_MSG_RESULT([yes])
|
||||
], [
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
done
|
||||
|
||||
AC_ARG_ENABLE([werror],
|
||||
AC_HELP_STRING([--enable-werror], [Enable -Werror to abort
|
||||
compilation on all compiler warnings.]),
|
||||
[], [enable_werror=no])
|
||||
if test "x$enable_werror" = "xyes"; then
|
||||
CFLAGS="-Werror $CFLAGS"
|
||||
fi
|
||||
|
||||
# IIRC these work with all GCC versions that support -std=c99:
|
||||
CFLAGS="-std=c99 -pedantic -Wall $CFLAGS"
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL([COND_WNO_UNINITIALIZED], test "x$Wno_uninitialized" = "xyes")
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Create the makefiles and config.h
|
||||
###############################################################################
|
||||
|
||||
echo
|
||||
|
||||
# Don't build the lib directory at all if we don't need any replacement
|
||||
# functions.
|
||||
AM_CONDITIONAL([COND_GNULIB], test -n "$LIBOBJS")
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Doxyfile
|
||||
Makefile
|
||||
po/Makefile.in
|
||||
lib/Makefile
|
||||
src/Makefile
|
||||
src/liblzma/lzma.pc
|
||||
src/liblzma/Makefile
|
||||
src/liblzma/api/Makefile
|
||||
src/liblzma/common/Makefile
|
||||
src/liblzma/check/Makefile
|
||||
src/liblzma/lz/Makefile
|
||||
src/liblzma/lzma/Makefile
|
||||
src/liblzma/simple/Makefile
|
||||
src/liblzma/subblock/Makefile
|
||||
src/liblzma/rangecoder/Makefile
|
||||
src/lzma/Makefile
|
||||
src/lzmadec/Makefile
|
||||
src/scripts/Makefile
|
||||
tests/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
Reporting bugs
|
||||
--------------
|
||||
|
||||
Naturally it is easiest for me if you already know what causes the
|
||||
unexpected behavior. Even better if you have a patch to propose.
|
||||
However, quite often the reason for unexpected behavior is unknown,
|
||||
so below are a few things what to do before sending a bug report.
|
||||
|
||||
In case of a crash (usually segmentation violation):
|
||||
|
||||
1. Try to create a small example how to reprocude the issue.
|
||||
|
||||
2. If you are writing an application using liblzma or libzfile,
|
||||
double check that you are using the libraries correctly (for
|
||||
example, that you didn't forget to call lzma_init()). If it is
|
||||
the command line tool included in LZMA Utils that is crashing,
|
||||
ignore this step.
|
||||
|
||||
3. Compile LZMA Utils with debugging code using configure switch
|
||||
`--enable-debug'. If you are using GCC as the compiler, use
|
||||
CFLAGS='-O0 -ggdb'. Don't strip the resulting binaries.
|
||||
|
||||
4. Turn on core dumps. The exact command depends on your shell;
|
||||
for example in GNU bash it is done with `ulimit -c unlimited',
|
||||
and in tcsh with `limit coredumpsize unlimited'.
|
||||
|
||||
5. Try to reproduce the suspected bug. If you get `assertion failed'
|
||||
message, be sure to include the complete message in your bug
|
||||
report. If the application leaves a coredump, get a backtrace
|
||||
using gdb:
|
||||
$ gdb /path/to/app-binary # Loads the app to the debugger.
|
||||
(gdb) core core # Opens the coredump.
|
||||
(gdb) bt # Prints the backtrace. Copy & paste to bug report.
|
||||
(gdb) quit # Quits gdb.
|
||||
|
||||
Send your bug report to Lasse Collin <lasse.collin@tukaani.org>. Don't
|
||||
send the core dump file or the actual executables. If you have a small
|
||||
example file(s) (total size less than 100 KiB), please include it/them
|
||||
as an attachment.
|
||||
|
||||
Do NOT complain about problems with LZMA Utils to Igor Pavlov.
|
||||
Although the code of LZMA Utils is derived from his code, there are
|
||||
a lot of changes, which may have introduced bugs not present in
|
||||
the original version.
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
|
||||
LZMA Utils FAQ
|
||||
--------------
|
||||
|
||||
Copyright (C) 2007 Lasse Collin
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved.
|
||||
|
||||
|
||||
Q: What are LZMA, LZMA Utils, lzma, .lzma, liblzma, LZMA SDK, LZMA_Alone,
|
||||
7-Zip and p7zip?
|
||||
|
||||
A: LZMA stands for Lempel-Ziv-Markov chain-Algorithm. LZMA is the name
|
||||
of the compression algorithm designed by Igor Pavlov. He is the author
|
||||
of 7-Zip, which is a great LGPL'd compression tool for Microsoft
|
||||
Windows operating systems. In addition to 7-Zip itself, also LZMA SDK
|
||||
is available on the website of 7-Zip. LZMA SDK contains LZMA
|
||||
implementations in C++, Java and C#. The C++ version is the original
|
||||
implementation which is used also in 7-Zip itself.
|
||||
|
||||
Excluding the unrar plugin, 7-Zip is free software (free as in
|
||||
freedom). Thanks to this, it was possible to port it to POSIX
|
||||
platforms. The port was done and is maintained by myspace (TODO:
|
||||
myspace's real name?). p7zip is a port of 7-Zip's command line version;
|
||||
p7zip doesn't include the 7-Zip's GUI.
|
||||
|
||||
In POSIX world, users are used to gzip and bzip2 command line tools.
|
||||
Developers know APIs of zlib and libbzip2. LZMA Utils try to ease
|
||||
adoption of LZMA on free operating systems by providing a compression
|
||||
library and a set of command line tools. The library is called liblzma.
|
||||
It provides a zlib-like API making it easy to adapt LZMA compression in
|
||||
existing applications. The main command line tool is known as lzma,
|
||||
whose command line syntax is very similar to that of gzip and bzip2.
|
||||
|
||||
The original command line tool from LZMA SDK (lzma.exe) was found from
|
||||
a directory called LZMA_Alone in the LZMA SDK. It used a simple header
|
||||
format in .lzma files. This format was also used by LZMA Utils up to
|
||||
and including 4.32.x. In LZMA Utils documentation, LZMA_Alone refers
|
||||
to both the file format and the command line tool from LZMA SDK.
|
||||
|
||||
Because of various limitations of the LZMA_Alone file format, a new
|
||||
file format was developed. Extending some existing format such as .gz
|
||||
used by gzip was considered, but these formats were found to be too
|
||||
limited. The filename suffix for the new .lzma format is `.lzma'. The
|
||||
same suffix is also used for files in the LZMA_Alone format. To make
|
||||
the transition to the new format as transparent as possible, LZMA Utils
|
||||
support both the new and old formats transparently.
|
||||
|
||||
7-Zip and LZMA SDK: <http://7-zip.org/>
|
||||
p7zip: <http://p7zip.sourceforge.net/>
|
||||
LZMA Utils: <http://tukaani.org/lzma/>
|
||||
|
||||
|
||||
Q: What LZMA implementations there are available?
|
||||
|
||||
A: LZMA SDK contains implementations in C++, Java and C#. The C++ version
|
||||
is the original implementation which is part of 7-Zip. LZMA SDK
|
||||
contains also a small LZMA decoder in C.
|
||||
|
||||
A port of LZMA SDK to Pascal was made by Alan Birtles
|
||||
<http://www.birtles.org.uk/programming/>. It should work with
|
||||
multiple Pascal programming language implementations.
|
||||
|
||||
LZMA Utils includes liblzma, which is directly based on LZMA SDK.
|
||||
liblzma is written in C (C99, not C89). In contrast to C++ callback
|
||||
API used by LZMA SDK, liblzma uses zlib-like stateful C API. I do not
|
||||
want to comment whether both/former/latter/neither API(s) are good or
|
||||
bad. The only reason to implement a zlib-like API was, that many
|
||||
developers are already familiar with zlib, and very many applications
|
||||
already use zlib. Having a similar API makes it easier to include LZMA
|
||||
support in existing applications.
|
||||
|
||||
See also <http://en.wikipedia.org/wiki/LZMA#External_links>.
|
||||
|
||||
|
||||
Q: Which file formats are supported by LZMA Utils?
|
||||
|
||||
A: Even when the raw LZMA stream is always the same, it can be wrapped
|
||||
in different container formats. The preferred format is the new .lzma
|
||||
format. It has magic bytes (the first six bytes: 0xFF 'L' 'Z' 'M'
|
||||
'A' 0x00). The format supports chaining up to seven filters filters,
|
||||
splitting data to multiple blocks for easier multi-threading and rough
|
||||
random-access reading. The file integrity is verified using CRC32,
|
||||
CRC64, or SHA256, and by verifying the uncompressed size of the file.
|
||||
|
||||
LZMA SDK includes a tool called LZMA_Alone. It supports uses a
|
||||
primitive header which includes only the mandatory stream information
|
||||
required by the LZMA decoder. This format can be both read and
|
||||
written by liblzma and the command line tool (use --format=alone to
|
||||
create such files).
|
||||
|
||||
.7z is the native archive format used by 7-Zip. This format is not
|
||||
supported by liblzma, and probably will never be supported. You
|
||||
should use e.g. p7zip to extract .7z files.
|
||||
|
||||
It is possible to implement custom file formats by using raw filter
|
||||
mode in liblzma. In this mode the application needs to store the filter
|
||||
properties and provide them to liblzma before starting to uncompress
|
||||
the data.
|
||||
|
||||
|
||||
Q: How can I identify files containing LZMA compressed data?
|
||||
|
||||
A: The preferred filename suffix for .lzma files is `.lzma'. `.tar.lzma'
|
||||
may be abbreviated to `.tlz'. The same suffixes are used for files in
|
||||
LZMA_Alone format. In practice this should be no problem since tools
|
||||
included in LZMA Utils support both formats transparently.
|
||||
|
||||
Checking the magic bytes is easy way to detect files in the new .lzma
|
||||
format (the first six bytes: 0xFF 'L' 'Z' 'M' 'A' 0x00). The "file"
|
||||
command version FIXME contains magic strings for this format.
|
||||
|
||||
The old LZMA_Alone format has no magic bytes. Its header cannot contain
|
||||
arbitrary bytes, thus it is possible to make a guess. Unfortunately the
|
||||
guessing is usually too hard to be reliable, so don't try it unless you
|
||||
are desperate.
|
||||
|
||||
|
||||
Q: Does the lzma command line tool support sparse files?
|
||||
|
||||
A: Sparse files can (of course) be compressed like normal files, but
|
||||
uncompression will not restore sparseness of the file. Use an archiver
|
||||
tool to take care of sparseness before compressing the data with lzma.
|
||||
|
||||
The reason for this is that archiver tools handle files, while
|
||||
compression tools handle streams or buffers. Being a sparse file is
|
||||
a property of the file on the disk, not a property of the stream or
|
||||
buffer.
|
||||
|
||||
|
||||
Q: Can I recover parts of a broken LZMA file (e.g. corrupted CD-R)?
|
||||
|
||||
A: With LZMA_Alone and single-block .lzma files, you can uncompress the
|
||||
file until you hit the first broken byte. The data after the broken
|
||||
position is lost. LZMA relies on the uncompression history, and if
|
||||
bytes are missing in the middle of the file, it is impossible to
|
||||
reliably continue after the broken section.
|
||||
|
||||
With multi-block .lzma files it may be possible to locale the next
|
||||
block in the file and continue decoding there. A limited recovery
|
||||
tool for this kind of situations is planned.
|
||||
|
||||
|
||||
Q: Is LZMA patented?
|
||||
|
||||
A: No, the authors are not aware of any patents that could affect LZMA.
|
||||
However, due to nature of software patents, the authors cannot
|
||||
guarantee, that LZMA isn't affected by any third party patent.
|
||||
|
||||
|
||||
Q: Where can I find documentation about how LZMA works as an algorithm?
|
||||
|
||||
A: Read the source code, Luke. There is no documentation about LZMA
|
||||
internals. It is possible that Igor Pavlov is the only person on
|
||||
the Earth that completely knows and understands the algorithm.
|
||||
|
||||
You could begin by downloading LZMA SDK, and start reading from
|
||||
the LZMA decoder to get some idea about the bitstream format.
|
||||
Before you begin, you should know the basics of LZ77 and
|
||||
range coding algorithms. LZMA is based on LZ77, but LZMA is
|
||||
*a lot* more complex. Range coding is used to compress the
|
||||
final bitstream like Huffman coding is used in Deflate.
|
||||
|
||||
|
||||
Q: What are filters?
|
||||
|
||||
A: In context of .lzma files, a filter means an implementation of a
|
||||
compression algorithm. The primary filter is LZMA, which is why
|
||||
the names of the tools contain the letters LZMA.
|
||||
|
||||
liblzma and the new .lzma format support also other filters than LZMA.
|
||||
There are different types of filters, which are suitable for different
|
||||
types of data. Thus, to select the optimal filter and settings, the
|
||||
type of the input data being compressed needs to be known.
|
||||
|
||||
Some filters are most useful when combined with another filter like
|
||||
LZMA. These filters increase redundancy in the data, without changing
|
||||
the size of the data, by taking advantage of properties specific to
|
||||
the data being compressed.
|
||||
|
||||
So far, all the filters are always reversible. That is, no matter what
|
||||
data you pass to a filter encoder, it can be always defiltered back to
|
||||
the original form. Because of this, it is safe to compress for example
|
||||
a software package that contains other file types than executables
|
||||
using a filter specific to the architechture of the package being
|
||||
compressed.
|
||||
|
||||
The old LZMA_Alone format supports only the LZMA filter.
|
||||
|
||||
|
||||
Q: I cannot find BCJ and BCJ2 filters. Don't they exist in liblzma?
|
||||
|
||||
A: BCJ filter is called "x86" in liblzma. BCJ2 is not included,
|
||||
because it requires using more than one encoded output stream.
|
||||
|
||||
|
||||
Q: Can I use LZMA in proprietary, non-free applications?
|
||||
|
||||
A: liblzma is under the GNU LGPL version 2.1 or (at your opinion) any
|
||||
later version. To summarise (*NOTE* This summary is not legally
|
||||
binding, that is, it doesn't give you any extra permissions compared
|
||||
to the LGPL. Read the GNU LGPL carefully for the exact license
|
||||
conditions.):
|
||||
* All the changes made into the library itself must be published
|
||||
under the same license.
|
||||
* End users must be able to replace the used liblzma. Easiest way
|
||||
to assure this is to link dynamically against liblzma so users
|
||||
can replace the shared library file if they want.
|
||||
* You must make it clear to your users, that your application uses
|
||||
liblzma, and that liblzma is free software under the GNU LGPL.
|
||||
A copy of GNU LGPL must be included.
|
||||
|
||||
LZMA SDK contains a special exception which allows linking *unmodified*
|
||||
code statically with a non-free application. This exception does *not*
|
||||
apply to liblzma.
|
||||
|
||||
As an alternative, you can support the development of LZMA and 7-Zip
|
||||
by buying a proprietary license from Igor Pavlov. See homepage of
|
||||
LZMA SDK <http://7-zip.org/sdk.html> for more information. Note that
|
||||
having a proprietary license from Igor Pavlov doesn't allow you to use
|
||||
liblzma in a way that contradicts with the GNU LGPL, because liblzma
|
||||
contains code that is not copyrighted by Igor Pavlov. Please contact
|
||||
both Lasse Collin and Igor Pavlov if the license conditions of liblzma
|
||||
are not suitable for you.
|
||||
|
||||
|
||||
Q: I would like to help. What can I do?
|
||||
|
||||
A: See the TODO file. Please contact Lasse Collin before starting to do
|
||||
anything, because it is possible that someone else is already working
|
||||
on the same thing.
|
||||
|
||||
|
||||
Q: How can I contact the authors?
|
||||
|
||||
A: Lasse Collin is the maintainer of LZMA Utils. You can contact him
|
||||
either via IRC (Larhzu on #tukaani at Freenode or IRCnet). Email
|
||||
should work too, <lasse.collin@tukaani.org>.
|
||||
|
||||
Igor Pavlov is the father of LZMA. He is the author of 7-Zip
|
||||
and LZMA SDK. <http://7-zip.org/>
|
||||
|
||||
NOTE: Please don't bother Igor Pavlov with questions specific
|
||||
to LZMA Utils.
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,140 @@
|
|||
|
||||
LZMA Utils history
|
||||
------------------
|
||||
|
||||
Tukaani distribution
|
||||
|
||||
In 2005, there was a small group working on Tukaani distribution, which
|
||||
was a Slackware fork. One of the project goals was to fit the distro on
|
||||
a single 700 MiB ISO-9660 image. Using LZMA instead of gzip helped a
|
||||
lot. Roughly speaking, one could fit data that took 1000 MiB in gzipped
|
||||
form into 700 MiB with LZMA. Naturally compression ratio varied across
|
||||
packages, but this was what we got on average.
|
||||
|
||||
Slackware packages have traditionally had .tgz as the filename suffix,
|
||||
which is an abbreviation of .tar.gz. A logical naming for LZMA
|
||||
compressed packages was .tlz, being an abbreviation of .tar.lzma.
|
||||
|
||||
At the end of the year 2007, there's no distribution under the Tukaani
|
||||
project anymore. Development of LZMA Utils still continues. Still,
|
||||
there are .tlz packages around, because at least Vector Linux (a
|
||||
Slackware based distribution) uses LZMA for its packages.
|
||||
|
||||
First versions of the modified pkgtools used the LZMA_Alone tool from
|
||||
Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need
|
||||
to interact with LZMA_Alone directly. But people soon wanted to use
|
||||
LZMA for other files too, and the interface of LZMA_Alone wasn't
|
||||
comfortable for those used to gzip and bzip2.
|
||||
|
||||
|
||||
First steps of LZMA Utils
|
||||
|
||||
The first version of LZMA Utils (4.22.0) included a shell script called
|
||||
lzmash. It was wrapper that had gzip-like command line interface. It
|
||||
used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep,
|
||||
zdiff, and related scripts from gzip were adapted work with LZMA and
|
||||
were part of the first LZMA Utils release too.
|
||||
|
||||
LZMA Utils 4.22.0 included also lzmadec, which was a small (less than
|
||||
10 KiB) decoder-only command line tool. It was written on top of the
|
||||
decoder-only C code found from the LZMA SDK. lzmadec was convenient in
|
||||
situations where LZMA_Alone (a few hundred KiB) would be too big.
|
||||
|
||||
lzmash and lzmadec were written by Lasse Collin.
|
||||
|
||||
|
||||
Second generation
|
||||
|
||||
The lzmash script was an ugly and not very secure hack. The last
|
||||
version of LZMA Utils to use lzmash was 4.27.1.
|
||||
|
||||
LZMA Utils 4.32.0beta1 introduced a new lzma command line tool written
|
||||
by Ville Koskinen. It was written in C++, and used the encoder and
|
||||
decoder from C++ LZMA SDK with little modifications. This tool replaced
|
||||
both the lzmash script and the LZMA_Alone command line tool in LZMA
|
||||
Utils.
|
||||
|
||||
Introducing this new tool caused some temporary incompatibilities,
|
||||
because LZMA_Alone executable was simply named lzma like the new
|
||||
command line tool, but they had completely different command line
|
||||
interface. The file format was still the same.
|
||||
|
||||
Lasse wrote liblzmadec, which was a small decoder-only library based on
|
||||
the C code found from LZMA SDK. liblzmadec had API similar to zlib,
|
||||
although there were some significant differences, which made it
|
||||
non-trivial to use it in some applications designed for zlib and
|
||||
libbzip2.
|
||||
|
||||
The lzmadec command line tool was converted to use liblzmadec.
|
||||
|
||||
Alexandre Sauvé helped converting build system to use GNU Autotools.
|
||||
This made is easier to test for certain less portable features needed
|
||||
by the new command line tool.
|
||||
|
||||
Since the new command line tool never got completely finished (for
|
||||
example, it didn't support LZMA_OPT environment variable), the intent
|
||||
was to not call 4.32.x stable. Similarly, liblzmadec wasn't polished,
|
||||
but appeared to work well enough, so some people started using it too.
|
||||
|
||||
Because the development of the third generation of LZMA Utils was
|
||||
delayed considerably (roughly two years), the 4.32.x branch had to be
|
||||
kept maintained. It got some bug fixes now and then, and finally it was
|
||||
decided to call it stable, although most of the missing features were
|
||||
never added.
|
||||
|
||||
|
||||
File format problems
|
||||
|
||||
The file format used by LZMA_Alone was primitive. It was designed for
|
||||
embedded systems in mind, and thus provided only minimal set of
|
||||
features. The two biggest problems for non-embedded use were lack of
|
||||
magic bytes and integrity check.
|
||||
|
||||
Igor and Lasse started developing a new file format with some help from
|
||||
Ville Koskinen, Mark Adler and Mikko Pouru. Designing the new format
|
||||
took quite a long time. It was mostly because Lasse was quite slow at
|
||||
getting things done due to personal reasons.
|
||||
|
||||
Near the end of the year 2007 the new format was practically finished.
|
||||
Compared to LZMA_Alone format and the .gz format used by gzip, the new
|
||||
.lzma format is quite complex as a whole. This means that tools having
|
||||
*full* support for the new format would be larger and more complex than
|
||||
the tools supporting only the old LZMA_Alone format.
|
||||
|
||||
For the situations where the full support for the .lzma format wouldn't
|
||||
be required (embedded systems, operating system kernels), the new
|
||||
format has a well-defined subset, which is easy to support with small
|
||||
amount of code. It wouldn't be as small as an implementation using the
|
||||
LZMA_Alone format, but the difference shouldn't be significant.
|
||||
|
||||
The new .lzma format allows dividing the data in multiple independent
|
||||
blocks, which can be compressed and uncompressed independenly. This
|
||||
makes multi-threading possible with algorithms that aren't inherently
|
||||
parallel (such as LZMA). There's also a central index of the sizes of
|
||||
the blocks, which makes it possible to do limited random-access reading
|
||||
with granularity of the block size.
|
||||
|
||||
The new .lzma format uses the same filename suffix that was used for
|
||||
LZMA_Alone files. The advantage is that users using the new tools won't
|
||||
notice the change to the new format. The disadvantage is that the old
|
||||
tools won't work with the new files.
|
||||
|
||||
|
||||
Third generation
|
||||
|
||||
LZMA Utils 4.42.0alphas drop the rest of the C++ LZMA SDK. The LZMA and
|
||||
other included filters (algorithm implementations) are still directly
|
||||
based on LZMA SDK, but ported to C.
|
||||
|
||||
liblzma is now the core of LZMA Utils. It has zlib-like API, which
|
||||
doesn't suffer from the problems of the API of liblzmadec. liblzma
|
||||
supports not only LZMA, but several other filters, which together
|
||||
can improve compression ratio even further with certain file types.
|
||||
|
||||
The lzma and lzmadec command line tools have been rewritten. They uses
|
||||
liblzma to do the actual compressing or uncompressing.
|
||||
|
||||
The development of LZMA Utils 4.42.x is still in alpha stage. Several
|
||||
features are still missing or don't fully work yet. Documentation is
|
||||
also very minimal.
|
||||
|
|
@ -0,0 +1,324 @@
|
|||
|
||||
Advanced features of liblzma
|
||||
----------------------------
|
||||
|
||||
0. Introduction
|
||||
|
||||
Most developers need only the basic features of liblzma. These
|
||||
features allow single-threaded encoding and decoding of .lzma files
|
||||
in streamed mode.
|
||||
|
||||
In some cases developers want more. The .lzma file format is
|
||||
designed to allow multi-threaded encoding and decoding and limited
|
||||
random-access reading. These features are possible in non-streamed
|
||||
mode and limitedly also in streamed mode.
|
||||
|
||||
To take advange of these features, the application needs a custom
|
||||
.lzma file format handler. liblzma provides a set of tools to ease
|
||||
this task, but it's still quite a bit of work to get a good custom
|
||||
.lzma handler done.
|
||||
|
||||
|
||||
1. Where to begin
|
||||
|
||||
Start by reading the .lzma file format specification. Understanding
|
||||
the basics of the .lzma file structure is required to implement a
|
||||
custom .lzma file handler and to understand the rest of this document.
|
||||
|
||||
|
||||
2. The basic components
|
||||
|
||||
2.1. Stream Header and tail
|
||||
|
||||
Stream Header begins the .lzma Stream and Stream tail ends it. Stream
|
||||
Header is defined in the file format specification, but Stream tail
|
||||
isn't (thus I write "tail" with a lower-case letter). Stream tail is
|
||||
simply the Stream Flags and the Footer Magic Bytes fields together.
|
||||
It was done this way in liblzma, because the Block coders take care
|
||||
of the rest of the stuff in the Stream Footer.
|
||||
|
||||
For now, the size of Stream Header is fixed to 11 bytes. The header
|
||||
<lzma/stream_flags.h> defines LZMA_STREAM_HEADER_SIZE, which you
|
||||
should use instead of a hardcoded number. Similarly, Stream tail
|
||||
is fixed to 3 bytes, and there is a constant LZMA_STREAM_TAIL_SIZE.
|
||||
|
||||
It is possible, that a future version of the .lzma format will have
|
||||
variable-sized Stream Header and tail. As of writing, this seems so
|
||||
unlikely though, that it was considered simplest to just use a
|
||||
constant instead of providing a functions to get and store the sizes
|
||||
of the Stream Header and tail.
|
||||
|
||||
|
||||
2.x. Stream tail
|
||||
|
||||
For now, the size of Stream tail is fixed to 3 bytes. The header
|
||||
<lzma/stream_flags.h> defines LZMA_STREAM_TAIL_SIZE, which you
|
||||
should use instead of a hardcoded number.
|
||||
|
||||
|
||||
3. Keeping track of size information
|
||||
|
||||
The lzma_info_* functions found from <lzma/info.h> should ease the
|
||||
task of keeping track of sizes of the Blocks and also the Stream
|
||||
as a whole. Using these functions is strongly recommended, because
|
||||
there are surprisingly many situations where an error can occur,
|
||||
and these functions check for possible errors every time some new
|
||||
information becomes available.
|
||||
|
||||
If you find lzma_info_* functions lacking something that you would
|
||||
find useful, please contact the author.
|
||||
|
||||
|
||||
3.1. Start offset of the Stream
|
||||
|
||||
If you are storing the .lzma Stream inside anothe file format, or
|
||||
for some other reason are placing the .lzma Stream to somewhere
|
||||
else than to the beginning of the file, you should tell the starting
|
||||
offset of the Stream using lzma_info_start_offset_set().
|
||||
|
||||
The start offset of the Stream is used for two distinct purporses.
|
||||
First, knowing the start offset of the Stream allows
|
||||
lzma_info_alignment_get() to correctly calculate the alignment of
|
||||
every Block. This information is given to the Block encoder, which
|
||||
will calculate the size of Header Padding so that Compressed Data
|
||||
is alignment at an optimal offset.
|
||||
|
||||
Another use for start offset of the Stream is in random-access
|
||||
reading. If you set the start offset of the Stream, lzma_info_locate()
|
||||
will be able to calculate the offset relative to the beginning of the
|
||||
file containing the Stream (instead of offset relative to the
|
||||
beginning of the Stream).
|
||||
|
||||
|
||||
3.2. Size of Stream Header
|
||||
|
||||
While the size of Stream Header is constant (11 bytes) in the current
|
||||
version of the .lzma file format, this may change in future.
|
||||
|
||||
|
||||
3.3. Size of Header Metadata Block
|
||||
|
||||
This information is needed when doing random-access reading, and
|
||||
to verify the value of this field stored in Footer Metadata Block.
|
||||
|
||||
|
||||
3.4. Total Size of the Data Blocks
|
||||
|
||||
|
||||
3.5. Uncompressed Size of Data Blocks
|
||||
|
||||
|
||||
3.6. Index
|
||||
|
||||
|
||||
|
||||
|
||||
x. Alignment
|
||||
|
||||
There are a few slightly different types of alignment issues when
|
||||
working with .lzma files.
|
||||
|
||||
The .lzma format doesn't strictly require any kind of alignment.
|
||||
However, if the encoder carefully optimizes the alignment in all
|
||||
situations, it can improve compression ratio, speed of the encoder
|
||||
and decoder, and slightly help if the files get damaged and need
|
||||
recovery.
|
||||
|
||||
Alignment has the most significant effect compression ratio FIXME
|
||||
|
||||
|
||||
x.1. Compression ratio
|
||||
|
||||
Some filters take advantage of the alignment of the input data.
|
||||
To get the best compression ratio, make sure that you feed these
|
||||
filters correctly aligned data.
|
||||
|
||||
Some filters (e.g. LZMA) don't necessarily mind too much if the
|
||||
input doesn't match the preferred alignment. With these filters
|
||||
the penalty in compression ratio depends on the specific type of
|
||||
data being compressed.
|
||||
|
||||
Other filters (e.g. PowerPC executable filter) won't work at all
|
||||
with data that is improperly aligned. While the data can still
|
||||
be de-filtered back to its original form, the benefit of the
|
||||
filtering (better compression ratio) is completely lost, because
|
||||
these filters expect certain patterns at properly aligned offsets.
|
||||
The compression ratio may even worse with incorrectly aligned input
|
||||
than without the filter.
|
||||
|
||||
|
||||
x.1.1. Inter-filter alignment
|
||||
|
||||
When there are multiple filters chained, checking the alignment can
|
||||
be useful not only with the input of the first filter and output of
|
||||
the last filter, but also between the filters.
|
||||
|
||||
Inter-filter alignment important especially with the Subblock filter.
|
||||
|
||||
|
||||
x.1.2. Further compression with external tools
|
||||
|
||||
This is relatively rare situation in practice, but still worth
|
||||
understanding.
|
||||
|
||||
Let's say that there are several SPARC executables, which are each
|
||||
filtered to separate .lzma files using only the SPARC filter. If
|
||||
Uncompressed Size is written to the Block Header, the size of Block
|
||||
Header may vary between the .lzma files. If no Padding is used in
|
||||
the Block Header to correct the alignment, the starting offset of
|
||||
the Compressed Data field will be differently aligned in different
|
||||
.lzma files.
|
||||
|
||||
All these .lzma files are archived into a single .tar archive. Due
|
||||
to nature of the .tar format, every file is aligned inside the
|
||||
archive to an offset that is a multiple of 512 bytes.
|
||||
|
||||
The .tar archive is compressed into a new .lzma file using the LZMA
|
||||
filter with options, that prefer input alignment of four bytes. Now
|
||||
if the independent .lzma files don't have the same alignment of
|
||||
the Compressed Data fields, the LZMA filter will be unable to take
|
||||
advantage of the input alignment between the files in the .tar
|
||||
archive, which reduces compression ratio.
|
||||
|
||||
Thus, even if you have only single Block per file, it can be good for
|
||||
compression ratio to align the Compressed Data to optimal offset.
|
||||
|
||||
|
||||
x.2. Speed
|
||||
|
||||
Most modern computers are faster when multi-byte data is located
|
||||
at aligned offsets in RAM. Proper alignment of the Compressed Data
|
||||
fields can slightly increase the speed of some filters.
|
||||
|
||||
|
||||
x.3. Recovery
|
||||
|
||||
Aligning every Block Header to start at an offset with big enough
|
||||
alignment may ease or at least speed up recovery of broken files.
|
||||
|
||||
|
||||
y. Typical usage cases
|
||||
|
||||
y.x. Parsing the Stream backwards
|
||||
|
||||
You may need to parse the Stream backwards if you need to get
|
||||
information such as the sizes of the Stream, Index, or Extra.
|
||||
The basic procedure to do this follows.
|
||||
|
||||
Locate the end of the Stream. If the Stream is stored as is in a
|
||||
standalone .lzma file, simply seek to the end of the file and start
|
||||
reading backwards using appropriate buffer size. The file format
|
||||
specification allows arbitrary amount of Footer Padding (zero or more
|
||||
NUL bytes), which you skip before trying to decode the Stream tail.
|
||||
|
||||
Once you have located the end of the Stream (a non-NULL byte), make
|
||||
sure you have at least the last LZMA_STREAM_TAIL_SIZE bytes of the
|
||||
Stream in a buffer. If there isn't enough bytes left from the file,
|
||||
the file is too small to contain a valid Stream. Decode the Stream
|
||||
tail using lzma_stream_tail_decoder(). Store the offset of the first
|
||||
byte of the Stream tail; you will need it later.
|
||||
|
||||
You may now want to do some internal verifications e.g. if the Check
|
||||
type is supported by the liblzma build you are using.
|
||||
|
||||
Decode the Backward Size field with lzma_vli_reverse_decode(). The
|
||||
field is at maximum of LZMA_VLI_BYTES_MAX bytes long. Check that
|
||||
Backward Size is not zero. Store the offset of the first byte of
|
||||
the Backward Size; you will need it later.
|
||||
|
||||
Now you know the Total Size of the last Block of the Stream. It's the
|
||||
value of Backward Size plus the size of the Backward Size field. Note
|
||||
that you cannot use lzma_vli_size() to calculate the size since there
|
||||
might be padding; you need to use the real observed size of the
|
||||
Backward Size field.
|
||||
|
||||
At this point, the operation continues differently for Single-Block
|
||||
and Multi-Block Streams.
|
||||
|
||||
|
||||
y.x.1. Single-Block Stream
|
||||
|
||||
There might be Uncompressed Size field present in the Stream Footer.
|
||||
You cannot know it for sure unless you have already parsed the Block
|
||||
Header earlier. For security reasons, you probably want to try to
|
||||
decode the Uncompressed Size field, but you must not indicate any
|
||||
error if decoding fails. Later you can give the decoded Uncompressed
|
||||
Size to Block decoder if Uncopmressed Size isn't otherwise known;
|
||||
this prevents it from producing too much output in case of (possibly
|
||||
intentionally) corrupt file.
|
||||
|
||||
Calculate the the start offset of the Stream:
|
||||
|
||||
backward_offset - backward_size - LZMA_STREAM_HEADER_SIZE
|
||||
|
||||
backward_offset is the offset of the first byte of the Backward Size
|
||||
field. Remember to check for integer overflows, which can occur with
|
||||
invalid input files.
|
||||
|
||||
Seek to the beginning of the Stream. Decode the Stream Header using
|
||||
lzma_stream_header_decoder(). Verify that the decoded Stream Flags
|
||||
match the values found from Stream tail. You can use the
|
||||
lzma_stream_flags_is_equal() macro for this.
|
||||
|
||||
Decode the Block Header. Verify that it isn't a Metadata Block, since
|
||||
Single-Block Streams cannot have Metadata. If Uncompressed Size is
|
||||
present in the Block Header, the value you tried to decode from the
|
||||
Stream Footer must be ignored, since Uncompressed Size wasn't actually
|
||||
present there. If Block Header doesn't have Uncompressed Size, and
|
||||
decoding the Uncompressed Size field from the Stream Footer failed,
|
||||
the file is corrupt.
|
||||
|
||||
If you were only looking for the Uncompressed Size of the Stream,
|
||||
you now got that information, and you can stop processing the Stream.
|
||||
|
||||
To decode the Block, the same instructions apply as described in
|
||||
FIXME. However, because you have some extra known information decoded
|
||||
from the Stream Footer, you should give this information to the Block
|
||||
decoder so that it can verify it while decoding:
|
||||
- If Uncompressed Size is not present in the Block Header, set
|
||||
lzma_options_block.uncompressed_size to the value you decoded
|
||||
from the Stream Footer.
|
||||
- Always set lzma_options_block.total_size to backward_size +
|
||||
size_of_backward_size (you calculated this sum earlier already).
|
||||
|
||||
|
||||
y.x.2. Multi-Block Stream
|
||||
|
||||
Calculate the start offset of the Footer Metadata Block:
|
||||
|
||||
backward_offset - backward_size
|
||||
|
||||
backward_offset is the offset of the first byte of the Backward Size
|
||||
field. Remember to check for integer overflows, which can occur with
|
||||
broken input files.
|
||||
|
||||
Decode the Block Header. Verify that it is a Metadata Block. Set
|
||||
lzma_options_block.total_size to backward_size + size_of_backward_size
|
||||
(you calculated this sum earlier already). Then decode the Footer
|
||||
Metadata Block.
|
||||
|
||||
Store the decoded Footer Metadata to lzma_info structure using
|
||||
lzma_info_set_metadata(). Set also the offset of the Backward Size
|
||||
field using lzma_info_size_set(). Then you can get the start offset
|
||||
of the Stream using lzma_info_size_get(). Note that any of these steps
|
||||
may fail so don't omit error checking.
|
||||
|
||||
Seek to the beginning of the Stream. Decode the Stream Header using
|
||||
lzma_stream_header_decoder(). Verify that the decoded Stream Flags
|
||||
match the values found from Stream tail. You can use the
|
||||
lzma_stream_flags_is_equal() macro for this.
|
||||
|
||||
If you were only looking for the Uncompressed Size of the Stream,
|
||||
it's possible that you already have it now. If Uncompressed Size (or
|
||||
whatever information you were looking for) isn't available yet,
|
||||
continue by decoding also the Header Metadata Block. (If some
|
||||
information is missing, the Header Metadata Block has to be present.)
|
||||
|
||||
Decoding the Data Blocks goes the same way as described in FIXME.
|
||||
|
||||
|
||||
y.x.3. Variations
|
||||
|
||||
If you know the offset of the beginning of the Stream, you may want
|
||||
to parse the Stream Header before parsing the Stream tail.
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
|
||||
Hacking liblzma
|
||||
---------------
|
||||
|
||||
0. Preface
|
||||
|
||||
This document gives some overall information about the internals of
|
||||
liblzma, which should make it easier to start reading and modifying
|
||||
the code.
|
||||
|
||||
|
||||
1. Programming language
|
||||
|
||||
liblzma was written in C99. If you use GCC, this means that you need
|
||||
at least GCC 3.x.x. GCC 2 isn't and won't be supported.
|
||||
|
||||
Some GCC-specific extensions are used *conditionally*. They aren't
|
||||
required to build a full-featured library. Don't make the code rely
|
||||
on any non-standard compiler extensions or even C99 features that
|
||||
aren't portable between almost-C99 compatible compilers (for example
|
||||
non-static inlines).
|
||||
|
||||
The public API headers are in C89. This is to avoid frustrating those
|
||||
who maintain programs, which are strictly in C89 or C++.
|
||||
|
||||
An assumption about sizeof(size_t) is made. If this assumption is
|
||||
wrong, some porting is probably needed:
|
||||
|
||||
sizeof(uint32_t) <= sizeof(size_t) <= sizeof(uint64_t)
|
||||
|
||||
|
||||
2. Internal vs. external API
|
||||
|
||||
|
||||
|
||||
Input Output
|
||||
v Application ^
|
||||
| liblzma public API |
|
||||
| Stream coder |
|
||||
| Block coder |
|
||||
| Filter coder |
|
||||
| ... |
|
||||
v Filter coder ^
|
||||
|
||||
|
||||
Application
|
||||
`-- liblzma public API
|
||||
`-- Stream coder
|
||||
|-- Stream info handler
|
||||
|-- Stream Header coder
|
||||
|-- Block Header coder
|
||||
| `-- Filter Flags coder
|
||||
|-- Metadata coder
|
||||
| `-- Block coder
|
||||
| `-- Filter 0
|
||||
| `-- Filter 1
|
||||
| ...
|
||||
|-- Data Block coder
|
||||
| `-- Filter 0
|
||||
| `-- Filter 1
|
||||
| ...
|
||||
`-- Stream tail coder
|
||||
|
||||
|
||||
|
||||
x. Designing new filters
|
||||
|
||||
All filters must be designed so that the decoder cannot consume
|
||||
arbitrary amount input without producing any decoded output. Failing
|
||||
to follow this rule makes liblzma vulnerable to DoS attacks if
|
||||
untrusted files are decoded (usually they are untrusted).
|
||||
|
||||
An example should clarify the reason behind this requirement: There
|
||||
are two filters in the chain. The decoder of the first filter produces
|
||||
huge amount of output (many gigabytes or more) with a few bytes of
|
||||
input, which gets passed to the decoder of the second filter. If the
|
||||
data passed to the second filter is interpreted as something that
|
||||
produces no output (e.g. padding), the filter chain as a whole
|
||||
produces no output and consumes no input for a long period of time.
|
||||
|
||||
The above problem was present in the first versions of the Subblock
|
||||
filter. A tiny .lzma file could have taken several years to decode
|
||||
while it wouldn't produce any output at all. The problem was fixed
|
||||
by adding limits for number of consecutive Padding bytes, and requiring
|
||||
that some decoded output must be produced between Set Subfilter and
|
||||
Unset Subfilter.
|
||||
|
||||
|
||||
x. Implementing new filters
|
||||
|
||||
If the filter supports embedding End of Payload Marker, make sure that
|
||||
when your filter detects End of Payload Marker,
|
||||
- the usage of End of Payload Marker is actually allowed (i.e. End
|
||||
of Input isn't used); and
|
||||
- it also checks that there is no more input coming from the next
|
||||
filter in the chain.
|
||||
|
||||
The second requirement is slightly tricky. It's possible that the next
|
||||
filter hasn't returned LZMA_STREAM_END yet. It may even need a few
|
||||
bytes more input before it will do so. You need to give it as much
|
||||
input as it needs, and verify that it doesn't produce any output.
|
||||
|
||||
Don't call the next filter in the chain after it has returned
|
||||
LZMA_STREAM_END (except in encoder if action == LZMA_SYNC_FLUSH).
|
||||
It will result undefined behavior.
|
||||
|
||||
Be pedantic. If the input data isn't exactly valid, reject it.
|
||||
|
||||
At the moment, liblzma isn't modular. You will need to edit several
|
||||
files in src/liblzma/common to include support for a new filter. grep
|
||||
for LZMA_FILTER_LZMA to locate the files needing changes.
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
|
||||
Introduction to liblzma
|
||||
-----------------------
|
||||
|
||||
Writing applications to work with liblzma
|
||||
|
||||
liblzma API is split in several subheaders to improve readability and
|
||||
maintainance. The subheaders must not be #included directly; simply
|
||||
use `#include <lzma.h>' instead.
|
||||
|
||||
Those who have used zlib should find liblzma's API easy to use.
|
||||
To developers who haven't used zlib before, I recommend learning
|
||||
zlib first, because zlib has excellent documentation.
|
||||
|
||||
While the API is similar to that of zlib, there are some major
|
||||
differences, which are summarized below.
|
||||
|
||||
For basic stream encoding, zlib has three functions (deflateInit(),
|
||||
deflate(), and deflateEnd()). Similarly, there are three functions
|
||||
for stream decoding (inflateInit(), inflate(), and inflateEnd()).
|
||||
liblzma has only single coding and ending function. Thus, to
|
||||
encode one may use, for example, lzma_stream_encoder_single(),
|
||||
lzma_code(), and lzma_end(). Simlarly for decoding, one may
|
||||
use lzma_auto_decoder(), lzma_code(), and lzma_end().
|
||||
|
||||
zlib has deflateReset() and inflateReset() to reset the stream
|
||||
structure without reallocating all the memory. In liblzma, all
|
||||
coder initialization functions are like zlib's reset functions:
|
||||
the first-time initializations are done with the same functions
|
||||
as the reinitializations (resetting).
|
||||
|
||||
To make all this work, liblzma needs to know when lzma_stream
|
||||
doesn't already point to an allocated and initialized coder.
|
||||
This is achieved by initializing lzma_stream structure with
|
||||
LZMA_STREAM_INIT (static initialization) or LZMA_STREAM_INIT_VAR
|
||||
(for exampple when new lzma_stream has been allocated with malloc()).
|
||||
This initialization should be done exactly once per lzma_stream
|
||||
structure to avoid leaking memory. Calling lzma_end() will leave
|
||||
lzma_stream into a state comparable to the state achieved with
|
||||
LZMA_STREAM_INIT and LZMA_STREAM_INIT_VAR.
|
||||
|
||||
Example probably clarifies a lot. With zlib, compression goes
|
||||
roughly like this:
|
||||
|
||||
z_stream strm;
|
||||
deflateInit(&strm, level);
|
||||
deflate(&strm, Z_RUN);
|
||||
deflate(&strm, Z_RUN);
|
||||
...
|
||||
deflate(&strm, Z_FINISH);
|
||||
deflateEnd(&strm) or deflateReset(&strm)
|
||||
|
||||
With liblzma, it's slightly different:
|
||||
|
||||
lzma_stream strm = LZMA_STREAM_INIT;
|
||||
lzma_stream_encoder_single(&strm, &options);
|
||||
lzma_code(&strm, LZMA_RUN);
|
||||
lzma_code(&strm, LZMA_RUN);
|
||||
...
|
||||
lzma_code(&strm, LZMA_FINISH);
|
||||
lzma_end(&strm) or reinitialize for new coding work
|
||||
|
||||
Reinitialization in the last step can be any function that can
|
||||
initialize lzma_stream; it doesn't need to be the same function
|
||||
that was used for the previous initialization. If it is the same
|
||||
function, liblzma will usually be able to re-use most of the
|
||||
existing memory allocations (depends on how much the initialization
|
||||
options change). If you reinitialize with different function,
|
||||
liblzma will automatically free the memory of the previous coder.
|
||||
|
||||
|
||||
File formats
|
||||
|
||||
liblzma supports multiple container formats for the compressed data.
|
||||
Different initialization functions initialize the lzma_stream to
|
||||
process different container formats. See the details from the public
|
||||
header files.
|
||||
|
||||
The following functions are the most commonly used:
|
||||
|
||||
- lzma_stream_encoder_single(): Encodes Single-Block Stream; this
|
||||
the recommended format for most purporses.
|
||||
|
||||
- lzma_alone_encoder(): Useful if you need to encode into the
|
||||
legacy LZMA_Alone format.
|
||||
|
||||
- lzma_auto_decoder(): Decoder that automatically detects the
|
||||
file format; recommended when you decode compressed files on
|
||||
disk, because this way compatibility with the legacy LZMA_Alone
|
||||
format is transparent.
|
||||
|
||||
- lzma_stream_decoder(): Decoder for Single- and Multi-Block
|
||||
Streams; this is good if you want to accept only .lzma Streams.
|
||||
|
||||
|
||||
Filters
|
||||
|
||||
liblzma supports multiple filters (algorithm implementations). The new
|
||||
.lzma format supports filter-chain having up to seven filters. In the
|
||||
filter chain, the output of one filter is input of the next filter in
|
||||
the chain. The legacy LZMA_Alone format supports only one filter, and
|
||||
that must always be LZMA.
|
||||
|
||||
General-purporse compression:
|
||||
|
||||
LZMA The main algorithm of liblzma (surprise!)
|
||||
|
||||
Branch/Call/Jump filters for executables:
|
||||
|
||||
x86 This filter is known as BCJ in 7-Zip
|
||||
IA64 IA-64 (Itanium)
|
||||
PowerPC Big endian PowerPC
|
||||
ARM
|
||||
ARM-Thumb
|
||||
SPARC
|
||||
|
||||
Other filters:
|
||||
|
||||
Copy Dummy filter that simply copies all the data
|
||||
from input to output.
|
||||
|
||||
Subblock Multi-purporse filter, that can
|
||||
- embed End of Payload Marker if the previous
|
||||
filter in the chain doesn't support it; and
|
||||
- apply Subfilters, which filter only part
|
||||
of the same compressed Block in the Stream.
|
||||
|
||||
Branch/Call/Jump filters never change the size of the data. They
|
||||
should usually be used as a pre-filter for some compression filter
|
||||
like LZMA.
|
||||
|
||||
|
||||
Integrity checks
|
||||
|
||||
The .lzma Stream format uses CRC32 as the integrity check for
|
||||
different file format headers. It is possible to omit CRC32 from
|
||||
the Block Headers, but not from Stream Header. This is the reason
|
||||
why CRC32 code cannot be disabled when building liblzma (in addition,
|
||||
the LZMA encoder uses CRC32 for hashing, so that's another reason).
|
||||
|
||||
The integrity check of the actual data is calculated from the
|
||||
uncompressed data. This check can be CRC32, CRC64, or SHA256.
|
||||
It can also be omitted completely, although that usually is not
|
||||
a good thing to do. There are free IDs left, so support for new
|
||||
checks algorithms can be added later.
|
||||
|
||||
|
||||
API and ABI stability
|
||||
|
||||
The API and ABI of liblzma isn't stable yet, although no huge
|
||||
changes should happen. One potential place for change is the
|
||||
lzma_options_subblock structure.
|
||||
|
||||
In the 4.42.0alpha phase, the shared library version number won't
|
||||
be updated even if ABI breaks. I don't want to track the ABI changes
|
||||
yet. Just rebuild everything when you upgrade liblzma until we get
|
||||
to the beta stage.
|
||||
|
||||
|
||||
Size of the library
|
||||
|
||||
While liblzma isn't huge, it is quite far from the smallest possible
|
||||
LZMA implementation: full liblzma binary (with support for all
|
||||
filters and other features) is way over 100 KiB, but the plain raw
|
||||
LZMA decoder is only 5-10 KiB.
|
||||
|
||||
To decrease the size of the library, you can omit parts of the library
|
||||
by passing certain options to the `configure' script. Disabling
|
||||
everything but the decoders of the require filters will usually give
|
||||
you a small enough library, but if you need a decoder for example
|
||||
embedded in the operating system kernel, the code from liblzma probably
|
||||
isn't suitable as is.
|
||||
|
||||
If you need a minimal implementation supporting .lzma Streams, you
|
||||
may need to do partial rewrite. liblzma uses stateful API like zlib.
|
||||
That increases the size of the library. Using callback API or even
|
||||
simpler buffer-to-buffer API would allow smaller implementation.
|
||||
|
||||
LZMA SDK contains smaller LZMA decoder written in ANSI-C than
|
||||
liblzma, so you may want to take a look at that code. However,
|
||||
it doesn't (at least not yet) support the new .lzma Stream format.
|
||||
|
||||
|
||||
Documentation
|
||||
|
||||
There's no other documentation than the public headers and this
|
||||
text yet. Real docs will be written some day, I hope.
|
||||
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
Using liblzma securely
|
||||
----------------------
|
||||
|
||||
0. Introduction
|
||||
|
||||
This document discusses how to use liblzma securely. There are issues
|
||||
that don't apply to zlib or libbzip2, so reading this document is
|
||||
strongly recommended even for those who are very familiar with zlib
|
||||
or libbzip2.
|
||||
|
||||
While making liblzma itself as secure as possible is essential, it's
|
||||
out of scope of this document.
|
||||
|
||||
|
||||
1. Memory usage
|
||||
|
||||
The memory usage of liblzma varies a lot.
|
||||
|
||||
|
||||
1.1. Problem sources
|
||||
|
||||
1.1.1. Block coder
|
||||
|
||||
The memory requirements of Block encoder depend on the used filters
|
||||
and their settings. The memory requirements of the Block decoder
|
||||
depend on the which filters and with which filter settings the Block
|
||||
was encoded. Usually the memory requirements of a decoder are equal
|
||||
or less than the requirements of the encoder with the same settings.
|
||||
|
||||
While the typical memory requirements to decode a Block is from a few
|
||||
hundred kilobytes to tens of megabytes, a maliciously constructed
|
||||
files can require a lot more RAM to decode. With the current filters,
|
||||
the maximum amount is about 7 GiB. If you use multi-threaded decoding,
|
||||
every Block can require this amount of RAM, thus a four-threaded
|
||||
decoder could suddenly try to allocate 28 GiB of RAM.
|
||||
|
||||
If you don't limit the maximum memory usage in any way, and there are
|
||||
no resource limits set on the operating system side, one malicious
|
||||
input file can run the system out of memory, or at least make it swap
|
||||
badly for a long time. This is exceptionally bad on servers e.g.
|
||||
email server doing virus scanning on incoming messages.
|
||||
|
||||
|
||||
1.1.2. Metadata decoder
|
||||
|
||||
Multi-Block .lzma files contain at least one Metadata Block.
|
||||
Externally the Metadata Blocks are similar to Data Blocks, so all
|
||||
the issues mentioned about memory usage of Data Blocks applies to
|
||||
Metadata Blocks too.
|
||||
|
||||
The uncompressed content of Metadata Blocks contain information about
|
||||
the Stream as a whole, and optionally some Extra Records. The
|
||||
information about the Stream is kept in liblzma's internal data
|
||||
structures in RAM. Extra Records can contain arbitrary data. They are
|
||||
not interpreted by liblzma, but liblzma will provide them to the
|
||||
application in uninterpreted form if the application wishes so.
|
||||
|
||||
Usually the Uncompressed Size of a Metadata Block is small. Even on
|
||||
extreme cases, it shouldn't be much bigger than a few megabytes. Once
|
||||
the Metadata has been parsed into native data structures in liblzma,
|
||||
it usually takes a little more memory than in the encoded form. For
|
||||
all normal files, this is no problem, since the resulting memory usage
|
||||
won't be too much.
|
||||
|
||||
The problem is that a maliciously constructed Metadata Block can
|
||||
contain huge amount of "information", which liblzma will try to store
|
||||
in its internal data structures. This may cause liblzma to allocate
|
||||
all the available RAM unless some kind of resource usage limits are
|
||||
applied.
|
||||
|
||||
Note that the Extra Records in Metadata are always parsed but, but
|
||||
memory is allocated for them only if the application has requested
|
||||
liblzma to provide the Extra Records to the application.
|
||||
|
||||
|
||||
1.2. Solutions
|
||||
|
||||
If you need to decode files from untrusted sources (most people do),
|
||||
you must limit the memory usage to avoid denial of service (DoS)
|
||||
conditions caused by malicious input files.
|
||||
|
||||
The first step is to find out how much memory you are allowed consume
|
||||
at maximum. This may be a hardcoded constant or derived from the
|
||||
available RAM; whatever is appropriate in the application.
|
||||
|
||||
The simplest solution is to use setrlimit() if the kernel supports
|
||||
RLIMIT_AS, which limits the memory usage of the whole process.
|
||||
For more portable and fine-grained limitting, you can use
|
||||
memory limitter functions found from <lzma/memlimit.h>.
|
||||
|
||||
|
||||
1.2.1. Encoder
|
||||
|
||||
lzma_memory_usage() will give you a rough estimate about the memory
|
||||
usage of the given filter chain. To dramatically simplify the internal
|
||||
implementation, this function doesn't take into account all the small
|
||||
helper data structures needed in various places; only the structures
|
||||
with significant memory usage are taken into account. Still, the
|
||||
accuracy of this function should be well within a mebibyte.
|
||||
|
||||
The Subblock filter is a special case. If a Subfilter has been
|
||||
specified, it isn't taken into account when lzma_memory_usage()
|
||||
calculates the memory usage. You need to calculate the memory usage
|
||||
of the Subfilter separately.
|
||||
|
||||
Keeping track of Blocks in a Multi-Block Stream takes a few dozen
|
||||
bytes of RAM per Block (size of the lzma_index structure plus overhead
|
||||
of malloc()). It isn't a good idea to put tens of thousands of Blocks
|
||||
into a Stream unless you have a very good reason to do so (compressed
|
||||
dictionary could be an example of such situation).
|
||||
|
||||
Also keep the number and sizes of Extra Records sane. If you produce
|
||||
the list of Extra Records automatically from some untrusted source,
|
||||
you should not only validate the content of these Records, but also
|
||||
their memory usage.
|
||||
|
||||
|
||||
1.2.2. Decoder
|
||||
|
||||
A single-threaded decoder should simply use a memory limitter and
|
||||
indicate an error if it runs out of memory.
|
||||
|
||||
Memory-limitting with multi-threaded decoding is tricky. The simple
|
||||
solution is to divide the maximum allowed memory usage with the
|
||||
maximum allowed threads, and give each Block decoder their own
|
||||
independent lzma_memory_limitter. The drawback is that if one Block
|
||||
needs notably more RAM than any other Block, the decoder will run out
|
||||
of memory when in reality there would be plenty of free RAM.
|
||||
|
||||
An attractive alternative would be using shared lzma_memory_limitter.
|
||||
Depending on the application and the expected type of input, this may
|
||||
either be the best solution or a source of hard-to-repeat problems.
|
||||
Consider the following requirements:
|
||||
- You use at maximum of n threads.
|
||||
- x(i) is the decoder memory requirements of the Block number i
|
||||
in an expected input Stream.
|
||||
- The memory limitter is set to higher value than the sum of n
|
||||
highest values x(i).
|
||||
|
||||
(If you are better at explaining the above conditions, please
|
||||
contribute your improved version.)
|
||||
|
||||
If the above conditions aren't met, it is possible that the decoding
|
||||
will fail unpredictably. That is, on the same machine using the same
|
||||
settings, the decoding may sometimes succeed and sometimes fail. This
|
||||
is because sometimes threads may run so that the Blocks with highest
|
||||
memory usage are tried to be decoded at the same time.
|
||||
|
||||
Most .lzma files have all the Blocks encoded with identical settings,
|
||||
or at least the memory usage won't vary dramatically. That's why most
|
||||
multi-threaded decoders probably want to use the simple "separate
|
||||
lzma_memory_limitter for each thread" solution, possibly fallbacking
|
||||
to single-threaded mode in case the per-thread memory limits aren't
|
||||
enough in multi-threaded mode.
|
||||
|
||||
FIXME: Memory usage of Stream info.
|
||||
|
||||
[
|
||||
|
||||
]
|
||||
|
||||
|
||||
2. Huge uncompressed output
|
||||
|
||||
2.1. Data Blocks
|
||||
|
||||
Decoding a tiny .lzma file can produce huge amount of uncompressed
|
||||
output. There is an example file of 45 bytes, which decodes to 64 PiB
|
||||
(that's 2^56 bytes). Uncompressing such a file to disk is likely to
|
||||
fill even a bigger disk array. If the data is written to a pipe, it
|
||||
may not fill the disk, but would still take very long time to finish.
|
||||
|
||||
To avoid denial of service conditions caused by huge amount of
|
||||
uncompressed output, applications using liblzma should use some method
|
||||
to limit the amount of output produced. The exact method depends on
|
||||
the application.
|
||||
|
||||
All valid .lzma Streams make it possible to find out the uncompressed
|
||||
size of the Stream without actually uncompressing the data. This
|
||||
information is available in at least one of the Metadata Blocks.
|
||||
Once the uncompressed size is parsed, the decoder can verify that
|
||||
it doesn't exceed certain limits (e.g. available disk space).
|
||||
|
||||
When the uncompressed size is known, the decoder can actively keep
|
||||
track of the amount of output produced so far, and that it doesn't
|
||||
exceed the known uncompressed size. If it does exceed, the file is
|
||||
known to be corrupt and an error should be indicated without
|
||||
continuing to decode the rest of the file.
|
||||
|
||||
Unfortunately, finding the uncompressed size beforehand is often
|
||||
possible only in non-streamed mode, because the needed information
|
||||
could be in the Footer Metdata Block, which (obviously) is at the
|
||||
end of the Stream. In purely streamed mode decoding, one may need to
|
||||
use some rough arbitrary limits to prevent the problems described in
|
||||
the beginning of this section.
|
||||
|
||||
|
||||
2.2. Metadata
|
||||
|
||||
Metadata is stored in Metadata Blocks, which are very similar to
|
||||
Data Blocks. Thus, the uncompressed size can be huge just like with
|
||||
Data Blocks. The difference is, that the contents of Metadata Blocks
|
||||
aren't given to the application as is, but parsed by liblzma. Still,
|
||||
reading through a huge Metadata can take very long time, effectively
|
||||
creating a denial of service like piping decoded a Data Block to
|
||||
another process would do.
|
||||
|
||||
At first it would seem that using a memory limitter would prevent
|
||||
this issue as a side effect. But it does so only if the application
|
||||
requests liblzma to allocate the Extra Records and provide them to
|
||||
the application. If Extra Records aren't requested, they aren't
|
||||
allocated either. Still, the Extra Records are being read through
|
||||
to validate that the Metadata is in proper format.
|
||||
|
||||
The solution is to limit the Uncompressed Size of a Metadata Block
|
||||
to some relatively large value. This will make liblzma to give an
|
||||
error when the given limit is reached.
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
|
||||
Introduction to the lzma command line tool
|
||||
------------------------------------------
|
||||
|
||||
Overview
|
||||
|
||||
The lzma command line tool is similar to gzip and bzip2, but for
|
||||
compressing and uncompressing .lzma files.
|
||||
|
||||
|
||||
Supported file formats
|
||||
|
||||
By default, the tool creates files in the new .lzma format. This can
|
||||
be overriden with --format=FMT command line option. Use --format=alone
|
||||
to create files in the old LZMA_Alone format.
|
||||
|
||||
By default, the tool uncompresses both the new .lzma format and
|
||||
LZMA_Alone format. This is to make it transparent to switch from
|
||||
the old LZMA_Alone format to the new .lzma format. Since both
|
||||
formats use the same filename suffix, average user should never
|
||||
notice which format was used.
|
||||
|
||||
|
||||
Differences to gzip and bzip2
|
||||
|
||||
Standard input and output
|
||||
|
||||
Both gzip and bzip2 refuse to write compressed data to a terminal and
|
||||
read compressed data from a terminal. With gzip (but not with bzip2),
|
||||
this can be overriden with the `--force' option. lzma follows the
|
||||
behavior of gzip here.
|
||||
|
||||
Usage of LZMA_OPT environment variable
|
||||
|
||||
gzip and bzip2 read GZIP and BZIP2 environment variables at startup.
|
||||
These variables may contain extra command line options.
|
||||
|
||||
gzip and bzip2 allow passing not only options, but also end-of-options
|
||||
indicator (`--') and filenames via the environment variable. No quoting
|
||||
is supported with the filenames.
|
||||
|
||||
Here are examples with gzip. bzip2 behaves identically.
|
||||
|
||||
bash$ echo asdf > 'foo bar'
|
||||
bash$ GZIP='"foo bar"' gzip
|
||||
gzip: "foo: No such file or directory
|
||||
gzip: bar": No such file or directory
|
||||
|
||||
bash$ GZIP=-- gzip --help
|
||||
gzip: --help: No such file or directory
|
||||
|
||||
lzma silently ignores all non-option arguments given via the
|
||||
environment variable LZMA_OPT. Like on the command line, everything
|
||||
after `--' is taken as non-options, and thus ignored in LZMA_OPT.
|
||||
|
||||
bash$ LZMA_OPT='--help' lzma --version # Displays help
|
||||
bash$ LZMA_OPT='-- --help' lzma --version # Displays version
|
||||
|
||||
|
||||
Filter chain presets
|
||||
|
||||
Like in gzip and bzip2, lzma supports numbered presets from 1 to 9
|
||||
where 1 is the fastest and 9 the best compression. 1 and 2 are for
|
||||
fast compressing with small memory usage, 3 to 6 for good compression
|
||||
ratio with medium memory usage, and 7 to 9 for excellent compression
|
||||
ratio with higher memory requirements. The default is 7 if memory
|
||||
usage limit allows.
|
||||
|
||||
In future, there will probably be an option like --preset=NAME, which
|
||||
will contain more special presets for specific file types.
|
||||
|
||||
It's also possible that there will be some heuristics to select good
|
||||
filters. For example, the tool could detect when a .tar archive is
|
||||
being compressed, and enable x86 filter only for those files in the
|
||||
.tar archive that are ELF or PE executables for x86.
|
||||
|
||||
|
||||
Specifying custom filter chains
|
||||
|
||||
Custom filter chains are specified by using long options with the name
|
||||
of the filters in correct order. For example, to pass the input data to
|
||||
the x86 filter and the output of that to the LZMA filter, the following
|
||||
command will do:
|
||||
|
||||
lzma --x86 --lzma filename
|
||||
|
||||
Some filters accept options, which are specified as a comma-separated
|
||||
list of key=value pairs:
|
||||
|
||||
lzma --delta=distance=4 --lzma=dict=4Mi,lc=8,lp=2 filename
|
||||
|
||||
|
||||
Memory usage control
|
||||
|
||||
By default, the command line tool limits memory usage to 1/3 of the
|
||||
available physical RAM. If no preset or custom filter chain has been
|
||||
given, the default preset will be used. If the memory limit is too
|
||||
low for the default preset, the tool will silently switch to lower
|
||||
preset.
|
||||
|
||||
When a preset or a custom filter chain has been specified and the
|
||||
memory limit is too low, an error message is displayed and no files
|
||||
are processed.
|
||||
|
||||
If the decoder hits the memory usage limit, an error is displayed and
|
||||
no more files are processed.
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
scanlzma, scan for lzma compressed data in stdin and echo it to stdout.
|
||||
Copyright (C) 2006 Timo Lindfors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/* Usage example:
|
||||
|
||||
$ wget http://www.wifi-shop.cz/Files/produkty/wa2204/wa2204av1.4.1.zip
|
||||
$ unzip wa2204av1.4.1.zip
|
||||
$ gcc scanlzma.c -o scanlzma -Wall
|
||||
$ ./scanlzma 0 < WA2204-FW1.4.1/linux-1.4.bin | lzma -c -d | strings | grep -i "copyright"
|
||||
UpdateDD version 2.5, Copyright (C) 2005 Philipp Benner.
|
||||
Copyright (C) 2005 Philipp Benner.
|
||||
Copyright (C) 2005 Philipp Benner.
|
||||
mawk 1.3%s%s %s, Copyright (C) Michael D. Brennan
|
||||
# Copyright (C) 1998, 1999, 2001 Henry Spencer.
|
||||
...
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* LZMA compressed file format */
|
||||
/* --------------------------- */
|
||||
/* Offset Size Description */
|
||||
/* 0 1 Special LZMA properties for compressed data */
|
||||
/* 1 4 Dictionary size (little endian) */
|
||||
/* 5 8 Uncompressed size (little endian). -1 means unknown size */
|
||||
/* 13 Compressed data */
|
||||
|
||||
#define BUFSIZE 4096
|
||||
|
||||
int find_lzma_header(unsigned char *buf) {
|
||||
return (buf[0] < 0xE1
|
||||
&& buf[0] == 0x5d
|
||||
&& buf[4] < 0x20
|
||||
&& (memcmp (buf + 10 , "\x00\x00\x00", 3) == 0
|
||||
|| (memcmp (buf + 5, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8) == 0)));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
char buf[BUFSIZE];
|
||||
int ret, i, numlzma, blocks=0;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("usage: %s numlzma < infile | lzma -c -d > outfile\n"
|
||||
"where numlzma is index of lzma file to extract, starting from zero.\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
numlzma = atoi(argv[1]);
|
||||
|
||||
for (;;) {
|
||||
/* Read data. */
|
||||
ret = fread(buf, BUFSIZE, 1, stdin);
|
||||
if (ret != 1)
|
||||
break;
|
||||
|
||||
/* Scan for signature. */
|
||||
for (i = 0; i<BUFSIZE-23; i++) {
|
||||
if (find_lzma_header(buf+i) && numlzma-- <= 0) {
|
||||
fwrite(buf+i, (BUFSIZE-i), 1, stdout);
|
||||
for (;;) {
|
||||
int ch;
|
||||
ch = getchar();
|
||||
if (ch == EOF)
|
||||
exit(0);
|
||||
putchar(ch);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
blocks++;
|
||||
}
|
||||
return 1;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
##
|
||||
## Copyright (C) 2004-2007 Free Software Foundation, Inc.
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## This program is free software; you can redistribute it and/or modify
|
||||
## it under the terms of the GNU General Public License as published by
|
||||
## the Free Software Foundation; either version 2 of the License, or
|
||||
## (at your option) any later version.
|
||||
##
|
||||
## This program is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
## GNU General Public License for more details.
|
||||
##
|
||||
|
||||
## Not using gnulib-tool, at least for now. Less mess this way.
|
||||
|
||||
## We need two builds of libgnu: one with NLS and one without.
|
||||
## This is because lzma uses NLS but lzmadec doesn't, while
|
||||
## both need GNU getopt_long().
|
||||
noinst_LIBRARIES = libgnu.a libgnu_nls.a
|
||||
|
||||
libgnu_a_SOURCES =
|
||||
libgnu_a_DEPENDENCIES = $(LIBOBJS)
|
||||
libgnu_a_LIBADD = $(LIBOBJS)
|
||||
libgnu_a_CPPFLAGS = -DDISABLE_NLS=1
|
||||
|
||||
libgnu_nls_a_SOURCES =
|
||||
libgnu_nls_a_DEPENDENCIES = $(LIBOBJS)
|
||||
libgnu_nls_a_LIBADD = $(LIBOBJS)
|
||||
|
||||
EXTRA_DIST = gettext.h getopt_.h getopt.c getopt1.c getopt_int.h
|
||||
BUILT_SOURCES = $(GETOPT_H)
|
||||
MOSTLYCLEANFILES = getopt.h getopt.h-t
|
||||
|
||||
getopt.h: getopt_.h
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/getopt_.h; \
|
||||
} > $@-t
|
||||
mv -f $@-t $@
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,171 @@
|
|||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004,2006
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifdef _LIBC
|
||||
# include <getopt.h>
|
||||
#else
|
||||
# include <config.h>
|
||||
# include "getopt.h"
|
||||
#endif
|
||||
#include "getopt_int.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
int
|
||||
getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
|
||||
const struct option *long_options, int *opt_index)
|
||||
{
|
||||
return _getopt_internal (argc, (char **) argv, options, long_options,
|
||||
opt_index, 0, 0);
|
||||
}
|
||||
|
||||
int
|
||||
_getopt_long_r (int argc, char **argv, const char *options,
|
||||
const struct option *long_options, int *opt_index,
|
||||
struct _getopt_data *d)
|
||||
{
|
||||
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||
0, 0, d);
|
||||
}
|
||||
|
||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||
If an option that starts with '-' (not '--') doesn't match a long option,
|
||||
but does match a short option, it is parsed as a short option
|
||||
instead. */
|
||||
|
||||
int
|
||||
getopt_long_only (int argc, char *__getopt_argv_const *argv,
|
||||
const char *options,
|
||||
const struct option *long_options, int *opt_index)
|
||||
{
|
||||
return _getopt_internal (argc, (char **) argv, options, long_options,
|
||||
opt_index, 1, 0);
|
||||
}
|
||||
|
||||
int
|
||||
_getopt_long_only_r (int argc, char **argv, const char *options,
|
||||
const struct option *long_options, int *opt_index,
|
||||
struct _getopt_data *d)
|
||||
{
|
||||
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||
1, 0, d);
|
||||
}
|
||||
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"add", 1, 0, 0},
|
||||
{"append", 0, 0, 0},
|
||||
{"delete", 1, 0, 0},
|
||||
{"verbose", 0, 0, 0},
|
||||
{"create", 0, 0, 0},
|
||||
{"file", 1, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
printf ("option %s", long_options[option_index].name);
|
||||
if (optarg)
|
||||
printf (" with arg %s", optarg);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
printf ("option d with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
|
@ -0,0 +1,226 @@
|
|||
/* Declarations for getopt.
|
||||
Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005,2006,2007
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
|
||||
#ifndef __need_getopt
|
||||
# define _GETOPT_H 1
|
||||
#endif
|
||||
|
||||
/* Standalone applications should #define __GETOPT_PREFIX to an
|
||||
identifier that prefixes the external functions and variables
|
||||
defined in this header. When this happens, include the
|
||||
headers that might declare getopt so that they will not cause
|
||||
confusion if included after this file. Then systematically rename
|
||||
identifiers so that they do not collide with the system functions
|
||||
and variables. Renaming avoids problems with some compilers and
|
||||
linkers. */
|
||||
#if defined __GETOPT_PREFIX && !defined __need_getopt
|
||||
# include <stdlib.h>
|
||||
# include <stdio.h>
|
||||
# include <unistd.h>
|
||||
# undef __need_getopt
|
||||
# undef getopt
|
||||
# undef getopt_long
|
||||
# undef getopt_long_only
|
||||
# undef optarg
|
||||
# undef opterr
|
||||
# undef optind
|
||||
# undef optopt
|
||||
# define __GETOPT_CONCAT(x, y) x ## y
|
||||
# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
|
||||
# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
|
||||
# define getopt __GETOPT_ID (getopt)
|
||||
# define getopt_long __GETOPT_ID (getopt_long)
|
||||
# define getopt_long_only __GETOPT_ID (getopt_long_only)
|
||||
# define optarg __GETOPT_ID (optarg)
|
||||
# define opterr __GETOPT_ID (opterr)
|
||||
# define optind __GETOPT_ID (optind)
|
||||
# define optopt __GETOPT_ID (optopt)
|
||||
#endif
|
||||
|
||||
/* Standalone applications get correct prototypes for getopt_long and
|
||||
getopt_long_only; they declare "char **argv". libc uses prototypes
|
||||
with "char *const *argv" that are incorrect because getopt_long and
|
||||
getopt_long_only can permute argv; this is required for backward
|
||||
compatibility (e.g., for LSB 2.0.1).
|
||||
|
||||
This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
|
||||
but it caused redefinition warnings if both unistd.h and getopt.h were
|
||||
included, since unistd.h includes getopt.h having previously defined
|
||||
__need_getopt.
|
||||
|
||||
The only place where __getopt_argv_const is used is in definitions
|
||||
of getopt_long and getopt_long_only below, but these are visible
|
||||
only if __need_getopt is not defined, so it is quite safe to rewrite
|
||||
the conditional as follows:
|
||||
*/
|
||||
#if !defined __need_getopt
|
||||
# if defined __GETOPT_PREFIX
|
||||
# define __getopt_argv_const /* empty */
|
||||
# else
|
||||
# define __getopt_argv_const const
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* If __GNU_LIBRARY__ is not already defined, either we are being used
|
||||
standalone, or this is the first header included in the source file.
|
||||
If we are being used with glibc, we need to include <features.h>, but
|
||||
that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
|
||||
not defined, include <ctype.h>, which will pull in <features.h> for us
|
||||
if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
|
||||
doesn't flood the namespace with stuff the way some other headers do.) */
|
||||
#if !defined __GNU_LIBRARY__
|
||||
# include <ctype.h>
|
||||
#endif
|
||||
|
||||
#ifndef __THROW
|
||||
# ifndef __GNUC_PREREQ
|
||||
# define __GNUC_PREREQ(maj, min) (0)
|
||||
# endif
|
||||
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||
# define __THROW throw ()
|
||||
# else
|
||||
# define __THROW
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
#ifndef __need_getopt
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
const char *name;
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
# define no_argument 0
|
||||
# define required_argument 1
|
||||
# define optional_argument 2
|
||||
#endif /* need getopt */
|
||||
|
||||
|
||||
/* Get definitions and prototypes for functions to process the
|
||||
arguments in ARGV (ARGC of them, minus the program name) for
|
||||
options given in OPTS.
|
||||
|
||||
Return the option character from OPTS just read. Return -1 when
|
||||
there are no more options. For unrecognized options, or options
|
||||
missing arguments, `optopt' is set to the option letter, and '?' is
|
||||
returned.
|
||||
|
||||
The OPTS string is a list of characters which are recognized option
|
||||
letters, optionally followed by colons, specifying that that letter
|
||||
takes an argument, to be placed in `optarg'.
|
||||
|
||||
If a letter in OPTS is followed by two colons, its argument is
|
||||
optional. This behavior is specific to the GNU `getopt'.
|
||||
|
||||
The argument `--' causes premature termination of argument
|
||||
scanning, explicitly telling `getopt' that there are no more
|
||||
options.
|
||||
|
||||
If OPTS begins with `-', then non-option arguments are treated as
|
||||
arguments to the option '\1'. This behavior is specific to the GNU
|
||||
`getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in
|
||||
the environment, then do not permute arguments. */
|
||||
|
||||
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
||||
__THROW;
|
||||
|
||||
#ifndef __need_getopt
|
||||
extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts, int *__longind)
|
||||
__THROW;
|
||||
extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts, int *__longind)
|
||||
__THROW;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Make sure we later can get all the definitions and declarations. */
|
||||
#undef __need_getopt
|
||||
|
||||
#endif /* getopt.h */
|
|
@ -0,0 +1,131 @@
|
|||
/* Internal declarations for getopt.
|
||||
Copyright (C) 1989-1994,1996-1999,2001,2003,2004
|
||||
Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef _GETOPT_INT_H
|
||||
#define _GETOPT_INT_H 1
|
||||
|
||||
extern int _getopt_internal (int ___argc, char **___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts, int *__longind,
|
||||
int __long_only, int __posixly_correct);
|
||||
|
||||
|
||||
/* Reentrant versions which can handle parsing multiple argument
|
||||
vectors at the same time. */
|
||||
|
||||
/* Data type for reentrant functions. */
|
||||
struct _getopt_data
|
||||
{
|
||||
/* These have exactly the same meaning as the corresponding global
|
||||
variables, except that they are used for the reentrant
|
||||
versions of getopt. */
|
||||
int optind;
|
||||
int opterr;
|
||||
int optopt;
|
||||
char *optarg;
|
||||
|
||||
/* Internal members. */
|
||||
|
||||
/* True if the internal members have been initialized. */
|
||||
int __initialized;
|
||||
|
||||
/* The next char to be scanned in the option-element
|
||||
in which the last option character we returned was found.
|
||||
This allows us to pick up the scan where we left off.
|
||||
|
||||
If this is zero, or a null string, it means resume the scan
|
||||
by advancing to the next ARGV-element. */
|
||||
char *__nextchar;
|
||||
|
||||
/* Describe how to deal with options that follow non-option ARGV-elements.
|
||||
|
||||
If the caller did not specify anything,
|
||||
the default is REQUIRE_ORDER if the environment variable
|
||||
POSIXLY_CORRECT is defined, PERMUTE otherwise.
|
||||
|
||||
REQUIRE_ORDER means don't recognize them as options;
|
||||
stop option processing when the first non-option is seen.
|
||||
This is what Unix does.
|
||||
This mode of operation is selected by either setting the environment
|
||||
variable POSIXLY_CORRECT, or using `+' as the first character
|
||||
of the list of option characters, or by calling getopt.
|
||||
|
||||
PERMUTE is the default. We permute the contents of ARGV as we
|
||||
scan, so that eventually all the non-options are at the end.
|
||||
This allows options to be given in any order, even with programs
|
||||
that were not written to expect this.
|
||||
|
||||
RETURN_IN_ORDER is an option available to programs that were
|
||||
written to expect options and other ARGV-elements in any order
|
||||
and that care about the ordering of the two. We describe each
|
||||
non-option ARGV-element as if it were the argument of an option
|
||||
with character code 1. Using `-' as the first character of the
|
||||
list of option characters selects this mode of operation.
|
||||
|
||||
The special argument `--' forces an end of option-scanning regardless
|
||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
||||
|
||||
enum
|
||||
{
|
||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||
} __ordering;
|
||||
|
||||
/* If the POSIXLY_CORRECT environment variable is set
|
||||
or getopt was called. */
|
||||
int __posixly_correct;
|
||||
|
||||
|
||||
/* Handle permutation of arguments. */
|
||||
|
||||
/* Describe the part of ARGV that contains non-options that have
|
||||
been skipped. `first_nonopt' is the index in ARGV of the first
|
||||
of them; `last_nonopt' is the index after the last of them. */
|
||||
|
||||
int __first_nonopt;
|
||||
int __last_nonopt;
|
||||
|
||||
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||
int __nonoption_flags_max_len;
|
||||
int __nonoption_flags_len;
|
||||
# endif
|
||||
};
|
||||
|
||||
/* The initializer is necessary to set OPTIND and OPTERR to their
|
||||
default values and to clear the initialization flag. */
|
||||
#define _GETOPT_DATA_INITIALIZER { 1, 1 }
|
||||
|
||||
extern int _getopt_internal_r (int ___argc, char **___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts, int *__longind,
|
||||
int __long_only, int __posixly_correct,
|
||||
struct _getopt_data *__data);
|
||||
|
||||
extern int _getopt_long_r (int ___argc, char **___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts, int *__longind,
|
||||
struct _getopt_data *__data);
|
||||
|
||||
extern int _getopt_long_only_r (int ___argc, char **___argv,
|
||||
const char *__shortopts,
|
||||
const struct option *__longopts,
|
||||
int *__longind,
|
||||
struct _getopt_data *__data);
|
||||
|
||||
#endif /* getopt_int.h */
|
|
@ -0,0 +1,240 @@
|
|||
/* Convenience header for conditional use of GNU <libintl.h>.
|
||||
Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU Library General Public License as published
|
||||
by the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
USA. */
|
||||
|
||||
#ifndef _LIBGETTEXT_H
|
||||
#define _LIBGETTEXT_H 1
|
||||
|
||||
/* NLS can be disabled through the configure --disable-nls option.
|
||||
*
|
||||
* Extra hack in LZMA Utils: if DISABLE_NLS is defined, NLS is disabled
|
||||
* even if ENABLE_NLS is true. See Makefile.am for more information.
|
||||
*/
|
||||
#if ENABLE_NLS && !defined(DISABLE_NLS)
|
||||
|
||||
/* Get declarations of GNU message catalog functions. */
|
||||
# include <libintl.h>
|
||||
|
||||
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
|
||||
the gettext() and ngettext() macros. This is an alternative to calling
|
||||
textdomain(), and is useful for libraries. */
|
||||
# ifdef DEFAULT_TEXT_DOMAIN
|
||||
# undef gettext
|
||||
# define gettext(Msgid) \
|
||||
dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
|
||||
# undef ngettext
|
||||
# define ngettext(Msgid1, Msgid2, N) \
|
||||
dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
|
||||
# endif
|
||||
|
||||
#else
|
||||
|
||||
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
|
||||
chokes if dcgettext is defined as a macro. So include it now, to make
|
||||
later inclusions of <locale.h> a NOP. We don't include <libintl.h>
|
||||
as well because people using "gettext.h" will not include <libintl.h>,
|
||||
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
|
||||
is OK. */
|
||||
#if defined(__sun)
|
||||
# include <locale.h>
|
||||
#endif
|
||||
|
||||
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
|
||||
<libintl.h>, which chokes if dcgettext is defined as a macro. So include
|
||||
it now, to make later inclusions of <libintl.h> a NOP. */
|
||||
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
||||
# include <cstdlib>
|
||||
# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Disabled NLS.
|
||||
The casts to 'const char *' serve the purpose of producing warnings
|
||||
for invalid uses of the value returned from these functions.
|
||||
On pre-ANSI systems without 'const', the config.h file is supposed to
|
||||
contain "#define const". */
|
||||
# define gettext(Msgid) ((const char *) (Msgid))
|
||||
# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
|
||||
# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
|
||||
# define ngettext(Msgid1, Msgid2, N) \
|
||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||
# define dngettext(Domainname, Msgid1, Msgid2, N) \
|
||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
|
||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||
# define textdomain(Domainname) ((const char *) (Domainname))
|
||||
# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
|
||||
# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
|
||||
|
||||
#endif
|
||||
|
||||
/* A pseudo function call that serves as a marker for the automated
|
||||
extraction of messages, but does not call gettext(). The run-time
|
||||
translation is done at a different place in the code.
|
||||
The argument, String, should be a literal string. Concatenated strings
|
||||
and other string expressions won't work.
|
||||
The macro's expansion is not parenthesized, so that it is suitable as
|
||||
initializer for static 'char[]' or 'const char[]' variables. */
|
||||
#define gettext_noop(String) String
|
||||
|
||||
/* The separator between msgctxt and msgid in a .mo file. */
|
||||
#define GETTEXT_CONTEXT_GLUE "\004"
|
||||
|
||||
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
|
||||
MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
|
||||
short and rarely need to change.
|
||||
The letter 'p' stands for 'particular' or 'special'. */
|
||||
#ifdef DEFAULT_TEXT_DOMAIN
|
||||
# define pgettext(Msgctxt, Msgid) \
|
||||
pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#else
|
||||
# define pgettext(Msgctxt, Msgid) \
|
||||
pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#endif
|
||||
#define dpgettext(Domainname, Msgctxt, Msgid) \
|
||||
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
|
||||
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
|
||||
#ifdef DEFAULT_TEXT_DOMAIN
|
||||
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#else
|
||||
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#endif
|
||||
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
|
||||
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
|
||||
|
||||
static inline const char *
|
||||
pgettext_aux (const char *domain,
|
||||
const char *msg_ctxt_id, const char *msgid,
|
||||
int category)
|
||||
{
|
||||
const char *translation = dcgettext (domain, msg_ctxt_id, category);
|
||||
if (translation == msg_ctxt_id)
|
||||
return msgid;
|
||||
else
|
||||
return translation;
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
npgettext_aux (const char *domain,
|
||||
const char *msg_ctxt_id, const char *msgid,
|
||||
const char *msgid_plural, unsigned long int n,
|
||||
int category)
|
||||
{
|
||||
const char *translation =
|
||||
dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||
if (translation == msg_ctxt_id || translation == msgid_plural)
|
||||
return (n == 1 ? msgid : msgid_plural);
|
||||
else
|
||||
return translation;
|
||||
}
|
||||
|
||||
/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
|
||||
can be arbitrary expressions. But for string literals these macros are
|
||||
less efficient than those above. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
|
||||
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#define pgettext_expr(Msgctxt, Msgid) \
|
||||
dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
|
||||
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
|
||||
dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
|
||||
|
||||
static inline const char *
|
||||
dcpgettext_expr (const char *domain,
|
||||
const char *msgctxt, const char *msgid,
|
||||
int category)
|
||||
{
|
||||
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||
size_t msgid_len = strlen (msgid) + 1;
|
||||
const char *translation;
|
||||
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||
#else
|
||||
char buf[1024];
|
||||
char *msg_ctxt_id =
|
||||
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||
? buf
|
||||
: (char *) malloc (msgctxt_len + msgid_len));
|
||||
if (msg_ctxt_id != NULL)
|
||||
#endif
|
||||
{
|
||||
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||
translation = dcgettext (domain, msg_ctxt_id, category);
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
if (msg_ctxt_id != buf)
|
||||
free (msg_ctxt_id);
|
||||
#endif
|
||||
if (translation != msg_ctxt_id)
|
||||
return translation;
|
||||
}
|
||||
return msgid;
|
||||
}
|
||||
|
||||
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
|
||||
dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||
dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||
|
||||
static inline const char *
|
||||
dcnpgettext_expr (const char *domain,
|
||||
const char *msgctxt, const char *msgid,
|
||||
const char *msgid_plural, unsigned long int n,
|
||||
int category)
|
||||
{
|
||||
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||
size_t msgid_len = strlen (msgid) + 1;
|
||||
const char *translation;
|
||||
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||
#else
|
||||
char buf[1024];
|
||||
char *msg_ctxt_id =
|
||||
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||
? buf
|
||||
: (char *) malloc (msgctxt_len + msgid_len));
|
||||
if (msg_ctxt_id != NULL)
|
||||
#endif
|
||||
{
|
||||
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||
translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||
if (msg_ctxt_id != buf)
|
||||
free (msg_ctxt_id);
|
||||
#endif
|
||||
if (!(translation == msg_ctxt_id || translation == msgid_plural))
|
||||
return translation;
|
||||
}
|
||||
return (n == 1 ? msgid : msgid_plural);
|
||||
}
|
||||
|
||||
#endif /* _LIBGETTEXT_H */
|
|
@ -0,0 +1,279 @@
|
|||
##### http://autoconf-archive.cryp.to/acx_pthread.html
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro figures out how to build C programs using POSIX threads.
|
||||
# It sets the PTHREAD_LIBS output variable to the threads library and
|
||||
# linker flags, and the PTHREAD_CFLAGS output variable to any special
|
||||
# C compiler flags that are needed. (The user can also force certain
|
||||
# compiler flags/libs to be tested by setting these environment
|
||||
# variables.)
|
||||
#
|
||||
# Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||
# multi-threaded programs (defaults to the value of CC otherwise).
|
||||
# (This is necessary on AIX to use the special cc_r compiler alias.)
|
||||
#
|
||||
# NOTE: You are assumed to not only compile your program with these
|
||||
# flags, but also link it with them as well. e.g. you should link
|
||||
# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
||||
# $LIBS
|
||||
#
|
||||
# If you are only building threads programs, you may wish to use
|
||||
# these variables in your default LIBS, CFLAGS, and CC:
|
||||
#
|
||||
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
# CC="$PTHREAD_CC"
|
||||
#
|
||||
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
||||
# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
||||
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||
#
|
||||
# ACTION-IF-FOUND is a list of shell commands to run if a threads
|
||||
# library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
||||
# run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
||||
# default action will define HAVE_PTHREAD.
|
||||
#
|
||||
# Please let the authors know if this macro fails on any platform, or
|
||||
# if you have any other suggestions or comments. This macro was based
|
||||
# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
|
||||
# (with help from M. Frigo), as well as ac_pthread and hb_pthread
|
||||
# macros posted by Alejandro Forero Cuervo to the autoconf macro
|
||||
# repository. We are also grateful for the helpful feedback of
|
||||
# numerous users.
|
||||
#
|
||||
# LAST MODIFICATION
|
||||
#
|
||||
# 2007-07-29
|
||||
#
|
||||
# COPYLEFT
|
||||
#
|
||||
# Copyright (c) 2007 Steven G. Johnson <stevenj@alum.mit.edu>
|
||||
#
|
||||
# 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 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
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright
|
||||
# owner gives unlimited permission to copy, distribute and modify the
|
||||
# configure scripts that are the output of Autoconf when processing
|
||||
# the Macro. You need not follow the terms of the GNU General Public
|
||||
# License when using or distributing such scripts, even though
|
||||
# portions of the text of the Macro appear in them. The GNU General
|
||||
# Public License (GPL) does govern all other use of the material that
|
||||
# constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the
|
||||
# Autoconf Macro released by the Autoconf Macro Archive. When you
|
||||
# make and distribute a modified version of the Autoconf Macro, you
|
||||
# may extend this special exception to the GPL to apply to your
|
||||
# modified version as well.
|
||||
|
||||
AC_DEFUN([ACX_PTHREAD], [
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_C
|
||||
acx_pthread_ok=no
|
||||
|
||||
# We used to check for pthread.h first, but this fails if pthread.h
|
||||
# requires special compiler flags (e.g. on True64 or Sequent).
|
||||
# It gets checked for in the link test anyway.
|
||||
|
||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||
# etcetera environment variables, and if threads linking works using
|
||||
# them:
|
||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
save_LIBS="$LIBS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
||||
AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
|
||||
AC_MSG_RESULT($acx_pthread_ok)
|
||||
if test x"$acx_pthread_ok" = xno; then
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
fi
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
fi
|
||||
|
||||
# We must check for the threads library under a number of different
|
||||
# names; the ordering is very important because some systems
|
||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
||||
# libraries is broken (non-POSIX).
|
||||
|
||||
# Create a list of thread flags to try. Items starting with a "-" are
|
||||
# C compiler flags, and other items are library names, except for "none"
|
||||
# which indicates that we try without any flags at all, and "pthread-config"
|
||||
# which is a program returning the flags for the Pth emulation library.
|
||||
|
||||
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||
|
||||
# The ordering *is* (sometimes) important. Some notes on the
|
||||
# individual items follow:
|
||||
|
||||
# pthreads: AIX (must check this before -lpthread)
|
||||
# none: in case threads are in libc; should be tried before -Kthread and
|
||||
# other compiler flags to prevent continual compiler warnings
|
||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
||||
# -pthreads: Solaris/gcc
|
||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||
# doesn't hurt to check since this sometimes defines pthreads too;
|
||||
# also defines -D_REENTRANT)
|
||||
# ... -mt is also the pthreads flag for HP/aCC
|
||||
# pthread: Linux, etcetera
|
||||
# --thread-safe: KAI C++
|
||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||
|
||||
case "${host_cpu}-${host_os}" in
|
||||
*solaris*)
|
||||
|
||||
# On Solaris (at least, for some versions), libc contains stubbed
|
||||
# (non-functional) versions of the pthreads routines, so link-based
|
||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
||||
# a function called by this macro, so we could check for that, but
|
||||
# who knows whether they'll stub that too in a future libc.) So,
|
||||
# we'll just look for -pthreads and -lpthread first:
|
||||
|
||||
acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test x"$acx_pthread_ok" = xno; then
|
||||
for flag in $acx_pthread_flags; do
|
||||
|
||||
case $flag in
|
||||
none)
|
||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||
;;
|
||||
|
||||
-*)
|
||||
AC_MSG_CHECKING([whether pthreads work with $flag])
|
||||
PTHREAD_CFLAGS="$flag"
|
||||
;;
|
||||
|
||||
pthread-config)
|
||||
AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
|
||||
if test x"$acx_pthread_config" = xno; then continue; fi
|
||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
||||
PTHREAD_LIBS="-l$flag"
|
||||
;;
|
||||
esac
|
||||
|
||||
save_LIBS="$LIBS"
|
||||
save_CFLAGS="$CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
|
||||
# Check for various functions. We must include pthread.h,
|
||||
# since some functions may be macros. (On the Sequent, we
|
||||
# need a special flag -Kthread to make this header compile.)
|
||||
# We check for pthread_join because it is in -lpthread on IRIX
|
||||
# while pthread_create is in libc. We check for pthread_attr_init
|
||||
# due to DEC craziness with -lpthreads. We check for
|
||||
# pthread_cleanup_push because it is one of the few pthread
|
||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||
# We try pthread_create on general principles.
|
||||
AC_TRY_LINK([#include <pthread.h>],
|
||||
[pthread_t th; pthread_join(th, 0);
|
||||
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
||||
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
||||
[acx_pthread_ok=yes])
|
||||
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
|
||||
AC_MSG_RESULT($acx_pthread_ok)
|
||||
if test "x$acx_pthread_ok" = xyes; then
|
||||
break;
|
||||
fi
|
||||
|
||||
PTHREAD_LIBS=""
|
||||
PTHREAD_CFLAGS=""
|
||||
done
|
||||
fi
|
||||
|
||||
# Various other checks:
|
||||
if test "x$acx_pthread_ok" = xyes; then
|
||||
save_LIBS="$LIBS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
save_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||
|
||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||
AC_MSG_CHECKING([for joinable pthread attribute])
|
||||
attr_name=unknown
|
||||
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||
AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
|
||||
[attr_name=$attr; break])
|
||||
done
|
||||
AC_MSG_RESULT($attr_name)
|
||||
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
||||
AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
|
||||
[Define to necessary symbol if this constant
|
||||
uses a non-standard name on your system.])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
||||
flag=no
|
||||
case "${host_cpu}-${host_os}" in
|
||||
*-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
|
||||
*solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
|
||||
esac
|
||||
AC_MSG_RESULT(${flag})
|
||||
if test "x$flag" != xno; then
|
||||
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
||||
fi
|
||||
|
||||
LIBS="$save_LIBS"
|
||||
CFLAGS="$save_CFLAGS"
|
||||
|
||||
# More AIX lossage: must compile with xlc_r or cc_r
|
||||
if test x"$GCC" != xyes; then
|
||||
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
|
||||
else
|
||||
PTHREAD_CC=$CC
|
||||
fi
|
||||
else
|
||||
PTHREAD_CC="$CC"
|
||||
fi
|
||||
|
||||
AC_SUBST(PTHREAD_LIBS)
|
||||
AC_SUBST(PTHREAD_CFLAGS)
|
||||
AC_SUBST(PTHREAD_CC)
|
||||
|
||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||
if test x"$acx_pthread_ok" = xyes; then
|
||||
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
|
||||
:
|
||||
else
|
||||
acx_pthread_ok=no
|
||||
$2
|
||||
fi
|
||||
AC_LANG_RESTORE
|
||||
])dnl ACX_PTHREAD
|
|
@ -0,0 +1,83 @@
|
|||
# getopt.m4 serial 13
|
||||
dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# The getopt module assume you want GNU getopt, with getopt_long etc,
|
||||
# rather than vanilla POSIX getopt. This means your code should
|
||||
# always include <getopt.h> for the getopt prototypes.
|
||||
|
||||
AC_DEFUN([gl_GETOPT_SUBSTITUTE],
|
||||
[
|
||||
AC_LIBOBJ([getopt])
|
||||
AC_LIBOBJ([getopt1])
|
||||
gl_GETOPT_SUBSTITUTE_HEADER
|
||||
gl_PREREQ_GETOPT
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
|
||||
[
|
||||
GETOPT_H=getopt.h
|
||||
AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
|
||||
[Define to rpl_ if the getopt replacement functions and variables
|
||||
should be used.])
|
||||
AC_SUBST([GETOPT_H])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
||||
[
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h])
|
||||
fi
|
||||
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h])
|
||||
fi
|
||||
|
||||
dnl BSD getopt_long uses an incompatible method to reset option processing,
|
||||
dnl and (as of 2004-10-15) mishandles optional option-arguments.
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>])
|
||||
fi
|
||||
|
||||
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||
dnl option string (as of 2005-05-05).
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt],
|
||||
[AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([#include <getopt.h>],
|
||||
[[
|
||||
char *myargv[3];
|
||||
myargv[0] = "conftest";
|
||||
myargv[1] = "-+";
|
||||
myargv[2] = 0;
|
||||
return getopt (2, myargv, "+a") != '?';
|
||||
]])],
|
||||
[gl_cv_func_gnu_getopt=yes],
|
||||
[gl_cv_func_gnu_getopt=no],
|
||||
[dnl cross compiling - pessimistically guess based on decls
|
||||
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||
dnl option string (as of 2005-05-05).
|
||||
AC_CHECK_DECL([getopt_clip],
|
||||
[gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes],
|
||||
[#include <getopt.h>])])])
|
||||
if test "$gl_cv_func_gnu_getopt" = "no"; then
|
||||
GETOPT_H=getopt.h
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT_IFELSE],
|
||||
[
|
||||
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
||||
AS_IF([test -n "$GETOPT_H"], [$1], [$2])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])])
|
||||
|
||||
# Prerequisites of lib/getopt*.
|
||||
AC_DEFUN([gl_PREREQ_GETOPT],
|
||||
[
|
||||
AC_CHECK_DECLS_ONCE([getenv])
|
||||
])
|
|
@ -0,0 +1 @@
|
|||
fi
|
|
@ -0,0 +1,46 @@
|
|||
# Makefile variables for PO directory in any package using GNU gettext.
|
||||
|
||||
# Usually the message domain is the same as the package name.
|
||||
DOMAIN = $(PACKAGE)
|
||||
|
||||
# These two variables depend on the location of this directory.
|
||||
subdir = po
|
||||
top_builddir = ..
|
||||
|
||||
# These options get passed to xgettext.
|
||||
XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
|
||||
|
||||
# This is the copyright holder that gets inserted into the header of the
|
||||
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
|
||||
# package. (Note that the msgstr strings, extracted from the package's
|
||||
# sources, belong to the copyright holder of the package.) Translators are
|
||||
# expected to transfer the copyright for their translations to this person
|
||||
# or entity, or to disclaim their copyright. The empty string stands for
|
||||
# the public domain; in this case the translators are expected to disclaim
|
||||
# their copyright.
|
||||
COPYRIGHT_HOLDER =
|
||||
|
||||
# This is the email address or URL to which the translators shall report
|
||||
# bugs in the untranslated strings:
|
||||
# - Strings which are not entire sentences, see the maintainer guidelines
|
||||
# in the GNU gettext documentation, section 'Preparing Strings'.
|
||||
# - Strings which use unclear terms or require additional context to be
|
||||
# understood.
|
||||
# - Strings which make invalid assumptions about notation of date, time or
|
||||
# money.
|
||||
# - Pluralisation problems.
|
||||
# - Incorrect English spelling.
|
||||
# - Incorrect formatting.
|
||||
# It can be your email address, or a mailing list address where translators
|
||||
# can write to without being subscribed, or the URL of a web page through
|
||||
# which the translators can contact you.
|
||||
MSGID_BUGS_ADDRESS =
|
||||
|
||||
# This is the list of locale categories, beyond LC_MESSAGES, for which the
|
||||
# message catalogs shall be used. It is usually empty.
|
||||
EXTRA_LOCALE_CATEGORIES =
|
||||
|
||||
# Although you may need slightly wider terminal than 80 chars, it is
|
||||
# much nicer to edit the output of --help when this is set.
|
||||
XGETTEXT_OPTIONS += --no-wrap
|
||||
MSGMERGE += --no-wrap
|
|
@ -0,0 +1,13 @@
|
|||
# List of source files which contain translatable strings.
|
||||
src/lzma/help.c
|
||||
src/lzma/alloc.c
|
||||
src/lzma/args.c
|
||||
src/lzma/error.c
|
||||
src/lzma/io.c
|
||||
src/lzma/list.c
|
||||
src/lzma/main.c
|
||||
src/lzma/options.c
|
||||
src/lzma/process.c
|
||||
src/lzma/suffix.c
|
||||
src/lzma/util.c
|
||||
lib/getopt.c
|
|
@ -0,0 +1,445 @@
|
|||
# translation of fi.po to Finnish
|
||||
# This file is put in the public domain.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: fi\n"
|
||||
"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
|
||||
"POT-Creation-Date: 2007-12-01 18:36+0200\n"
|
||||
"PO-Revision-Date: 2007-08-09 22:14+0300\n"
|
||||
"Last-Translator: Lasse Collin <lasse.collin@tukaani.org>\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/lzma/help.c:28
|
||||
#, c-format
|
||||
msgid "Try `%s --help' for more information."
|
||||
msgstr "Lisätietoja saa komennolla \"%s --help\"."
|
||||
|
||||
#: src/lzma/help.c:36
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage: %s [OPTION]... [FILE]...\n"
|
||||
"Compress or decompress FILEs in the .lzma format.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Käyttö: %s [VALITSIN]... [TIEDOSTO]...\n"
|
||||
"Pakkaa tai purkaa .lzma-muotoiset TIEDOSTOt\n"
|
||||
"\n"
|
||||
|
||||
#: src/lzma/help.c:40
|
||||
msgid "Mandatory arguments to long options are mandatory for short options too.\n"
|
||||
msgstr "Pitkien valitsinten pakolliset argumentit ovat pakollisia myös lyhyille.\n"
|
||||
|
||||
#: src/lzma/help.c:44
|
||||
msgid ""
|
||||
" Operation mode:\n"
|
||||
"\n"
|
||||
" -z, --compress force compression\n"
|
||||
" -d, --decompress force decompression\n"
|
||||
" -t, --test test compressed file integrity\n"
|
||||
" -l, --list list block sizes, total sizes, and possible metadata\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:53
|
||||
msgid ""
|
||||
" Operation modifiers:\n"
|
||||
"\n"
|
||||
" -k, --keep keep (don't delete) input files\n"
|
||||
" -f, --force force overwrite of output file and (de)compress links\n"
|
||||
" -c, --stdout write to standard output and don't delete input files\n"
|
||||
" -S, --suffix=.SUF use suffix `.SUF' on compressed files instead of `.lzma'\n"
|
||||
" -F, --format=FMT file format to encode or decode; possible values are\n"
|
||||
" `auto', `native', `single', `multi', and `alone'\n"
|
||||
" --files=[FILE] read filenames to process from FILE; if FILE is\n"
|
||||
" omitted, filenames are read from the standard input;\n"
|
||||
" filenames must be terminated with the newline character\n"
|
||||
" --files0=[FILE] like --files but use the nul byte as terminator\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:68
|
||||
msgid ""
|
||||
" Compression presets and basic compression options:\n"
|
||||
"\n"
|
||||
" -1 .. -2 fast compression\n"
|
||||
" -3 .. -6 good compression; default is -6 if memory limit allows\n"
|
||||
" -7 .. -9 excellent compression, but needs a lot of memory\n"
|
||||
"\n"
|
||||
" -C, --check=CHECK integrity check type: `crc32', `crc64' (default),\n"
|
||||
" or `sha256'\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:79
|
||||
msgid ""
|
||||
" Custom filter chain for compression (alternative for using presets):\n"
|
||||
"\n"
|
||||
" --lzma=[OPTS] LZMA filter; OPTS is a comma-separated list of zero or\n"
|
||||
" more of the following options (valid values; default):\n"
|
||||
" dict=NUM dictionary size in bytes (1 - 1Gi; 8Mi)\n"
|
||||
" lc=NUM number of literal context bits (0-8; 3)\n"
|
||||
" lp=NUM number of literal position bits (0-4; 0)\n"
|
||||
" pb=NUM number of position bits (0-4; 2)\n"
|
||||
" mode=MODE compression mode (`fast' or `best'; `best')\n"
|
||||
" fb=NUM number of fast bytes (5-273; 128)\n"
|
||||
" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
|
||||
" mfc=NUM match finder cycles; 0=automatic (default)\n"
|
||||
"\n"
|
||||
" --x86 x86 filter (sometimes called BCJ filter)\n"
|
||||
" --powerpc PowerPC (big endian) filter\n"
|
||||
" --ia64 IA64 (Itanium) filter\n"
|
||||
" --arm ARM filter\n"
|
||||
" --armthumb ARM-Thumb filter\n"
|
||||
" --sparc SPARC filter\n"
|
||||
"\n"
|
||||
" --copy No filtering (useful only when specified alone)\n"
|
||||
" --subblock=[OPTS] Subblock filter; valid OPTS (valid values; default):\n"
|
||||
" size=NUM number of bytes of data per subblock\n"
|
||||
" (1 - 256Mi; 4Ki)\n"
|
||||
" rle=NUM run-length encoder chunk size (0-256; 0)\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:119
|
||||
msgid ""
|
||||
" Resource usage options:\n"
|
||||
"\n"
|
||||
" -M, --memory=NUM use roughly NUM bytes of memory at maximum\n"
|
||||
" -T, --threads=NUM use at maximum of NUM (de)compression threads\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:128
|
||||
msgid ""
|
||||
" Other options:\n"
|
||||
"\n"
|
||||
" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
|
||||
" -v, --verbose be verbose; specify twice for even more verbose\n"
|
||||
"\n"
|
||||
" -h, --help display this help and exit\n"
|
||||
" -V, --version display version and license information and exit\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/help.c:136
|
||||
msgid "With no FILE, or when FILE is -, read standard input.\n"
|
||||
msgstr "Jos TIEDOSTOa ei ole annettu, tai se on \"-\", luetaan vakiosyötettä.\n"
|
||||
|
||||
#: src/lzma/help.c:142
|
||||
msgid "On this system and configuration, the tool will use"
|
||||
msgstr "Tässä järjestelmässä näillä asetuksilla, tämä työkalu käyttää"
|
||||
|
||||
#: src/lzma/help.c:143
|
||||
#, c-format
|
||||
msgid " * roughly %zu MiB of memory at maximum; and\n"
|
||||
msgstr " * korkeintaan %zu MiB keskusmuistia (suurpiirteinen rajoitus); ja\n"
|
||||
|
||||
#: src/lzma/help.c:146
|
||||
msgid ""
|
||||
" * at maximum of one thread for (de)compression.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" * korkeintaan yhtä säiettä pakkaukseen tai purkuun.\n"
|
||||
"\n"
|
||||
|
||||
#: src/lzma/help.c:150
|
||||
#, c-format
|
||||
msgid "Report bugs to <%s> (in English or Finnish).\n"
|
||||
msgstr ""
|
||||
"Lähetä raportit ohjelmistovioista (englanniksi tai suomeksi)\n"
|
||||
"osoitteeseen <%s>.\n"
|
||||
|
||||
#: src/lzma/args.c:126
|
||||
msgid "Maximum number of filters is seven"
|
||||
msgstr "Suotimia voi olla korkeintaan seitsemän"
|
||||
|
||||
#: src/lzma/args.c:189
|
||||
#, c-format
|
||||
msgid "%s: Invalid filename suffix"
|
||||
msgstr "%s: Virheellinen tiedostonimen pääte"
|
||||
|
||||
#: src/lzma/args.c:323
|
||||
#, c-format
|
||||
msgid "%s: Unknown file format type"
|
||||
msgstr "%s: Tuntematon tiedostomuodon tyyppi"
|
||||
|
||||
#: src/lzma/args.c:349
|
||||
#, c-format
|
||||
msgid "%s: Unknown integrity check type"
|
||||
msgstr "%s: Tuntematon eheystarkisteen tyyppi"
|
||||
|
||||
#: src/lzma/args.c:367
|
||||
msgid "Only one file can be specified with `--files'or `--files0'."
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/args.c:417
|
||||
msgid "The environment variable LZMA_OPT contains too many arguments"
|
||||
msgstr "Ympäristömuuttuja LZMA_OPT sisältää liian monta argumenttia"
|
||||
|
||||
#: src/lzma/args.c:483
|
||||
msgid "Memory usage limit is too small for any internal filter preset"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/args.c:498
|
||||
msgid "Memory usage limit is too small for the given filter setup"
|
||||
msgstr "Muistinkäyttörajoitus on liian pieni annetuille suodinasetusille"
|
||||
|
||||
#: src/lzma/error.c:35
|
||||
msgid "Operation successful"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/error.c:38
|
||||
msgid "Operation finished successfully"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/error.c:41 src/lzma/error.c:153
|
||||
msgid "Internal error (bug)"
|
||||
msgstr "Sisäinen virhe (bugi)"
|
||||
|
||||
#: src/lzma/error.c:44
|
||||
msgid "Compressed data is corrupt"
|
||||
msgstr "Pakattu data on korruptoitunut"
|
||||
|
||||
#: src/lzma/error.c:50
|
||||
msgid "Unexpected end of input"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/error.c:53
|
||||
msgid "Unsupported options"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/error.c:56
|
||||
msgid "Unsupported integrity check type"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/error.c:87 src/lzma/error.c:93
|
||||
#, c-format
|
||||
msgid "Writing to standard output failed: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/io.c:81
|
||||
#, c-format
|
||||
msgid "Cannot get file descriptor of the current directory: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/io.c:123 src/lzma/util.c:127
|
||||
#, c-format
|
||||
msgid "%s: Invalid filename"
|
||||
msgstr "%s: Virheellinen tiedostonimi"
|
||||
|
||||
#: src/lzma/io.c:130 src/lzma/io.c:233
|
||||
#, c-format
|
||||
msgid "Cannot change directory: %s"
|
||||
msgstr "Hakemiston vaihtaminen epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:135
|
||||
#, c-format
|
||||
msgid "%s: File seems to be moved, not removing"
|
||||
msgstr "%s: Tiedosto näyttää olevan siirretty, ei poisteta"
|
||||
|
||||
#: src/lzma/io.c:141
|
||||
#, c-format
|
||||
msgid "%s: Cannot remove: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/io.c:164
|
||||
#, c-format
|
||||
msgid "%s: Cannot set the file owner: %s"
|
||||
msgstr "%s: Tiedoston omistajuuden asetus epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:170
|
||||
#, c-format
|
||||
msgid "%s: Cannot set the file group: %s"
|
||||
msgstr "%s: Tiedoston ryhmän asetus epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:189
|
||||
#, c-format
|
||||
msgid "%s: Cannot set the file permissions: %s"
|
||||
msgstr "%s: Tiedoston oikeuksien asetus epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:252
|
||||
#, c-format
|
||||
msgid "%s: Cannot open the directory containing the file: %s"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/io.c:313
|
||||
#, c-format
|
||||
msgid "%s: Is a symbolic link, skipping"
|
||||
msgstr "%s: Symbolinen linkki, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:330
|
||||
#, c-format
|
||||
msgid "%s: Is a directory, skipping"
|
||||
msgstr "%s: Hakemisto, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:337 src/lzma/list.c:445
|
||||
#, c-format
|
||||
msgid "%s: Not a regular file, skipping"
|
||||
msgstr "%s: Ei ole tavallinen tiedosto, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:348
|
||||
#, c-format
|
||||
msgid "%s: File has setuid or setgid bit set, skipping"
|
||||
msgstr "%s: Tiedostolla on setuid- tai setgid-bitti asetettuna, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:355
|
||||
#, c-format
|
||||
msgid "%s: File has sticky bit set, skipping"
|
||||
msgstr "%s: Tiedostolla on sticky-bitti asetettuna, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:362
|
||||
#, c-format
|
||||
msgid "%s: Input file has more than one hard link, skipping"
|
||||
msgstr "%s: Tiedostoon viittaa useampi kuin yksi linkki, ohitetaan"
|
||||
|
||||
#: src/lzma/io.c:390 src/lzma/io.c:467
|
||||
#, c-format
|
||||
msgid "%s: Closing the file failed: %s"
|
||||
msgstr "%s: Tiedoston sulkeminen epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:610
|
||||
#, c-format
|
||||
msgid "%s: Read error: %s"
|
||||
msgstr "%s: Lukeminen epäonnistui: %s"
|
||||
|
||||
#: src/lzma/io.c:653
|
||||
#, c-format
|
||||
msgid "%s: Write error: %s"
|
||||
msgstr "%s: Kirjoitus epäonnistui: %s"
|
||||
|
||||
#: src/lzma/list.c:451
|
||||
#, c-format
|
||||
msgid "%s: File is empty"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/main.c:57
|
||||
msgid "Cannot establish signal handlers"
|
||||
msgstr "Signaalikäsittelijöiden asetus epäonnistui"
|
||||
|
||||
#: src/lzma/main.c:75
|
||||
msgid "Compressed data not read from a terminal."
|
||||
msgstr "Pakattua dataa ei lueta päätteeltä."
|
||||
|
||||
#: src/lzma/main.c:77 src/lzma/main.c:92
|
||||
msgid "Use `--force' to force decompression."
|
||||
msgstr "Käytä valitsinta \"--force\" pakottaaksesi purun."
|
||||
|
||||
#: src/lzma/main.c:90
|
||||
msgid "Compressed data not written to a terminal."
|
||||
msgstr "Pakattua dataa ei kirjoiteta päätteelle."
|
||||
|
||||
#: src/lzma/main.c:117
|
||||
#, fuzzy, c-format
|
||||
msgid "%s: Error reading filenames: %s"
|
||||
msgstr "%s: Tiedoston sulkeminen epäonnistui: %s"
|
||||
|
||||
#: src/lzma/main.c:122
|
||||
#, c-format
|
||||
msgid "%s: Unexpected end of input when reading filenames"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/main.c:212
|
||||
msgid "Cannot read data from standard input when reading filenames from standard input"
|
||||
msgstr "Dataa ei voida lukea oletussyötteestä, kun tiedostonimiä luetaan oletussyötteestä"
|
||||
|
||||
#: src/lzma/options.c:83
|
||||
#, c-format
|
||||
msgid "%s: Options must be `name=value' pairs separated with commas"
|
||||
msgstr "%s: Asetusten tulee olla \"nimi=arvo\"-pareja, jotka on eroteltu pilkuilla"
|
||||
|
||||
#: src/lzma/options.c:111
|
||||
#, c-format
|
||||
msgid "%s: Invalid option value"
|
||||
msgstr "%s: Virheellinen asetuksen arvo"
|
||||
|
||||
#: src/lzma/options.c:124
|
||||
#, c-format
|
||||
msgid "%s: Invalid option name"
|
||||
msgstr "%s: Virheellinen asetuksen nimi"
|
||||
|
||||
#: src/lzma/process.c:142
|
||||
#, c-format
|
||||
msgid "Cannot create a thread: %s"
|
||||
msgstr "Säikeen luonti epäonnistui: %s"
|
||||
|
||||
#: src/lzma/suffix.c:85
|
||||
#, c-format
|
||||
msgid "%s: Filename has an unknown suffix, skipping"
|
||||
msgstr "%s: Tiedostonimellä on tuntematon pääte, ohitetaan"
|
||||
|
||||
#: src/lzma/suffix.c:114
|
||||
#, c-format
|
||||
msgid "%s: File already has `%s' suffix, skipping"
|
||||
msgstr "%s: Tiedostolla on jo \"%s\"-pääte, ohitetaan"
|
||||
|
||||
#: src/lzma/util.c:44
|
||||
#, c-format
|
||||
msgid "%s: Value is not a non-negative decimal integer"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/util.c:84
|
||||
#, c-format
|
||||
msgid "%s: Invalid multiplier suffix. Valid suffixes:"
|
||||
msgstr ""
|
||||
|
||||
#: src/lzma/util.c:105
|
||||
#, c-format
|
||||
msgid "Value of the option `%s' must be in the range [%llu, %llu]"
|
||||
msgstr "Asetuksen \"%s\" arvon tulee olla välillä [%llu, %llu]"
|
||||
|
||||
#: src/lzma/util.c:175
|
||||
msgid "Empty filename, skipping"
|
||||
msgstr "Tyhjä tiedostonimi, ohitetaan"
|
||||
|
||||
#: lib/getopt.c:531 lib/getopt.c:547
|
||||
#, c-format
|
||||
msgid "%s: option `%s' is ambiguous\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:580 lib/getopt.c:584
|
||||
#, c-format
|
||||
msgid "%s: option `--%s' doesn't allow an argument\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:593 lib/getopt.c:598
|
||||
#, c-format
|
||||
msgid "%s: option `%c%s' doesn't allow an argument\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:641 lib/getopt.c:660 lib/getopt.c:976 lib/getopt.c:995
|
||||
#, c-format
|
||||
msgid "%s: option `%s' requires an argument\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:698 lib/getopt.c:701
|
||||
#, c-format
|
||||
msgid "%s: unrecognized option `--%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:709 lib/getopt.c:712
|
||||
#, c-format
|
||||
msgid "%s: unrecognized option `%c%s'\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:764 lib/getopt.c:767
|
||||
#, c-format
|
||||
msgid "%s: illegal option -- %c\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:773 lib/getopt.c:776
|
||||
#, c-format
|
||||
msgid "%s: invalid option -- %c\n"
|
||||
msgstr "%s: virheellinen valitsin -- %c\n"
|
||||
|
||||
#: lib/getopt.c:828 lib/getopt.c:844 lib/getopt.c:1048 lib/getopt.c:1066
|
||||
#, c-format
|
||||
msgid "%s: option requires an argument -- %c\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:897 lib/getopt.c:913
|
||||
#, c-format
|
||||
msgid "%s: option `-W %s' is ambiguous\n"
|
||||
msgstr ""
|
||||
|
||||
#: lib/getopt.c:937 lib/getopt.c:955
|
||||
#, c-format
|
||||
msgid "%s: option `-W %s' doesn't allow an argument\n"
|
||||
msgstr ""
|
|
@ -0,0 +1,16 @@
|
|||
##
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
SUBDIRS = liblzma lzma lzmadec scripts
|
||||
EXTRA_DIST = common
|
|
@ -0,0 +1,50 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file open_stdxxx.h
|
||||
/// \brief Make sure that file descriptors 0, 1, and 2 are open
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef OPEN_STDXXX_H
|
||||
#define OPEN_STDXXX_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static void
|
||||
open_stdxxx(int status)
|
||||
{
|
||||
for (int i = 0; i <= 2; ++i) {
|
||||
// We use fcntl() to check if the file descriptor is open.
|
||||
if (fcntl(i, F_GETFD) == -1 && errno == EBADF) {
|
||||
// With stdin, we could use /dev/full so that
|
||||
// writing to stdin would fail. However, /dev/full
|
||||
// is Linux specific, and if the program tries to
|
||||
// write to stdin, there's already a problem anyway.
|
||||
const int fd = open("/dev/null", O_NOCTTY
|
||||
| (i == 0 ? O_WRONLY : O_RDONLY));
|
||||
|
||||
if (fd != i) {
|
||||
// Something went wrong. Exit with the
|
||||
// exit status we were given. Don't try
|
||||
// to print an error message, since stderr
|
||||
// may very well be non-existent. This
|
||||
// error should be extremely rare.
|
||||
(void)close(fd);
|
||||
exit(status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,77 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file physmem.h
|
||||
/// \brief Get the amount of physical memory
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef PHYSMEM_H
|
||||
#define PHYSMEM_H
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_PHYSMEM_SYSCTL) || defined(HAVE_NCPU_SYSCTL)
|
||||
# ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
# ifdef HAVE_SYS_SYSCTL_H
|
||||
# include <sys/sysctl.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/// \brief Get the amount of physical memory in bytes
|
||||
///
|
||||
/// \return Amount of physical memory in bytes. On error, zero is
|
||||
/// returned.
|
||||
static inline uint64_t
|
||||
physmem(void)
|
||||
{
|
||||
uint64_t ret = 0;
|
||||
|
||||
#if defined(HAVE_PHYSMEM_SYSCONF)
|
||||
const long pagesize = sysconf(_SC_PAGESIZE);
|
||||
const long pages = sysconf(_SC_PHYS_PAGES);
|
||||
if (pagesize != -1 || pages != -1)
|
||||
// According to docs, pagesize * pages can overflow.
|
||||
// Simple case is 32-bit box with 4 GiB or more RAM,
|
||||
// which may report exactly 4 GiB of RAM, and "long"
|
||||
// being 32-bit will overflow. Casting to uint64_t
|
||||
// hopefully avoids overflows in the near future.
|
||||
ret = (uint64_t)(pagesize) * (uint64_t)(pages);
|
||||
|
||||
#elif defined(HAVE_PHYSMEM_SYSCTL)
|
||||
int name[2] = { CTL_HW, HW_PHYSMEM };
|
||||
unsigned long mem;
|
||||
size_t mem_ptr_size = sizeof(mem);
|
||||
if (!sysctl(name, 2, &mem, &mem_ptr_size, NULL, NULL)) {
|
||||
// Some systems use unsigned int as the "return value".
|
||||
// This makes a difference on 64-bit boxes.
|
||||
if (mem_ptr_size != sizeof(mem)) {
|
||||
if (mem_ptr_size == sizeof(unsigned int))
|
||||
ret = *(unsigned int *)(&mem);
|
||||
} else {
|
||||
ret = mem;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,100 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file sysdefs.h
|
||||
/// \brief Common includes, definitions, system-specific things etc.
|
||||
///
|
||||
/// This file is used also by the lzma command line tool, that's why this
|
||||
/// file is separate from common.h.
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LZMA_SYSDEFS_H
|
||||
#define LZMA_SYSDEFS_H
|
||||
|
||||
//////////////
|
||||
// Includes //
|
||||
//////////////
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include "lzma.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
# include <stdbool.h>
|
||||
#else
|
||||
# if ! HAVE__BOOL
|
||||
typedef unsigned char _Bool;
|
||||
# endif
|
||||
# define bool _Bool
|
||||
# define false 0
|
||||
# define true 1
|
||||
# define __bool_true_false_are_defined 1
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ASSERT_H
|
||||
# include <assert.h>
|
||||
#else
|
||||
# ifdef NDEBUG
|
||||
# define assert(x)
|
||||
# else
|
||||
// TODO: Pretty bad assert() macro.
|
||||
# define assert(x) (!(x) && abort())
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MEMORY_H
|
||||
# include <memory.h>
|
||||
#endif
|
||||
|
||||
|
||||
////////////
|
||||
// Macros //
|
||||
////////////
|
||||
|
||||
#ifndef HAVE_MEMCPY
|
||||
# define memcpy(dest, src, n) bcopy(src, dest, n)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MEMMOVE
|
||||
# define memmove(dest, src, n) bcopy(src, dest, n)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MEMSET
|
||||
# define memzero(s, n) memset(s, 0, n)
|
||||
#else
|
||||
# define memzero(s, n) bzero(s, n)
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
# define MAX(x, y) ((x) > (y) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,47 @@
|
|||
##
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
SUBDIRS = api common check
|
||||
|
||||
lib_LTLIBRARIES = liblzma.la
|
||||
liblzma_la_SOURCES =
|
||||
liblzma_la_LDFLAGS = -version-info 0:0:0
|
||||
|
||||
liblzma_la_LIBADD = \
|
||||
common/libcommon.la \
|
||||
check/libcheck.la
|
||||
|
||||
if COND_FILTER_LZMA
|
||||
SUBDIRS += lz lzma rangecoder
|
||||
liblzma_la_LIBADD += \
|
||||
lz/liblz.la \
|
||||
lzma/liblzma4.la \
|
||||
rangecoder/librangecoder.la
|
||||
endif
|
||||
|
||||
if COND_FILTER_SUBBLOCK
|
||||
SUBDIRS += subblock
|
||||
liblzma_la_LIBADD += subblock/libsubblock.la
|
||||
endif
|
||||
|
||||
if COND_MAIN_SIMPLE
|
||||
SUBDIRS += simple
|
||||
liblzma_la_LIBADD += simple/libsimple.la
|
||||
endif
|
||||
|
||||
|
||||
## pkg-config
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = lzma.pc
|
||||
EXTRA_DIST = lzma.pc.in
|
|
@ -0,0 +1,39 @@
|
|||
##
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
nobase_include_HEADERS = \
|
||||
lzma.h \
|
||||
lzma/alignment.h \
|
||||
lzma/alone.h \
|
||||
lzma/auto.h \
|
||||
lzma/base.h \
|
||||
lzma/block.h \
|
||||
lzma/check.h \
|
||||
lzma/copy.h \
|
||||
lzma/delta.h \
|
||||
lzma/extra.h \
|
||||
lzma/filter.h \
|
||||
lzma/index.h \
|
||||
lzma/info.h \
|
||||
lzma/init.h \
|
||||
lzma/lzma.h \
|
||||
lzma/memlimit.h \
|
||||
lzma/metadata.h \
|
||||
lzma/raw.h \
|
||||
lzma/simple.h \
|
||||
lzma/stream.h \
|
||||
lzma/stream_flags.h \
|
||||
lzma/subblock.h \
|
||||
lzma/version.h \
|
||||
lzma/vli.h
|
|
@ -0,0 +1,122 @@
|
|||
/**
|
||||
* \file lzma.h
|
||||
* \brief The public API of liblzma
|
||||
*
|
||||
* liblzma is a LZMA compression library with a zlib-like API.
|
||||
* liblzma is based on LZMA SDK found from http://7-zip.org/sdk.html.
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H
|
||||
#define LZMA_H
|
||||
|
||||
/********************
|
||||
* External headers *
|
||||
********************/
|
||||
|
||||
/* size_t */
|
||||
#include <sys/types.h>
|
||||
|
||||
/* NULL */
|
||||
#include <stddef.h>
|
||||
|
||||
/* uint8_t, uint32_t, uint64_t, UINT32_C, UINT64_C, UINT64_MAX. */
|
||||
#include <inttypes.h>
|
||||
|
||||
|
||||
/******************
|
||||
* GCC extensions *
|
||||
******************/
|
||||
|
||||
/*
|
||||
* GCC extensions are used conditionally in the public API. It doesn't
|
||||
* break anything if these are sometimes enabled and sometimes not, only
|
||||
* affects warnings and optimizations.
|
||||
*/
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3
|
||||
# ifndef lzma_attribute
|
||||
# define lzma_attribute(attr) __attribute__(attr)
|
||||
# endif
|
||||
# ifndef lzma_restrict
|
||||
# define lzma_restrict __restrict__
|
||||
# endif
|
||||
#else
|
||||
# ifndef lzma_attribute
|
||||
# define lzma_attribute(attr)
|
||||
# endif
|
||||
# ifndef lzma_restrict
|
||||
# define lzma_restrict
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/**************
|
||||
* Subheaders *
|
||||
**************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Subheaders check that this is defined. It is to prevent including
|
||||
* them directly from applications.
|
||||
*/
|
||||
#define LZMA_H_INTERNAL 1
|
||||
|
||||
/* Basic features */
|
||||
#include "lzma/init.h"
|
||||
#include "lzma/base.h"
|
||||
#include "lzma/vli.h"
|
||||
#include "lzma/filter.h"
|
||||
#include "lzma/check.h"
|
||||
|
||||
/* Filters */
|
||||
#include "lzma/copy.h"
|
||||
#include "lzma/subblock.h"
|
||||
#include "lzma/simple.h"
|
||||
#include "lzma/delta.h"
|
||||
#include "lzma/lzma.h"
|
||||
|
||||
/* Container formats and Metadata */
|
||||
#include "lzma/block.h"
|
||||
#include "lzma/index.h"
|
||||
#include "lzma/extra.h"
|
||||
#include "lzma/metadata.h"
|
||||
#include "lzma/stream.h"
|
||||
#include "lzma/alone.h"
|
||||
#include "lzma/raw.h"
|
||||
#include "lzma/auto.h"
|
||||
|
||||
/* Advanced features */
|
||||
#include "lzma/info.h"
|
||||
#include "lzma/alignment.h"
|
||||
#include "lzma/stream_flags.h"
|
||||
#include "lzma/memlimit.h"
|
||||
|
||||
/* Version number */
|
||||
#include "lzma/version.h"
|
||||
|
||||
/*
|
||||
* All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
|
||||
* re-including the subheaders.
|
||||
*/
|
||||
#undef LZMA_H_INTERNAL
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ifndef LZMA_H */
|
|
@ -0,0 +1,60 @@
|
|||
/**
|
||||
* \file lzma/alignment.h
|
||||
* \brief Calculating input and output alignment of filter chains
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculates the preferred alignment of the input data
|
||||
*
|
||||
* FIXME desc
|
||||
*/
|
||||
extern uint32_t lzma_alignment_input(
|
||||
const lzma_options_filter *filters, uint32_t guess);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculates the alignment of the encoded output
|
||||
*
|
||||
* Knowing the alignment of the output data is useful e.g. in the Block
|
||||
* encoder which tries to align the Compressed Data field optimally.
|
||||
*
|
||||
* \param filters Pointer to lzma_options_filter array, whose last
|
||||
* member must have .id = LZMA_VLI_VALUE_UNKNOWN.
|
||||
* \param guess The value to return if the alignment of the output
|
||||
* is the same as the alignment of the input data.
|
||||
* If you want to always detect this special case,
|
||||
* this guess to zero; this function never returns
|
||||
* zero unless guess is zero.
|
||||
*
|
||||
* \return In most cases, a small positive integer is returned;
|
||||
* for optimal use, the encoded output of this filter
|
||||
* chain should start at on offset that is a multiple of
|
||||
* the returned integer value.
|
||||
*
|
||||
* If the alignment of the output is the same as the input
|
||||
* data (which this function cannot know), \a guess is
|
||||
* returned.
|
||||
*
|
||||
* If an error occurs (that is, unknown Filter IDs or filter
|
||||
* options), UINT32_MAX is returned.
|
||||
*/
|
||||
extern uint32_t lzma_alignment_output(
|
||||
const lzma_options_filter *filters, uint32_t guess);
|
|
@ -0,0 +1,82 @@
|
|||
/**
|
||||
* \file lzma/alone.h
|
||||
* \brief Handling of the legacy LZMA_Alone format
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for files in the LZMA_Alone format
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Uncompressed Size and usage of End of Payload Marker
|
||||
*
|
||||
* In contrast to .lzma Blocks, LZMA_Alone format cannot have both
|
||||
* uncompressed size field in the header and end of payload marker.
|
||||
* If you don't know the uncompressed size beforehand, set it to
|
||||
* LZMA_VLI_VALUE_UNKNOWN and liblzma will embed end of payload
|
||||
* marker.
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief LZMA options
|
||||
*
|
||||
* The LZMA_Alone format supports only one filter: the LZMA filter.
|
||||
*
|
||||
* \note There exists also an undocumented variant of the
|
||||
* LZMA_Alone format, which uses the x86 filter in
|
||||
* addition to LZMA. This format was never supported
|
||||
* by LZMA Utils and is not supported by liblzma either.
|
||||
*/
|
||||
lzma_options_lzma lzma;
|
||||
|
||||
} lzma_options_alone;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes LZMA_Alone encoder
|
||||
*
|
||||
* LZMA_Alone files have the suffix .lzma like the .lzma Stream files.
|
||||
* LZMA_Alone format supports only one filter, the LZMA filter. There is
|
||||
* no support for integrity checks like CRC32.
|
||||
*
|
||||
* Use this format if and only if you need to create files readable by
|
||||
* legacy LZMA tools.
|
||||
*
|
||||
* LZMA_Alone encoder doesn't support LZMA_SYNC_FLUSH or LZMA_FULL_FLUSH.
|
||||
*
|
||||
* \return - LZMA_OK
|
||||
* - LZMA_MEM_ERROR
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_alone_encoder(
|
||||
lzma_stream *strm, const lzma_options_alone *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes decoder for LZMA_Alone file
|
||||
*
|
||||
* The LZMA_Alone decoder supports LZMA_SYNC_FLUSH.
|
||||
*
|
||||
* \return - LZMA_OK
|
||||
* - LZMA_MEM_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_alone_decoder(lzma_stream *strm);
|
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
* \file lzma/auto.h
|
||||
* \brief Decoder with automatic file format detection
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Decode .lzma Streams and LZMA_Alone files with autodetection
|
||||
*
|
||||
* Autodetects between the .lzma Stream and LZMA_Alone formats, and
|
||||
* calls lzma_stream_decoder_init() or lzma_alone_decoder_init() once
|
||||
* the type of the file has been detected.
|
||||
*
|
||||
* \param strm Pointer to propertily prepared lzma_stream
|
||||
* \param header Pointer to hold a pointer to Extra Records read
|
||||
* from the Header Metadata Block. Use NULL if
|
||||
* you don't care about Extra Records.
|
||||
* \param footer Same as header, but for Footer Metadata Block.
|
||||
*
|
||||
* \return - LZMA_OK: Initialization was successful.
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory.
|
||||
*/
|
||||
extern lzma_ret lzma_auto_decoder(lzma_stream *strm,
|
||||
lzma_extra **header, lzma_extra **footer);
|
|
@ -0,0 +1,410 @@
|
|||
/**
|
||||
* \file lzma/base.h
|
||||
* \brief Data types and functions used in many places of the public API
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Boolean
|
||||
*
|
||||
* This is here because C89 doesn't have stdbool.h. To set a value for
|
||||
* variables having type lzma_bool, you can use
|
||||
* - C99's `true' and `false' from stdbool.h;
|
||||
* - C++'s internal `true' and `false'; or
|
||||
* - integers one (true) and zero (false).
|
||||
*/
|
||||
typedef unsigned char lzma_bool;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Return values used by several functions in liblzma
|
||||
*
|
||||
* Check the descriptions of specific functions to find out which return
|
||||
* values they can return and the exact meanings of the values in every
|
||||
* situation. The descriptions given here are only suggestive.
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_OK = 0,
|
||||
/**<
|
||||
* \brief Operation completed successfully
|
||||
*/
|
||||
|
||||
LZMA_STREAM_END = 1,
|
||||
/**<
|
||||
* \brief End of stream was reached
|
||||
*
|
||||
* The application should pick the last remaining output
|
||||
* bytes from strm->next_out.
|
||||
*/
|
||||
|
||||
LZMA_PROG_ERROR = -2,
|
||||
/**<
|
||||
* \brief Programming error
|
||||
*
|
||||
* This indicates that the arguments given to the function are
|
||||
* invalid or the internal state of the decoder is corrupt.
|
||||
* - Function arguments are invalid or the structures
|
||||
* pointed by the argument pointers are invalid
|
||||
* e.g. if strm->next_out has been set to NULL and
|
||||
* strm->avail_out > 0 when calling lzma_code().
|
||||
* - lzma_* functions have been called in wrong order
|
||||
* e.g. lzma_code() was called right after lzma_end().
|
||||
* - If errors occur randomly, the reason might be flaky
|
||||
* hardware.
|
||||
*
|
||||
* If you think that your code is correct, this error code
|
||||
* can be a sign of a bug in liblzma. See the documentation
|
||||
* how to report bugs.
|
||||
*/
|
||||
|
||||
LZMA_DATA_ERROR = -3,
|
||||
/**<
|
||||
* \brief Data is corrupt
|
||||
*
|
||||
* - Encoder: The input size doesn't match the uncompressed
|
||||
* size given to lzma_*_encoder_init().
|
||||
* - Decoder: The input is corrupt. This includes corrupted
|
||||
* header, corrupted compressed data, and unmatching
|
||||
* integrity Check.
|
||||
*
|
||||
* \todo What can be done if encoder returns this?
|
||||
* Probably can continue by fixing the input
|
||||
* amount, but make sure.
|
||||
*/
|
||||
|
||||
LZMA_MEM_ERROR = -4,
|
||||
/**<
|
||||
* \brief Cannot allocate memory
|
||||
*
|
||||
* Memory allocation failed.
|
||||
*/
|
||||
|
||||
LZMA_BUF_ERROR = -5,
|
||||
/**<
|
||||
* \brief No progress is possible
|
||||
*
|
||||
* This may happen when avail_in or avail_out is zero.
|
||||
*
|
||||
* \note This error is not fatal. Coding can continue
|
||||
* normally once the reason for this error has
|
||||
* been fixed.
|
||||
*/
|
||||
|
||||
LZMA_HEADER_ERROR = -6,
|
||||
/**<
|
||||
* \brief Invalid or unsupported header
|
||||
*
|
||||
* Invalid or unsupported options, for example
|
||||
* - unsupported filter(s) or filter options; or
|
||||
* - reserved bits set in headers (decoder only).
|
||||
*
|
||||
* Rebuilding liblzma with more features enabled, or
|
||||
* upgrading to a newer version of liblzma may help.
|
||||
*/
|
||||
|
||||
LZMA_UNSUPPORTED_CHECK = -7,
|
||||
/**<
|
||||
* \brief Check type is unknown
|
||||
*
|
||||
* The type of Check is not supported, and thus the Check
|
||||
* cannot be calculated. In the encoder, this is an error.
|
||||
* In the decoder, this is only a warning and decoding can
|
||||
* still proceed normally (but the Check is ignored).
|
||||
*/
|
||||
} lzma_ret;
|
||||
|
||||
|
||||
/**
|
||||
* \brief The `action' argument for lzma_code()
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_RUN = 0,
|
||||
/**<
|
||||
* Encoder: Encode as much input as possible. Some internal
|
||||
* buffering will probably be done (depends on the filter
|
||||
* chain in use), which causes latency: the input used won't
|
||||
* usually be decodeable from the output of the same
|
||||
* lzma_code() call.
|
||||
*
|
||||
* Decoder: Decode as much input as possible and produce as
|
||||
* much output as possible. This action provides best
|
||||
* throughput, but may introduce latency, because the
|
||||
* decoder may decode more data into its internal buffers
|
||||
* than that fits into next_out.
|
||||
*/
|
||||
|
||||
LZMA_SYNC_FLUSH = 1,
|
||||
/**<
|
||||
* Encoder: Makes all the data given to liblzma via next_in
|
||||
* available in next_out without resetting the filters. Call
|
||||
* lzma_code() with LZMA_SYNC_FLUSH until it returns
|
||||
* LZMA_STREAM_END. Then continue encoding normally.
|
||||
*
|
||||
* \note Synchronous flushing is supported only by
|
||||
* some filters. Some filters support it only
|
||||
* partially.
|
||||
*
|
||||
* Decoder: Asks the decoder to decode only as much as is
|
||||
* needed to fill next_out. This decreases latency with some
|
||||
* filters, but is likely to decrease also throughput. It is
|
||||
* a good idea to use this flag only when it is likely that
|
||||
* you don't need more output soon.
|
||||
*
|
||||
* \note With decoder, this is not comparable to
|
||||
* zlib's Z_SYNC_FLUSH.
|
||||
*/
|
||||
|
||||
LZMA_FULL_FLUSH = 2,
|
||||
/**<
|
||||
* Finishes encoding of the current Data Block. All the input
|
||||
* data going to the current Data Block must have been given
|
||||
* to the encoder (the last bytes can still be pending in
|
||||
* next_in). Call lzma_code() with LZMA_FULL_FLUSH until
|
||||
* it returns LZMA_STREAM_END. Then continue normally with
|
||||
* LZMA_RUN or finish the Stream with LZMA_FINISH.
|
||||
*
|
||||
* This action is supported only by Multi-Block Stream
|
||||
* encoder. If there is no unfinished Data Block, no empty
|
||||
* Data Block is created.
|
||||
*/
|
||||
|
||||
LZMA_FINISH = 3
|
||||
/**<
|
||||
* Finishes the encoding operation. All the input data must
|
||||
* have been given to the encoder (the last bytes can still
|
||||
* be pending in next_in). Call lzma_code() with LZMA_FINISH
|
||||
* until it returns LZMA_STREAM_END.
|
||||
*
|
||||
* This action is not supported by decoders.
|
||||
*/
|
||||
} lzma_action;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Custom functions for memory handling
|
||||
*
|
||||
* A pointer to lzma_allocator may be passed via lzma_stream structure
|
||||
* to liblzma. The library will use these functions for memory handling
|
||||
* instead of the default malloc() and free().
|
||||
*
|
||||
* liblzma doesn't make an internal copy of lzma_allocator. Thus, it is
|
||||
* OK to change these function pointers in the middle of the coding
|
||||
* process, but obviously it must be done carefully to make sure that the
|
||||
* replacement `free' can deallocate memory allocated by the earlier
|
||||
* `alloc' function(s).
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Pointer to custom memory allocation function
|
||||
*
|
||||
* Set this to point to your custom memory allocation function.
|
||||
* It can be useful for example if you want to limit how much
|
||||
* memory liblzma is allowed to use: for this, you may use
|
||||
* a pointer to lzma_memory_alloc().
|
||||
*
|
||||
* If you don't want a custom allocator, but still want
|
||||
* custom free(), set this to NULL and liblzma will use
|
||||
* the standard malloc().
|
||||
*
|
||||
* \param opaque lzma_allocator.opaque (see below)
|
||||
* \param nmemb Number of elements like in calloc().
|
||||
* liblzma will always set nmemb to 1.
|
||||
* This argument exists only for
|
||||
* compatibility with zlib and libbzip2.
|
||||
* \param size Size of an element in bytes.
|
||||
* liblzma never sets this to zero.
|
||||
*
|
||||
* \return Pointer to the beginning of a memory block of
|
||||
* size nmemb * size, or NULL if allocation fails
|
||||
* for some reason. When allocation fails, functions
|
||||
* of liblzma return LZMA_MEM_ERROR.
|
||||
*/
|
||||
void *(*alloc)(void *opaque, size_t nmemb, size_t size);
|
||||
|
||||
/**
|
||||
* \brief Pointer to custom memory freeing function
|
||||
*
|
||||
* Set this to point to your custom memory freeing function.
|
||||
* If lzma_memory_alloc() is used as allocator, this should
|
||||
* be set to lzma_memory_free().
|
||||
*
|
||||
* If you don't want a custom freeing function, but still
|
||||
* want a custom allocator, set this to NULL and liblzma
|
||||
* will use the standard free().
|
||||
*
|
||||
* \param opaque lzma_allocator.opaque (see below)
|
||||
* \param ptr Pointer returned by
|
||||
* lzma_allocator.alloc(), or when it
|
||||
* is set to NULL, a pointer returned
|
||||
* by the standard malloc().
|
||||
*/
|
||||
void (*free)(void *opaque, void *ptr);
|
||||
|
||||
/**
|
||||
* \brief Pointer passed to .alloc() and .free()
|
||||
*
|
||||
* opaque is passed as the first argument to lzma_allocator.alloc()
|
||||
* and lzma_allocator.free(). This intended to ease implementing
|
||||
* custom memory allocation functions for use with liblzma.
|
||||
*
|
||||
* When using lzma_memory_alloc() and lzma_memory_free(), opaque
|
||||
* must point to lzma_memory_limitter structure allocated and
|
||||
* initialized with lzma_memory_limitter_create().
|
||||
*
|
||||
* If you don't need this, you should set it to NULL.
|
||||
*/
|
||||
void *opaque;
|
||||
|
||||
} lzma_allocator;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Internal data structure
|
||||
*
|
||||
* The contents of this structure is not visible outside the library.
|
||||
*/
|
||||
typedef struct lzma_internal_s lzma_internal;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Passing data to and from liblzma
|
||||
*
|
||||
* The lzma_stream structure is used for
|
||||
* - passing pointers to input and output buffers to liblzma;
|
||||
* - defining custom memory hander functions; and
|
||||
* - holding a pointer to coder-specific internal data structures.
|
||||
*
|
||||
* Before calling any of the lzma_*_init() functions the first time,
|
||||
* the application must reset lzma_stream to LZMA_STREAM_INIT. The
|
||||
* lzma_*_init() function will verify the options, allocate internal
|
||||
* data structures and store pointer to them into `internal'. Finally
|
||||
* total_in and total_out are reset to zero. In contrast to zlib,
|
||||
* next_in and avail_in are ignored by the initialization functions.
|
||||
*
|
||||
* The actual coding is done with the lzma_code() function. Application
|
||||
* must update next_in, avail_in, next_out, and avail_out between
|
||||
* calls to lzma_decode() just like with zlib.
|
||||
*
|
||||
* In contrast to zlib, even the decoder requires that there always
|
||||
* is at least one byte space in next_out; if avail_out == 0,
|
||||
* LZMA_BUF_ERROR is returned immediatelly. This shouldn't be a problem
|
||||
* for most applications that already use zlib, but it's still worth
|
||||
* checking your application.
|
||||
*
|
||||
* Application may modify values of total_in and total_out as it wants.
|
||||
* They are updated by liblzma to match the amount of data read and
|
||||
* written, but liblzma doesn't use the values internally.
|
||||
*
|
||||
* Application must not touch the `internal' pointer.
|
||||
*/
|
||||
typedef struct {
|
||||
uint8_t *next_in; /**< Pointer to the next input byte. */
|
||||
size_t avail_in; /**< Number of available input bytes in next_in. */
|
||||
uint64_t total_in; /**< Total number of bytes read by liblzma. */
|
||||
|
||||
uint8_t *next_out; /**< Pointer to the next output position. */
|
||||
size_t avail_out; /**< Amount of free space in next_out. */
|
||||
uint64_t total_out; /**< Total number of bytes written by liblzma. */
|
||||
|
||||
/**
|
||||
* Custom memory allocation functions. Set to NULL to use
|
||||
* the standard malloc() and free().
|
||||
*/
|
||||
lzma_allocator *allocator;
|
||||
|
||||
/** Internal state is not visible to outsiders. */
|
||||
lzma_internal *internal;
|
||||
|
||||
} lzma_stream;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialization for lzma_stream
|
||||
*
|
||||
* When you declare an instance of lzma_stream, you can immediatelly
|
||||
* initialize it so that initialization functions know that no memory
|
||||
* has been allocated yet:
|
||||
*
|
||||
* lzma_stream strm = LZMA_STREAM_INIT;
|
||||
*/
|
||||
#define LZMA_STREAM_INIT { NULL, 0, 0, NULL, 0, 0, NULL, NULL }
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialization for lzma_stream
|
||||
*
|
||||
* This is like LZMA_STREAM_INIT, but this can be used when the lzma_stream
|
||||
* has already been allocated:
|
||||
*
|
||||
* lzma_stream *strm = malloc(sizeof(lzma_stream));
|
||||
* if (strm == NULL)
|
||||
* return LZMA_MEM_ERROR;
|
||||
* *strm = LZMA_STREAM_INIT_VAR;
|
||||
*/
|
||||
extern const lzma_stream LZMA_STREAM_INIT_VAR;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes or decodes data
|
||||
*
|
||||
* Once the lzma_stream has been successfully initialized (e.g. with
|
||||
* lzma_stream_encoder_single()), the actual encoding or decoding is
|
||||
* done using this function.
|
||||
*
|
||||
* \return Some coders may have more exact meaning for different return
|
||||
* values, which are mentioned separately in the description of
|
||||
* the initialization functions. Here are the typical meanings:
|
||||
* - LZMA_OK: So far all good.
|
||||
* - LZMA_STREAM_END:
|
||||
* - Encoder: LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, or
|
||||
* LZMA_FINISH completed.
|
||||
* - Decoder: End of uncompressed data was reached.
|
||||
* - LZMA_BUF_ERROR: Unable to progress. Provide more input or
|
||||
* output space, and call this function again. This cannot
|
||||
* occur if both avail_in and avail_out were non-zero (or
|
||||
* there's a bug in liblzma).
|
||||
* - LZMA_MEM_ERROR: Unable to allocate memory. Due to lazy
|
||||
* programming, the coding cannot continue even if the
|
||||
* application could free more memory. The next call must
|
||||
* be lzma_end() or some initialization function.
|
||||
* - LZMA_DATA_ERROR:
|
||||
* - Encoder: Filter(s) cannot process the given data.
|
||||
* - Decoder: Compressed data is corrupt.
|
||||
* - LZMA_HEADER_ERROR: Unsupported options. Rebuilding liblzma
|
||||
* with more features enabled or upgrading to a newer version
|
||||
* may help, although usually this is a sign of invalid options
|
||||
* (encoder) or corrupted input data (decoder).
|
||||
* - LZMA_PROG_ERROR: Invalid arguments or the internal state
|
||||
* of the coder is corrupt.
|
||||
*/
|
||||
extern lzma_ret lzma_code(lzma_stream *strm, lzma_action action);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Frees memory allocated for the coder data structures
|
||||
*
|
||||
* \param strm Pointer to lzma_stream that is at least initialized
|
||||
* with LZMA_STREAM_INIT.
|
||||
*
|
||||
* \note zlib indicates an error if application end()s unfinished
|
||||
* stream. liblzma doesn't do this, and assumes that
|
||||
* application knows what it is doing.
|
||||
*/
|
||||
extern void lzma_end(lzma_stream *strm);
|
|
@ -0,0 +1,409 @@
|
|||
/**
|
||||
* \file lzma/block.h
|
||||
* \brief .lzma Block handling
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for the Block Header encoder and decoder
|
||||
*
|
||||
* Different things use different parts of this structure. Some read
|
||||
* some members, other functions write, and some do both. Only the
|
||||
* members listed for reading need to be initialized when the specified
|
||||
* functions are called. The members marked for writing will be assigned
|
||||
* new values at some point either by calling the given function or by
|
||||
* later calls to lzma_code().
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Type of integrity Check
|
||||
*
|
||||
* The type of the integrity Check is not stored into the Block
|
||||
* Header, thus its value must be provided also when decoding.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_check_type check;
|
||||
|
||||
/**
|
||||
* \brief Precense of CRC32 of the Block Header
|
||||
*
|
||||
* Set this to true if CRC32 of the Block Header should be
|
||||
* calculated and stored in the Block Header.
|
||||
*
|
||||
* There is no way to autodetect if CRC32 is present in the Block
|
||||
* Header, thus this information must be provided also when decoding.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
lzma_bool has_crc32;
|
||||
|
||||
/**
|
||||
* \brief Usage of End of Payload Marker
|
||||
*
|
||||
* If this is true, End of Payload Marker is used even if
|
||||
* Uncompressed Size is known.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_encoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
lzma_bool has_eopm;
|
||||
|
||||
/**
|
||||
* \brief True if the Block is a Metadata Block
|
||||
*
|
||||
* If this is true, the Metadata bit will be set in the Block Header.
|
||||
* It is up to the application to store correctly formatted data
|
||||
* into Metadata Block.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_encoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
lzma_bool is_metadata;
|
||||
|
||||
/**
|
||||
* \brief True if Uncompressed Size is in Block Footer
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_bool has_uncompressed_size_in_footer;
|
||||
|
||||
/**
|
||||
* \brief True if Backward Size is in Block Footer
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_bool has_backward_size;
|
||||
|
||||
/**
|
||||
* \brief True if Block coder should take care of Padding
|
||||
*
|
||||
* In liblzma, Stream decoder sets this to true when decoding
|
||||
* Header Metadata Block or Data Blocks from Multi-Block Stream,
|
||||
* and to false when decoding Single-Block Stream or Footer
|
||||
* Metadata Block from a Multi-Block Stream.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_bool handle_padding;
|
||||
|
||||
/**
|
||||
* \brief Size of the Compressed Data in bytes
|
||||
*
|
||||
* Usually you don't know this value when encoding in streamed mode.
|
||||
* In non-streamed mode you can reserve space for this field when
|
||||
* encoding the Block Header the first time, and then re-encode the
|
||||
* Block Header and copy it over the original one after the encoding
|
||||
* of the Block has been finished.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_vli compressed_size;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed Size in bytes
|
||||
*
|
||||
* Encoder: If this value is not LZMA_VLI_VALUE_UNKNOWN, it is stored
|
||||
* to the Uncompressed Size field in the Block Header. The real
|
||||
* uncompressed size of the data being compressed must match
|
||||
* the Uncompressed Size or LZMA_HEADER_ERROR is returned.
|
||||
*
|
||||
* If Uncompressed Size is unknown, End of Payload Marker must
|
||||
* be used. If uncompressed_size == LZMA_VLI_VALUE_UNKNOWN and
|
||||
* has_eopm == 0, LZMA_HEADER_ERROR will be returned.
|
||||
*
|
||||
* Decoder: If this value is not LZMA_VLI_VALUE_UNKNOWN, it is
|
||||
* compared to the real Uncompressed Size. If they do not match,
|
||||
* LZMA_HEADER_ERROR is returned.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief Number of bytes to reserve for Compressed Size
|
||||
*
|
||||
* This is useful if you want to be able to store the Compressed Size
|
||||
* to the Block Header, but you don't know it when starting to encode.
|
||||
* Setting this to non-zero value at maximum of LZMA_VLI_BYTES_MAX,
|
||||
* the Block Header encoder will force the Compressed Size field to
|
||||
* occupy specified number of bytes. You can later rewrite the Block
|
||||
* Header to contain correct information by using otherwise identical
|
||||
* lzma_options_block structure except the correct compressed_size.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
uint32_t compressed_reserve;
|
||||
|
||||
/**
|
||||
* \brief Number of bytes to reserve for Uncompressed Size
|
||||
*
|
||||
* See the description of compressed_size above.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
uint32_t uncompressed_reserve;
|
||||
|
||||
/**
|
||||
* \brief Total Size of the Block in bytes
|
||||
*
|
||||
* This is useful in the decoder, which can verify the Total Size
|
||||
* if it is known from Index.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_vli total_size;
|
||||
|
||||
/**
|
||||
* \brief Upper limit of Total Size
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_vli total_limit;
|
||||
|
||||
/**
|
||||
* \brief Upper limit of Uncompressed Size
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*/
|
||||
lzma_vli uncompressed_limit;
|
||||
|
||||
/**
|
||||
* \brief Array of filters
|
||||
*
|
||||
* There can be at maximum of seven filters. The end of the array
|
||||
* is marked with .id = LZMA_VLI_VALUE_UNKNOWN. Minimum number of
|
||||
* filters is zero; in that case, an implicit Copy filter is used.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_decoder(): Note that this does NOT free()
|
||||
* the old filter options structures. If decoding fails, the
|
||||
* caller must take care of freeing the options structures
|
||||
* that may have been allocated and decoded before the error
|
||||
* occurred.
|
||||
*/
|
||||
lzma_options_filter filters[8];
|
||||
|
||||
/**
|
||||
* \brief Size of the Padding field
|
||||
*
|
||||
* The Padding field exist to allow aligning the Compressed Data field
|
||||
* optimally in the Block. See lzma_options_stream.alignment in
|
||||
* stream.h for more information.
|
||||
*
|
||||
* If you want the Block Header encoder to automatically calculate
|
||||
* optimal size for the Padding field by looking at the information
|
||||
* in filters[], set this to LZMA_BLOCK_HEADER_PADDING_AUTO. In that
|
||||
* case, you must also set the aligmnet variable to tell the the
|
||||
* encoder the aligmnet of the beginning of the Block Header.
|
||||
*
|
||||
* The decoder never sets this to LZMA_BLOCK_HEADER_PADDING_AUTO.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder(): Note that this doesn't
|
||||
* accept LZMA_BLOCK_HEADER_PADDING_AUTO.
|
||||
*
|
||||
* Written by (these never set padding to
|
||||
* LZMA_BLOCK_HEADER_PADDING_AUTO):
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
int32_t padding;
|
||||
# define LZMA_BLOCK_HEADER_PADDING_AUTO (-1)
|
||||
# define LZMA_BLOCK_HEADER_PADDING_MIN 0
|
||||
# define LZMA_BLOCK_HEADER_PADDING_MAX 31
|
||||
|
||||
/**
|
||||
* \brief Alignment of the beginning of the Block Header
|
||||
*
|
||||
* This variable is read only if padding has been set to
|
||||
* LZMA_BLOCK_HEADER_PADDING_AUTO.
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_encoder()
|
||||
*/
|
||||
uint32_t alignment;
|
||||
|
||||
/**
|
||||
* \brief Size of the Block Header
|
||||
*
|
||||
* Read by:
|
||||
* - lzma_block_encoder()
|
||||
* - lzma_block_decoder()
|
||||
*
|
||||
* Written by:
|
||||
* - lzma_block_header_size()
|
||||
* - lzma_block_header_decoder()
|
||||
*/
|
||||
uint32_t header_size;
|
||||
|
||||
} lzma_options_block;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculates the size of Header Padding and Block Header
|
||||
*
|
||||
* \return - LZMA_OK: Size calculated successfully and stored to
|
||||
* options->header_size.
|
||||
* - LZMA_HEADER_ERROR: Unsupported filters or filter options.
|
||||
* - LZMA_PROG_ERROR: Invalid options
|
||||
*
|
||||
* \note This doesn't check that all the options are valid i.e. this
|
||||
* may return LZMA_OK even if lzma_block_header_encode() or
|
||||
* lzma_block_encoder() would fail.
|
||||
*/
|
||||
extern lzma_ret lzma_block_header_size(lzma_options_block *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes Block Header
|
||||
*
|
||||
* Encoding of the Block options is done with a single call instead of
|
||||
* first initializing and then doing the actual work with lzma_code().
|
||||
*
|
||||
* \param out Beginning of the output buffer. This must be
|
||||
* at least options->header_size bytes.
|
||||
* \param options Block options to be encoded.
|
||||
*
|
||||
* \return - LZMA_OK: Encoding was successful. options->header_size
|
||||
* bytes were written to output buffer.
|
||||
* - LZMA_HEADER_ERROR: Invalid or unsupported options.
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_block_header_encode(
|
||||
uint8_t *out, const lzma_options_block *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Block Header decoder
|
||||
*
|
||||
* Because the results of this decoder are placed into *options,
|
||||
* strm->next_in, strm->avail_in, and strm->total_in are not used.
|
||||
*
|
||||
* The only valid `action' with lzma_code() is LZMA_RUN.
|
||||
*
|
||||
* \return - LZMA_OK: Encoding was successful. options->header_size
|
||||
* bytes were written to output buffer.
|
||||
* - LZMA_HEADER_ERROR: Invalid or unsupported options.
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_block_header_decoder(
|
||||
lzma_stream *strm, lzma_options_block *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes .lzma Block encoder
|
||||
*
|
||||
* This function is required for multi-thread encoding. It may also be
|
||||
* useful when implementing custom file formats.
|
||||
*
|
||||
* \return - LZMA_OK: All good, continue with lzma_code().
|
||||
* - LZMA_MEM_ERROR
|
||||
* - LZMA_HEADER_ERROR
|
||||
* - LZMA_DATA_ERROR: Limits (total_limit and uncompressed_limit)
|
||||
* have been reached already.
|
||||
* - LZMA_UNSUPPORTED_CHECK: options->check specfies a Check
|
||||
* that is not supported by this buid of liblzma. Initializing
|
||||
* the encoder failed.
|
||||
* - LZMA_PROG_ERROR
|
||||
*
|
||||
* lzma_code() can return FIXME
|
||||
*/
|
||||
extern lzma_ret lzma_block_encoder(
|
||||
lzma_stream *strm, lzma_options_block *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes decoder for .lzma Block
|
||||
*
|
||||
* \return - LZMA_OK: All good, continue with lzma_code().
|
||||
* - LZMA_UNSUPPORTED_CHECK: Initialization was successful, but
|
||||
* the given Check type is not supported, thus Check will be
|
||||
* ignored.
|
||||
* - LZMA_PROG_ERROR
|
||||
* - LZMA_MEM_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_block_decoder(
|
||||
lzma_stream *strm, lzma_options_block *options);
|
|
@ -0,0 +1,128 @@
|
|||
/**
|
||||
* \file lzma/check.h
|
||||
* \brief Integrity checks
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Type of the Check
|
||||
*
|
||||
* The .lzma format supports multiple types of Checks that are calculated
|
||||
* from the uncompressed data (unless it is empty; then it's calculated
|
||||
* from Block Header).
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_CHECK_NONE = 0,
|
||||
/**<
|
||||
* No Check is calculated.
|
||||
*
|
||||
* Size of the Check field: 0 bytes
|
||||
*/
|
||||
|
||||
LZMA_CHECK_CRC32 = 1,
|
||||
/**<
|
||||
* CRC32 using the polynomial from the IEEE 802.3 standard
|
||||
*
|
||||
* Size of the Check field: 4 bytes
|
||||
*/
|
||||
|
||||
LZMA_CHECK_CRC64 = 3,
|
||||
/**<
|
||||
* CRC64 using the polynomial from the ECMA-182 standard
|
||||
*
|
||||
* Size of the Check field: 8 bytes
|
||||
*/
|
||||
|
||||
LZMA_CHECK_SHA256 = 5
|
||||
/**<
|
||||
* SHA-256
|
||||
*
|
||||
* Size of the Check field: 32 bytes
|
||||
*/
|
||||
} lzma_check_type;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Maximum valid Check ID
|
||||
*
|
||||
* The .lzma file format specification specifies eight Check IDs (0-7). Some
|
||||
* of them are only reserved i.e. no actual Check algorithm has been assigned.
|
||||
* Still liblzma accepts any of these eight IDs for future compatibility
|
||||
* when decoding files. If a valid but unsupported Check ID is detected,
|
||||
* liblzma indicates a warning with LZMA_UNSUPPORTED_CHECK.
|
||||
*
|
||||
* FIXME bad desc
|
||||
*/
|
||||
#define LZMA_CHECK_ID_MAX 7
|
||||
|
||||
|
||||
/**
|
||||
* \brief Check IDs supported by this liblzma build
|
||||
*
|
||||
* If lzma_available_checks[n] is true, the Check ID n is supported by this
|
||||
* liblzma build. You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32
|
||||
* are always available.
|
||||
*/
|
||||
extern const lzma_bool lzma_available_checks[LZMA_CHECK_ID_MAX + 1];
|
||||
|
||||
|
||||
/**
|
||||
* \brief Size of the Check field with different Check IDs
|
||||
*
|
||||
* Although not all Check IDs have a check algorithm associated, the size of
|
||||
* every Check is already frozen. This array contains the size (in bytes) of
|
||||
* the Check field with specified Check ID. The values are taken from the
|
||||
* section 2.2.2 of the .lzma file format specification:
|
||||
* { 0, 4, 4, 8, 16, 32, 32, 64 }
|
||||
*/
|
||||
extern const uint32_t lzma_check_sizes[LZMA_CHECK_ID_MAX + 1];
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculate CRC32
|
||||
*
|
||||
* Calculates CRC32 using the polynomial from the IEEE 802.3 standard.
|
||||
*
|
||||
* \param buf Pointer to the input buffer
|
||||
* \param size Size of the input buffer
|
||||
* \param crc Previously returned CRC value. This is used to
|
||||
* calculate the CRC of a big buffer in smaller chunks.
|
||||
* Set to zero when there is no previous value.
|
||||
*
|
||||
* \return Updated CRC value, which can be passed to this function
|
||||
* again to continue CRC calculation.
|
||||
*/
|
||||
extern uint32_t lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculate CRC64
|
||||
*
|
||||
* Calculates CRC64 using the polynomial from the ECMA-182 standard.
|
||||
*
|
||||
* This function is used similarly to lzma_crc32(). See its documentation.
|
||||
*/
|
||||
extern uint64_t lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc);
|
||||
|
||||
|
||||
/*
|
||||
* SHA256 functions are currently not exported to public API.
|
||||
* Contact the author if you think it should be.
|
||||
*/
|
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* \file lzma/copy.h
|
||||
* \brief Copy filter
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filter ID
|
||||
*
|
||||
* Filter ID of the Copy filter. This is used as lzma_options_filter.id.
|
||||
*/
|
||||
#define LZMA_FILTER_COPY LZMA_VLI_C(0x00)
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* \file lzma/delta.h
|
||||
* \brief Delta filter
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filter ID
|
||||
*
|
||||
* Filter ID of the Delta filter. This is used as lzma_options_filter.id.
|
||||
*/
|
||||
#define LZMA_FILTER_DELTA LZMA_VLI_C(0x20)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for the Delta filter
|
||||
*
|
||||
* These options are needed by both encoder and decoder.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Delta distance as bytes
|
||||
*
|
||||
* Examples:
|
||||
* - 16-bit stereo audio: distance = 4 bytes
|
||||
* - 24-bit RGB image data: distance = 3 bytes
|
||||
*/
|
||||
uint32_t distance;
|
||||
# define LZMA_DELTA_DISTANCE_MIN 1
|
||||
# define LZMA_DELTA_DISTANCE_MAX 256
|
||||
|
||||
} lzma_options_delta;
|
|
@ -0,0 +1,114 @@
|
|||
/**
|
||||
* \file lzma/extra.h
|
||||
* \brief Handling of Extra Records in Metadata
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Extra Record IDs
|
||||
*
|
||||
* See the .lzma file format specification for description what each
|
||||
* Extra Record type exactly means.
|
||||
*
|
||||
* If you ever need to update .lzma files with Extra Records, note that
|
||||
* the Record IDs are divided in two categories:
|
||||
* - Safe-to-Copy Records may be preserved as is when the
|
||||
* Stream is modified in ways that don't change the actual
|
||||
* uncompressed data. Examples of such operatings include
|
||||
* recompressing and adding, modifying, or deleting unrelated
|
||||
* Extra Records.
|
||||
* - Unsafe-to-Copy Records should be removed (and possibly
|
||||
* recreated) when any kind of changes are made to the Stream.
|
||||
*/
|
||||
|
||||
#define LZMA_EXTRA_PADDING 0x00
|
||||
#define LZMA_EXTRA_OPENPGP 0x01
|
||||
#define LZMA_EXTRA_FILTERS 0x02
|
||||
#define LZMA_EXTRA_COMMENT 0x03
|
||||
#define LZMA_EXTRA_CHECKS 0x04
|
||||
#define LZMA_EXTRA_FILENAME 0x05
|
||||
#define LZMA_EXTRA_MTIME 0x07
|
||||
#define LZMA_EXTRA_MTIME_HR 0x09
|
||||
#define LZMA_EXTRA_MIME_TYPE 0x0B
|
||||
#define LZMA_EXTRA_HOMEPAGE 0x0D
|
||||
|
||||
|
||||
/**
|
||||
* \brief Extra Records
|
||||
*
|
||||
* The .lzma format provides a way to store custom information along
|
||||
* the actual compressed content. Information about these Records
|
||||
* are passed to and from liblzma via this linked list.
|
||||
*/
|
||||
typedef struct lzma_extra_s lzma_extra;
|
||||
struct lzma_extra_s {
|
||||
/**
|
||||
* \brief Pointer to the next Extra Record
|
||||
*
|
||||
* This is NULL on the last Extra Record.
|
||||
*/
|
||||
lzma_extra *next;
|
||||
|
||||
/**
|
||||
* \brief Record ID
|
||||
*
|
||||
* Extra Record IDs are divided in three categories:
|
||||
* - Zero is a special case used for padding. It doesn't have
|
||||
* Size of Data fields.
|
||||
* - Odd IDs (1, 3, 5, ...) are Safe-to-Copy IDs.
|
||||
* These can be preserved as is if the Stream is
|
||||
* modified in a way that doesn't alter the actual
|
||||
* uncompressed content.
|
||||
* - Even IDs (2, 4, 6, ...) are Unsafe-to-Copy IDs.
|
||||
* If the .lzma Stream is modified in any way,
|
||||
* the Extra Records having a sensitive ID should
|
||||
* be removed or updated accordingly.
|
||||
*
|
||||
* Refer to the .lzma file format specification for
|
||||
* the up to date list of Extra Record IDs.
|
||||
*/
|
||||
lzma_vli id;
|
||||
|
||||
/**
|
||||
* \brief Size of the Record data
|
||||
*
|
||||
* In case of strings, this should not include the
|
||||
* trailing '\0'.
|
||||
*/
|
||||
size_t size;
|
||||
|
||||
/**
|
||||
* \brief Record data
|
||||
*
|
||||
* Record data is often a string in UTF-8 encoding,
|
||||
* but it can be arbitrary binary data. In case of
|
||||
* strings, the trailing '\0' is usually not stored
|
||||
* in the .lzma file.
|
||||
*
|
||||
* To ease working with Extra Records containing strings,
|
||||
* liblzma always adds '\0' to the end of data even when
|
||||
* it wasn't present in the .lzma file. This '\0' is not
|
||||
* counted in the size of the data.
|
||||
*/
|
||||
uint8_t *data;
|
||||
};
|
||||
|
||||
|
||||
extern void lzma_extra_free(lzma_extra *extra, lzma_allocator *allocator);
|
|
@ -0,0 +1,166 @@
|
|||
/**
|
||||
* \file lzma/filter.h
|
||||
* \brief Common filter related types
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filter options
|
||||
*
|
||||
* This structure is used to pass Filter ID and a pointer filter's options
|
||||
* to liblzma.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Filter ID
|
||||
*
|
||||
* Use constants whose name begin with `LZMA_FILTER_' to specify
|
||||
* different filters. In an array of lzma_option_filter structures,
|
||||
* use LZMA_VLI_VALUE_UNKNOWN to indicate end of filters.
|
||||
*/
|
||||
lzma_vli id;
|
||||
|
||||
/**
|
||||
* \brief Pointer to filter-specific options structure
|
||||
*
|
||||
* If the filter doesn't need options, set this to NULL. If id is
|
||||
* set to LZMA_VLI_VALUE_UNKNOWN, options is ignored, and thus
|
||||
* doesn't need be initialized.
|
||||
*
|
||||
* Some filters support changing the options in the middle of
|
||||
* the encoding process. These filters store the pointer of the
|
||||
* options structure and communicate with the application via
|
||||
* modifications of the options structure.
|
||||
*/
|
||||
void *options;
|
||||
|
||||
} lzma_options_filter;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filters available for encoding
|
||||
*
|
||||
* Pointer to an array containing the list of available Filter IDs that
|
||||
* can be used for encoding. The last element is LZMA_VLI_VALUE_UNKNOWN.
|
||||
*
|
||||
* If lzma_available_filter_encoders[0] == LZMA_VLI_VALUE_UNKNOWN, the
|
||||
* encoder components haven't been built at all. This means that the
|
||||
* encoding-specific functions are probably missing from the library
|
||||
* API/ABI completely.
|
||||
*/
|
||||
extern const lzma_vli *const lzma_available_filter_encoders;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filters available for decoding
|
||||
*
|
||||
* Pointer to an array containing the list of available Filter IDs that
|
||||
* can be used for decoding. The last element is LZMA_VLI_VALUE_UNKNOWN.
|
||||
*
|
||||
* If lzma_available_filter_decoders[0] == LZMA_VLI_VALUE_UNKNOWN, the
|
||||
* decoder components haven't been built at all. This means that the
|
||||
* decoding-specific functions are probably missing from the library
|
||||
* API/ABI completely.
|
||||
*/
|
||||
extern const lzma_vli *const lzma_available_filter_decoders;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculate rough memory requirements for given filter chain
|
||||
*
|
||||
* \param filters Array of filters terminated with
|
||||
* .id == LZMA_VLI_VALUE_UNKNOWN.
|
||||
* \param is_encoder Set to true when calculating memory requirements
|
||||
* of an encoder; false for decoder.
|
||||
*
|
||||
* \return Number of mebibytes (MiB i.e. 2^20) required for the given
|
||||
* encoder or decoder filter chain.
|
||||
*
|
||||
* \note If calculating memory requirements of encoder, lzma_init() or
|
||||
* lzma_init_encoder() must have been called earlier. Similarly,
|
||||
* if calculating memory requirements of decoder, lzma_init() or
|
||||
* lzma_init_decoder() must have been called earlier.
|
||||
*/
|
||||
extern uint32_t lzma_memory_usage(
|
||||
const lzma_options_filter *filters, lzma_bool is_encoder);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculates encoded size of a Filter Flags field
|
||||
*
|
||||
* Knowing the size of Filter Flags is useful to know when allocating
|
||||
* memory to hold the encoded Filter Flags.
|
||||
*
|
||||
* \param size Pointer to integer to hold the calculated size
|
||||
* \param options Filter ID and associated options whose encoded
|
||||
* size is to be calculted
|
||||
*
|
||||
* \return - LZMA_OK: *size set successfully. Note that this doesn't
|
||||
* guarantee that options->options is valid, thus
|
||||
* lzma_filter_flags_encode() may still fail.
|
||||
* - LZMA_HEADER_ERROR: Unknown Filter ID or unsupported options.
|
||||
* - LZMA_PROG_ERROR: Invalid options
|
||||
*
|
||||
* \note If you need to calculate size of List of Filter Flags,
|
||||
* you need to loop over every lzma_options_filter entry.
|
||||
*/
|
||||
extern lzma_ret lzma_filter_flags_size(
|
||||
uint32_t *size, const lzma_options_filter *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes Filter Flags into given buffer
|
||||
*
|
||||
* In contrast to some functions, this doesn't allocate the needed buffer.
|
||||
* This is due to how this function is used internally by liblzma.
|
||||
*
|
||||
* \param out Beginning of the output buffer
|
||||
* \param out_pos out[*out_pos] is the next write position. This
|
||||
* is updated by the encoder.
|
||||
* \param out_size out[out_size] is the first byte to not write.
|
||||
* \param options Filter options to be encoded
|
||||
*
|
||||
* \return - LZMA_OK: Encoding was successful.
|
||||
* - LZMA_HEADER_ERROR: Invalid or unsupported options.
|
||||
* - LZMA_PROG_ERROR: Invalid options or not enough output
|
||||
* buffer space (you should have checked it with
|
||||
* lzma_filter_flags_size()).
|
||||
*/
|
||||
extern lzma_ret lzma_filter_flags_encode(uint8_t *out, size_t *out_pos,
|
||||
size_t out_size, const lzma_options_filter *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Filter Flags decoder
|
||||
*
|
||||
* The decoded result is stored into *options. options->options is
|
||||
* initialized but the old value is NOT free()d.
|
||||
*
|
||||
* Because the results of this decoder are placed into *options,
|
||||
* strm->next_in, strm->avail_in, and strm->total_in are not used
|
||||
* when calling lzma_code(). The only valid action for lzma_code()
|
||||
* is LZMA_RUN
|
||||
*
|
||||
* \return - LZMA_OK
|
||||
* - LZMA_MEM_ERROR
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_filter_flags_decoder(
|
||||
lzma_stream *strm, lzma_options_filter *options);
|
|
@ -0,0 +1,84 @@
|
|||
/**
|
||||
* \file lzma/index.h
|
||||
* \brief Handling of Index lists
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief
|
||||
*
|
||||
* FIXME desc
|
||||
*/
|
||||
typedef struct lzma_index_s lzma_index;
|
||||
struct lzma_index_s {
|
||||
/**
|
||||
* \brief Total Size of the Block
|
||||
*
|
||||
* This includes Block Header, Compressed Data, and Block Footer.
|
||||
*/
|
||||
lzma_vli total_size;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed Size of the Block
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief Pointer to the next Index Record
|
||||
*
|
||||
* This is NULL on the last Index Record.
|
||||
*/
|
||||
lzma_index *next;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Duplicates an Index list
|
||||
*
|
||||
* \return A copy of the Index list, or NULL if memory allocation
|
||||
* failed or the original Index was empty.
|
||||
*/
|
||||
extern lzma_index *lzma_index_dup(
|
||||
const lzma_index *index, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Frees an Index list
|
||||
*
|
||||
* All Index Recors in the list are freed. This function is convenient when
|
||||
* getting rid of lzma_metadata structures containing an Index.
|
||||
*/
|
||||
extern void lzma_index_free(lzma_index *index, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculates information about the Index
|
||||
*
|
||||
* \return LZMA_OK on success, LZMA_PROG_ERROR on error. FIXME
|
||||
*/
|
||||
extern lzma_ret lzma_index_count(const lzma_index *index, size_t *count,
|
||||
lzma_vli *lzma_restrict total_size,
|
||||
lzma_vli *lzma_restrict uncompressed_size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Compares if two Index lists are identical
|
||||
*/
|
||||
extern lzma_bool lzma_index_is_equal(const lzma_index *a, const lzma_index *b);
|
|
@ -0,0 +1,315 @@
|
|||
/**
|
||||
* \file lzma/info.h
|
||||
* \brief Handling of Stream size information
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**********
|
||||
* Basics *
|
||||
**********/
|
||||
|
||||
/**
|
||||
* \brief Opaque data type to hold the size information
|
||||
*/
|
||||
typedef struct lzma_info_s lzma_info;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Total Size of this Block
|
||||
*
|
||||
* This can be LZMA_VLI_VALUE_UNKNOWN.
|
||||
*/
|
||||
lzma_vli total_size;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed Size of this Block
|
||||
*
|
||||
* This can be LZMA_VLI_VALUE_UNKNOWN.
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief Offset of the first byte of the Block
|
||||
*
|
||||
* In encoder, this is useful to find out the alignment of the Block.
|
||||
*
|
||||
* In decoder, this is useful when doing random-access reading
|
||||
* with help from lzma_info_data_locate().
|
||||
*/
|
||||
lzma_vli stream_offset;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed offset of the Block
|
||||
*
|
||||
* Offset of the first uncompressed byte of the Block relative to
|
||||
* all uncompressed data in the Block.
|
||||
* FIXME desc
|
||||
*/
|
||||
lzma_vli uncompressed_offset;
|
||||
|
||||
/**
|
||||
* \brief Pointers to internal data structures
|
||||
*
|
||||
* Applications must not touch these.
|
||||
*/
|
||||
void *internal[4];
|
||||
|
||||
} lzma_info_iter;
|
||||
|
||||
|
||||
typedef enum {
|
||||
LZMA_INFO_STREAM_START,
|
||||
LZMA_INFO_HEADER_METADATA,
|
||||
LZMA_INFO_TOTAL,
|
||||
LZMA_INFO_UNCOMPRESSED,
|
||||
LZMA_INFO_FOOTER_METADATA
|
||||
} lzma_info_size;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Allocates and initializes a new lzma_info structure
|
||||
*
|
||||
* If info is NULL, a new lzma_info structure is allocated, initialized, and
|
||||
* a pointer to it returned. If allocation fails, NULL is returned.
|
||||
*
|
||||
* If info is non-NULL, it is reinitialized and the same pointer returned.
|
||||
* (In this case, return value cannot be NULL or a different pointer than
|
||||
* the info given as argument.)
|
||||
*/
|
||||
extern lzma_info *lzma_info_init(lzma_info *info, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Resets lzma_info
|
||||
*
|
||||
* This is like calling lzma_info_end() and lzma_info_create(), but
|
||||
* re-uses the existing base structure.
|
||||
*/
|
||||
extern void lzma_info_reset(
|
||||
lzma_info *info, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Frees memory allocated for a lzma_info structure
|
||||
*/
|
||||
extern void lzma_info_free(lzma_info *info, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/************************
|
||||
* Setting known values *
|
||||
************************/
|
||||
|
||||
/**
|
||||
* \brief Set a known size value
|
||||
*
|
||||
* \param info Pointer returned by lzma_info_create()
|
||||
* \param type Any value from lzma_info_size
|
||||
* \param size Value to set or verify
|
||||
*
|
||||
* \return LZMA_OK on success, LZMA_DATA_ERROR if the size doesn't
|
||||
* match the existing information, or LZMA_PROG_ERROR
|
||||
* if type is invalid or size is not a valid VLI.
|
||||
*/
|
||||
extern lzma_ret lzma_info_size_set(
|
||||
lzma_info *info, lzma_info_size type, lzma_vli size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Sets the Index
|
||||
*
|
||||
* The given lzma_index list is "absorbed" by this function. The application
|
||||
* must not access it after this function call, even if this function returns
|
||||
* an error.
|
||||
*
|
||||
* \note The given lzma_index will at some point get freed by the
|
||||
* lzma_info_* functions. If you use a custom lzma_allocator,
|
||||
* make sure that it can free the lzma_index.
|
||||
*/
|
||||
extern lzma_ret lzma_info_index_set(
|
||||
lzma_info *info, lzma_allocator *allocator,
|
||||
lzma_index *index, lzma_bool eat_index);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Sets information from a known Metadata Block
|
||||
*
|
||||
* This is a shortcut for calling lzma_info_size_set() with different type
|
||||
* arguments, lzma_info_index_set() with metadata->index.
|
||||
*/
|
||||
extern lzma_ret lzma_info_metadata_set(lzma_info *info,
|
||||
lzma_allocator *allocator, lzma_metadata *metadata,
|
||||
lzma_bool is_header_metadata, lzma_bool eat_index);
|
||||
|
||||
|
||||
/***************
|
||||
* Incremental *
|
||||
***************/
|
||||
|
||||
/**
|
||||
* \brief Prepares an iterator to be used with given lzma_info structure
|
||||
*
|
||||
*
|
||||
*/
|
||||
extern void lzma_info_iter_begin(lzma_info *info, lzma_info_iter *iter);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Moves to the next Index Record
|
||||
*
|
||||
*
|
||||
*/
|
||||
extern lzma_ret lzma_info_iter_next(
|
||||
lzma_info_iter *iter, lzma_allocator *allocator);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Sets or verifies the sizes in the Index Record
|
||||
*
|
||||
* \param iter Pointer to iterator to be set or verified
|
||||
* \param total_size
|
||||
* Total Size in bytes or LZMA_VLI_VALUE_UNKNOWN
|
||||
* \param uncompressed_size
|
||||
* Uncompressed Size or LZMA_VLI_VALUE_UNKNOWN
|
||||
*
|
||||
* \return - LZMA_OK: All OK.
|
||||
* - LZMA_DATA_ERROR: Given sizes don't match with the already
|
||||
* known sizes.
|
||||
* - LZMA_PROG_ERROR: Internal error, possibly integer
|
||||
* overflow (e.g. the sum of all the known sizes is too big)
|
||||
*/
|
||||
extern lzma_ret lzma_info_iter_set(lzma_info_iter *iter,
|
||||
lzma_vli total_size, lzma_vli uncompressed_size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Locates a Data Block
|
||||
*
|
||||
* \param iter Properly initialized iterator
|
||||
* \param allocator Pointer to lzma_allocator or NULL
|
||||
* \param uncompressed_offset
|
||||
* Target offset to locate. The final offset
|
||||
* will be equal or smaller than this.
|
||||
* \param allow_alloc True if this function is allowed to call
|
||||
* lzma_info_iter_next() to allocate a new Record
|
||||
* if the requested offset reached end of Index
|
||||
* Record list. Note that if Index has been marked
|
||||
* final, lzma_info_iter_next() is never called.
|
||||
*
|
||||
* \return - LZMA_OK: All OK, *iter updated accordingly.
|
||||
* - LZMA_DATA_ERROR: Trying to search past the end of the Index
|
||||
* Record list, and allocating a new Record was not allowed
|
||||
* either because allow_alloc was false or Index was final.
|
||||
* - LZMA_PROG_ERROR: Internal error (probably integer
|
||||
* overflow causing some lzma_vli getting too big).
|
||||
*/
|
||||
extern lzma_ret lzma_info_iter_locate(lzma_info_iter *iter,
|
||||
lzma_allocator *allocator, lzma_vli uncompressed_offset,
|
||||
lzma_bool allow_alloc);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Finishes incrementally constructed Index
|
||||
*
|
||||
* This sets the known Total Size and Uncompressed of the Data Blocks
|
||||
* based on the information collected from the Index Records, and marks
|
||||
* the Index as final.
|
||||
*/
|
||||
extern lzma_ret lzma_info_index_finish(lzma_info *info);
|
||||
|
||||
|
||||
/***************************
|
||||
* Reading the information *
|
||||
***************************/
|
||||
|
||||
/**
|
||||
* \brief Gets a known size
|
||||
*
|
||||
*
|
||||
*/
|
||||
extern lzma_vli lzma_info_size_get(
|
||||
const lzma_info *info, lzma_info_size type);
|
||||
|
||||
extern lzma_vli lzma_info_metadata_locate(
|
||||
const lzma_info *info, lzma_bool is_header_metadata);
|
||||
|
||||
/**
|
||||
* \brief Gets a pointer to the beginning of the Index list
|
||||
*
|
||||
* If detach is true, the Index will be detached from the lzma_info
|
||||
* structure, and thus not be modified or freed by lzma_info_end().
|
||||
*
|
||||
* If detach is false, the application must not modify the Index in any way.
|
||||
* Also, the Index list is guaranteed to be valid only till the next call
|
||||
* to any lzma_info_* function.
|
||||
*/
|
||||
extern lzma_index *lzma_info_index_get(lzma_info *info, lzma_bool detach);
|
||||
|
||||
|
||||
extern size_t lzma_info_index_count_get(const lzma_info *info);
|
||||
|
||||
|
||||
extern uint32_t lzma_info_metadata_alignment_get(
|
||||
const lzma_info *info, lzma_bool is_header_metadata);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* \brief Locate a Block containing the given uncompressed offset
|
||||
*
|
||||
* This function is useful when you need to do random-access reading in
|
||||
* a Multi-Block Stream.
|
||||
*
|
||||
* \param info Pointer to lzma_info that has at least one
|
||||
* Index Record. The Index doesn't need to be finished.
|
||||
* \param uncompressed_target
|
||||
* Uncompressed target offset which the caller would
|
||||
* like to locate from the Stream.
|
||||
* \param stream_offset
|
||||
* Starting offset (relative to the beginning the Stream)
|
||||
* of the Block containing the requested location.
|
||||
* \param uncompressed_offset
|
||||
* The actual uncompressed offset of the beginning of
|
||||
* the Block. uncompressed_offset <= uncompressed_target
|
||||
* is always true; the application needs to uncompress
|
||||
* uncompressed_target - uncompressed_offset bytes to
|
||||
* reach the requested target offset.
|
||||
* \param total_size
|
||||
* Total Size of the Block. If the Index is incomplete,
|
||||
* this may be LZMA_VLI_VALUE_UNKNOWN indicating unknown
|
||||
* size.
|
||||
* \param uncompressed_size
|
||||
* Uncompressed Size of the Block. If the Index is
|
||||
* incomplete, this may be LZMA_VLI_VALUE_UNKNOWN
|
||||
* indicating unknown size. The application must pass
|
||||
* this value to the Block decoder to verify FIXME
|
||||
*
|
||||
* \return
|
||||
*
|
||||
* \note This function is currently implemented as a linear search.
|
||||
* If there are many Index Records, this can be really slow.
|
||||
* This can be improved in newer liblzma versions if needed.
|
||||
*/
|
||||
extern lzma_bool lzma_info_data_locate(const lzma_info *info,
|
||||
lzma_vli uncompressed_target,
|
||||
lzma_vli *lzma_restrict stream_offset,
|
||||
lzma_vli *lzma_restrict uncompressed_offset,
|
||||
lzma_vli *lzma_restrict total_size,
|
||||
lzma_vli *lzma_restrict uncompressed_size);
|
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* \file lzma/init.h
|
||||
* \brief Initializations
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialize all internal static variables
|
||||
*
|
||||
* Depending on the build options, liblzma may have some internal static
|
||||
* variables, that must be initialized before using any other part of
|
||||
* the library (*). It is recommended to do these initializations in the very
|
||||
* beginning of the application by calling appropriate initialization function.
|
||||
*
|
||||
* (*) There are some exceptions to this rule. FIXME
|
||||
*
|
||||
* The initialization functions are not necessarily thread-safe, thus the
|
||||
* required initializations must be done before creating any threads. (The
|
||||
* rest of the functions of liblzma are thread-safe.) Calling the
|
||||
* initialization functions multiple times does no harm, although it
|
||||
* still shouldn't be done when there are multiple threads running.
|
||||
*
|
||||
* lzma_init() initializes all internal static variables by calling
|
||||
* lzma_lzma_init_encoder() and lzma_init_decoder().
|
||||
*
|
||||
* If you need only encoder, decoder, or neither-encoder-nor-decoder
|
||||
* functions, you may use other initialization functions, which initialize
|
||||
* only a subset of liblzma's internal static variables. Using those
|
||||
* functions have the following advantages:
|
||||
* - When linking statically against liblzma, less useless functions will
|
||||
* get linked into the binary. E.g. if you need only the decoder functions,
|
||||
* using lzma_init_decoder() avoids linking bunch of encoder related code.
|
||||
* - There is less things to initialize, making the initialization
|
||||
* process slightly faster.
|
||||
*/
|
||||
extern void lzma_init(void);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialize internal static variables needed by encoders
|
||||
*
|
||||
* If you need only the encoder functions, you may use this function to
|
||||
* initialize only the things required by encoders.
|
||||
*
|
||||
* This function also calls lzma_init_check().
|
||||
*/
|
||||
extern void lzma_init_encoder(void);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialize internal static variables needed by decoders
|
||||
*
|
||||
* If you need only the decoder functions, you may use this function to
|
||||
* initialize only the things required by decoders.
|
||||
*
|
||||
* This function also calls lzma_init_check().
|
||||
*/
|
||||
extern void lzma_init_decoder(void);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initialize internal static variables needed by integrity checks
|
||||
*
|
||||
* Currently this initializes CRC32 and CRC64 lookup tables if precalculated
|
||||
* tables haven't been built into the library. This function can be useful
|
||||
* if the only thing you need from liblzma is the integrity check functions.
|
||||
*/
|
||||
extern void lzma_init_check(void);
|
|
@ -0,0 +1,312 @@
|
|||
/**
|
||||
* \file lzma/lzma.h
|
||||
* \brief LZMA filter
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filter ID
|
||||
*
|
||||
* Filter ID of the LZMA filter. This is used as lzma_options_filter.id.
|
||||
*/
|
||||
#define LZMA_FILTER_LZMA LZMA_VLI_C(0x40)
|
||||
|
||||
|
||||
/**
|
||||
* \brief LZMA compression modes
|
||||
*
|
||||
* Currently there are only two modes. Earlier LZMA SDKs had also third
|
||||
* mode between fast and best.
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_MODE_INVALID = -1,
|
||||
/**<
|
||||
* \brief Invalid mode
|
||||
*
|
||||
* Used as array terminator in lzma_available_modes.
|
||||
*/
|
||||
|
||||
|
||||
LZMA_MODE_FAST = 0,
|
||||
/**<
|
||||
* \brief Fast compression
|
||||
*
|
||||
* Fast mode is usually at its best when combined with
|
||||
* a hash chain match finder.
|
||||
*/
|
||||
|
||||
LZMA_MODE_BEST = 2
|
||||
/**<
|
||||
* \brief Best compression ratio
|
||||
*
|
||||
* This is usually notably slower than fast mode. Use this
|
||||
* together with binary tree match finders to expose the
|
||||
* full potential of the LZMA encoder.
|
||||
*/
|
||||
} lzma_mode;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Match finders
|
||||
*
|
||||
* Match finder has major effect on both speed and compression ratio.
|
||||
* Usually hash chains are faster than binary trees.
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_MF_INVALID = -1,
|
||||
/**<
|
||||
* \brief Invalid match finder ID
|
||||
*
|
||||
* Used as array terminator in lzma_available_match_finders.
|
||||
*/
|
||||
|
||||
LZMA_MF_HC3 = 0x03,
|
||||
/**<
|
||||
* \brief Hash Chain with 3 bytes hashing
|
||||
*
|
||||
* \todo Memory requirements
|
||||
*
|
||||
* \note It's possible that this match finder gets
|
||||
* removed in future. The definition will stay
|
||||
* in this header, but liblzma may return
|
||||
* LZMA_HEADER_ERROR if it is specified (just
|
||||
* like it would if the match finder had been
|
||||
* disabled at compile time).
|
||||
*/
|
||||
|
||||
LZMA_MF_HC4 = 0x04,
|
||||
/**<
|
||||
* \brief Hash Chain with 4 bytes hashing
|
||||
*
|
||||
* Memory requirements: 7.5 * dictionary_size + 4 MiB
|
||||
*
|
||||
* \note It's possible that this match finder gets
|
||||
* removed in future. The definition will stay
|
||||
* in this header, but liblzma may return
|
||||
* LZMA_HEADER_ERROR if it is specified (just
|
||||
* like it would if the match finder had been
|
||||
* disabled at compile time).
|
||||
*/
|
||||
|
||||
LZMA_MF_BT2 = 0x12,
|
||||
/**<
|
||||
* \brief Binary Tree with 2 bytes hashing
|
||||
*
|
||||
* Memory requirements: 9.5 * dictionary_size + 4 MiB
|
||||
*/
|
||||
|
||||
LZMA_MF_BT3 = 0x13,
|
||||
/**<
|
||||
* \brief Binary Tree with 3 bytes hashing
|
||||
*
|
||||
* Memory requirements: 11.5 * dictionary_size + 4 MiB
|
||||
*/
|
||||
|
||||
LZMA_MF_BT4 = 0x14
|
||||
/**<
|
||||
* \brief Binary Tree with 4 bytes hashing
|
||||
*
|
||||
* Memory requirements: 11.5 * dictionary_size + 4 MiB
|
||||
*/
|
||||
} lzma_match_finder;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options specific to the LZMA method handler
|
||||
*/
|
||||
typedef struct {
|
||||
/**********************************
|
||||
* LZMA encoding/decoding options *
|
||||
**********************************/
|
||||
|
||||
/* These options are required in encoder and also with raw decoding. */
|
||||
|
||||
/**
|
||||
* \brief Dictionary size in bytes
|
||||
*
|
||||
* Dictionary size indicates how many bytes of the recently processed
|
||||
* uncompressed data is kept in memory. One method to reduce size of
|
||||
* the uncompressed data is to store distance-length pairs, which
|
||||
* indicate what data to repeat from the dictionary buffer. Thus,
|
||||
* the bigger the dictionary, the better compression ratio usually is.
|
||||
*
|
||||
* Raw decoding: Too big dictionary does no other harm than
|
||||
* wasting memory. This value is ignored by lzma_raw_decode_buffer(),
|
||||
* because it uses the target buffer as the dictionary.
|
||||
*/
|
||||
uint32_t dictionary_size;
|
||||
# define LZMA_DICTIONARY_SIZE_MIN 1
|
||||
# define LZMA_DICTIONARY_SIZE_MAX (UINT32_C(1) << 30)
|
||||
# define LZMA_DICTIONARY_SIZE_DEFAULT (UINT32_C(1) << 23)
|
||||
|
||||
/**
|
||||
* \brief Number of literal context bits
|
||||
*
|
||||
* How many of the highest bits of the previous uncompressed
|
||||
* eight-bit byte (also known as `literal') are taken into
|
||||
* account when predicting the bits of the next literal.
|
||||
*
|
||||
* \todo Example
|
||||
*/
|
||||
uint32_t literal_context_bits;
|
||||
# define LZMA_LITERAL_CONTEXT_BITS_MIN 0
|
||||
# define LZMA_LITERAL_CONTEXT_BITS_MAX 8
|
||||
# define LZMA_LITERAL_CONTEXT_BITS_DEFAULT 3
|
||||
|
||||
/**
|
||||
* \brief Number of literal position bits
|
||||
*
|
||||
* How many of the lowest bits of the current position (number
|
||||
* of bytes from the beginning of the uncompressed data) in the
|
||||
* uncompressed data is taken into account when predicting the
|
||||
* bits of the next literal (a single eight-bit byte).
|
||||
*
|
||||
* \todo Example
|
||||
*/
|
||||
uint32_t literal_pos_bits;
|
||||
# define LZMA_LITERAL_POS_BITS_MIN 0
|
||||
# define LZMA_LITERAL_POS_BITS_MAX 4
|
||||
# define LZMA_LITERAL_POS_BITS_DEFAULT 0
|
||||
|
||||
/**
|
||||
* \brief Number of position bits
|
||||
*
|
||||
* How many of the lowest bits of the current position in the
|
||||
* uncompressed data is taken into account when estimating
|
||||
* probabilities of matches. A match is a sequence of bytes for
|
||||
* which a matching sequence is found from the dictionary and
|
||||
* thus can be stored as distance-length pair.
|
||||
*
|
||||
* Example: If most of the matches occur at byte positions
|
||||
* of 8 * n + 3, that is, 3, 11, 19, ... set pos_bits to 3,
|
||||
* because 2**3 == 8.
|
||||
*/
|
||||
uint32_t pos_bits;
|
||||
# define LZMA_POS_BITS_MIN 0
|
||||
# define LZMA_POS_BITS_MAX 4
|
||||
# define LZMA_POS_BITS_DEFAULT 2
|
||||
|
||||
/**
|
||||
* \brief Pointer to an initial dictionary
|
||||
*
|
||||
* It is possible to initialize the LZ77 history window using
|
||||
* a preset dictionary. Here is a good quote from zlib's
|
||||
* documentation; this applies to LZMA as is:
|
||||
*
|
||||
* "The dictionary should consist of strings (byte sequences) that
|
||||
* are likely to be encountered later in the data to be compressed,
|
||||
* with the most commonly used strings preferably put towards the
|
||||
* end of the dictionary. Using a dictionary is most useful when
|
||||
* the data to be compressed is short and can be predicted with
|
||||
* good accuracy; the data can then be compressed better than
|
||||
* with the default empty dictionary."
|
||||
* (From deflateSetDictionary() in zlib.h of zlib version 1.2.3)
|
||||
*
|
||||
* This feature should be used only in special situations.
|
||||
* It works correctly only with raw encoding and decoding.
|
||||
* Currently none of the container formats supported by
|
||||
* liblzma allow preset dictionary when decoding, thus if
|
||||
* you create a .lzma file with preset dictionary, it cannot
|
||||
* be decoded with the regular .lzma decoder functions.
|
||||
*
|
||||
* \todo This feature is not implemented yet.
|
||||
*/
|
||||
const uint8_t *preset_dictionary;
|
||||
|
||||
/**
|
||||
* \brief Size of the preset dictionary
|
||||
*
|
||||
* Specifies the size of the preset dictionary. If the size is
|
||||
* bigger than dictionary_size, only the last dictionary_size
|
||||
* bytes are processed.
|
||||
*
|
||||
* This variable is read only when preset_dictionary is not NULL.
|
||||
*/
|
||||
uint32_t preset_dictionary_size;
|
||||
|
||||
/******************************************
|
||||
* LZMA options needed only when encoding *
|
||||
******************************************/
|
||||
|
||||
/** LZMA compression mode */
|
||||
lzma_mode mode;
|
||||
|
||||
/**
|
||||
* \brief Number of fast bytes
|
||||
*
|
||||
* Number of fast bytes determines how many bytes the encoder
|
||||
* compares from the match candidates when looking for the best
|
||||
* match. Bigger fast bytes value usually increase both compression
|
||||
* ratio and time.
|
||||
*/
|
||||
uint32_t fast_bytes;
|
||||
# define LZMA_FAST_BYTES_MIN 5
|
||||
# define LZMA_FAST_BYTES_MAX 273
|
||||
# define LZMA_FAST_BYTES_DEFAULT 128
|
||||
|
||||
/** Match finder ID */
|
||||
lzma_match_finder match_finder;
|
||||
|
||||
/**
|
||||
* \brief Match finder cycles
|
||||
*
|
||||
* Higher values give slightly better compression ratio but
|
||||
* decrease speed. Use special value 0 to let liblzma use
|
||||
* match-finder-dependent default value.
|
||||
*
|
||||
* \todo Write much better description.
|
||||
*/
|
||||
uint32_t match_finder_cycles;
|
||||
|
||||
} lzma_options_lzma;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Available LZMA encoding modes
|
||||
*
|
||||
* Pointer to an array containing the list of available encoding modes.
|
||||
*
|
||||
* This variable is available only if LZMA encoder has been enabled.
|
||||
*/
|
||||
extern const lzma_mode *const lzma_available_modes;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Available match finders
|
||||
*
|
||||
* Pointer to an array containing the list of available match finders.
|
||||
* The last element is LZMA_MF_INVALID.
|
||||
*
|
||||
* This variable is available only if LZMA encoder has been enabled.
|
||||
*/
|
||||
extern const lzma_match_finder *const lzma_available_match_finders;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Table of presets for the LZMA filter
|
||||
*
|
||||
* lzma_presets[0] is the fastest and lzma_preset_lzma[8] is the slowest.
|
||||
* These presets match the switches -1 .. -9 of the lzma command line tool
|
||||
*
|
||||
* The preset values are subject to changes between liblzma versions.
|
||||
*
|
||||
* This variable is available only if LZMA encoder has been enabled.
|
||||
*/
|
||||
extern const lzma_options_lzma lzma_preset_lzma[9];
|
|
@ -0,0 +1,157 @@
|
|||
/**
|
||||
* \file lzma/memlimit.h
|
||||
* \brief Memory usage limitter
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Opaque data type used with the memory usage limitting functions
|
||||
*/
|
||||
typedef struct lzma_memlimit_s lzma_memlimit;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Allocates and initializes a new lzma_memlimit structure
|
||||
*
|
||||
* It is easy to make liblzma to use huge amounts of memory. This can
|
||||
* be a problem especially with the decoder, since it a file requiring
|
||||
* huge amounts of memory to uncompress could allow even a denial of
|
||||
* service attack if the memory usage wasn't limited.
|
||||
*
|
||||
* liblzma provides a set of functions to control memory usage. Pointers
|
||||
* to these functions can be used in lzma_allocator structure, which makes
|
||||
* it easy to limit memory usage with liblzma.
|
||||
*
|
||||
* The memory limitter functions are not tied to limitting memory usage
|
||||
* with liblzma itself. You can use them with anything you like.
|
||||
*
|
||||
* In multi-threaded applications, only one thread at once may use the same
|
||||
* lzma_memlimit structure. If there is a need, this limitation may
|
||||
* be removed in future versions without breaking the libary API/ABI.
|
||||
*
|
||||
* \param limit Initial memory usage limit in bytes
|
||||
*
|
||||
* \return Pointer to allocated and initialized lzma_memlimit
|
||||
* structure. On error, NULL is returned. The reason behind
|
||||
* an error is either that malloc() failed or that the given
|
||||
* limit was so small that it didn't allow allocating even
|
||||
* the lzma_memlimit structure itself.
|
||||
*
|
||||
* \note Excluding lzma_memlimit_usage(), the functions whose name begin
|
||||
* lzma_memlimit_ can be used even if lzma_init() hasn't been
|
||||
* called.
|
||||
*/
|
||||
extern lzma_memlimit *lzma_memlimit_create(size_t limit);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Sets a new memory usage limit
|
||||
*
|
||||
* \param mem Pointer to a lzma_memlimit structure returned
|
||||
* earlier by lzma_memry_limit_create().
|
||||
* \param limit New memory usage limit
|
||||
*
|
||||
* The new usage limit may be smaller than the amount of memory currently
|
||||
* allocated via *mem: New allocations will fail until enough memory has
|
||||
* been freed or a new limit is set, but the existing allocatations will
|
||||
* stay untouched.
|
||||
*/
|
||||
extern void lzma_memlimit_set(lzma_memlimit *mem, size_t limit);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Gets the current memory usage limit
|
||||
*/
|
||||
extern size_t lzma_memlimit_get(const lzma_memlimit *mem);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Gets the amount of currently allocated memory
|
||||
*
|
||||
* \note This value includes the sizes of some helper structures,
|
||||
* thus it will always be larger than the total number of
|
||||
* bytes allocated via lzma_memlimit_alloc().
|
||||
*/
|
||||
extern size_t lzma_memlimit_used(const lzma_memlimit *mem);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Allocates memory with malloc() if memory limit allows
|
||||
*
|
||||
* \param mem Pointer to a lzma_memlimit structure returned
|
||||
* earlier by lzma_memry_limit_create().
|
||||
* \param nmemb Number of elements to allocate. While liblzma always
|
||||
* sets this to one, this function still takes the
|
||||
* value of nmemb into account to keep the function
|
||||
* usable with zlib and libbzip2.
|
||||
* \param size Size of an element.
|
||||
*
|
||||
* \return Pointer to memory allocated with malloc(nmemb * size),
|
||||
* except if nmemb * size == 0 which returns malloc(1).
|
||||
* On error, NULL is returned.
|
||||
*
|
||||
* \note This function assumes that nmemb * size is at maximum of
|
||||
* SIZE_MAX. If it isn't, an overflow will occur resulting
|
||||
* invalid amount of memory being allocated.
|
||||
*/
|
||||
extern void *lzma_memlimit_alloc(
|
||||
lzma_memlimit *mem, size_t nmemb, size_t size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Removes the pointer from memory limitting list
|
||||
*
|
||||
* \param mem Pointer to a lzma_memlimit structure returned
|
||||
* earlier by lzma_memry_limit_create().
|
||||
* \param ptr Pointer returned earlier by lzma_memlimit_alloc().
|
||||
*
|
||||
* This function removes ptr from the internal list and decreases the
|
||||
* counter of used memory accordingly. The ptr itself isn't freed. This is
|
||||
* useful when Extra Records allocated by liblzma using lzma_memlimit
|
||||
* are needed by the application and must not be freed when the
|
||||
* lzma_memlimit structure is destroyed.
|
||||
*
|
||||
* It is OK to call this function with ptr that hasn't been allocated with
|
||||
* lzma_memlimit_alloc(). In that case, this has no effect other than wasting
|
||||
* a few CPU cycles.
|
||||
*/
|
||||
extern void lzma_memlimit_detach(lzma_memlimit *mem, void *ptr);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Frees memory and updates the memory limit list
|
||||
*
|
||||
* This is like lzma_memlimit_detach() but also frees the given pointer.
|
||||
*/
|
||||
extern void lzma_memlimit_free(lzma_memlimit *mem, void *ptr);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Frees the memory allocated for and by the memory usage limitter
|
||||
*
|
||||
* \param mem Pointer to memory limitter
|
||||
* \param free_allocated If this is non-zero, all the memory allocated
|
||||
* by lzma_memlimit_alloc() using *mem is also
|
||||
* freed if it hasn't already been freed with
|
||||
* lzma_memlimit_free(). Usually this should be
|
||||
* set to true.
|
||||
*/
|
||||
extern void lzma_memlimit_end(
|
||||
lzma_memlimit *mem, lzma_bool free_allocated);
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* \file lzma/metadata.h
|
||||
* \brief Metadata handling
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Information stored into a Metadata Block
|
||||
*
|
||||
* This structure holds all the information that can be stored to
|
||||
* a Metadata Block.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Size of Header Metadata Block
|
||||
*/
|
||||
lzma_vli header_metadata_size;
|
||||
|
||||
/**
|
||||
* \brief Total Size of the Stream
|
||||
*/
|
||||
lzma_vli total_size;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed Size of the Stream
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief Index of the Blocks stored in the Stream
|
||||
*/
|
||||
lzma_index *index;
|
||||
|
||||
/**
|
||||
* \brief Extra information
|
||||
*/
|
||||
lzma_extra *extra;
|
||||
|
||||
} lzma_metadata;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Calculate the encoded size of Metadata
|
||||
*
|
||||
* \return Uncompressed size of the Metadata in encoded form. This value
|
||||
* may be passed to Block encoder as Uncompressed Size when using
|
||||
* Metadata filter. On error, zero is returned.
|
||||
*/
|
||||
extern lzma_vli lzma_metadata_size(const lzma_metadata *metadata);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Metadata encoder
|
||||
*
|
||||
* \param coder Pointer to a pointer to hold Metadata encoder's
|
||||
* internal state. Original value is ignored, thus
|
||||
* you don't need to initialize the pointer.
|
||||
* \param allocator Custom memory allocator; usually NULL.
|
||||
* \param metadata Pointer to Metadata to encoded
|
||||
*
|
||||
* \return - LZMA_OK: Initialization succeeded.
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory for *coder.
|
||||
*
|
||||
* The initialization function makes internal copy of the *metadata structure.
|
||||
* However, the linked lists metadata->index and metadata->extra are NOT
|
||||
* copied. Thus, the application may destroy *metadata after initialization
|
||||
* if it likes, but not Index or Extra.
|
||||
*/
|
||||
extern lzma_ret lzma_metadata_encoder(lzma_stream *strm,
|
||||
lzma_options_block *options, const lzma_metadata *metadata);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Metadata decoder
|
||||
*
|
||||
* \param want_extra If this is true, Extra Records will be stored
|
||||
* to metadata->extra. If this is false, Extra
|
||||
* Records will be parsed but not stored anywhere,
|
||||
* metadata->extra will be set to NULL.
|
||||
*/
|
||||
extern lzma_ret lzma_metadata_decoder(
|
||||
lzma_stream *strm, lzma_options_block *options,
|
||||
lzma_metadata *metadata, lzma_bool want_extra);
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* \file lzma/raw.h
|
||||
* \brief Raw encoder and decoder
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes raw encoder
|
||||
*
|
||||
* This function may be useful when implementing custom file formats.
|
||||
*
|
||||
* \param strm Pointer to properly prepared lzma_stream
|
||||
* \param options Array of lzma_options_filter structures.
|
||||
* The end of the array must be marked with
|
||||
* .id = LZMA_VLI_VALUE_UNKNOWN. The minimum
|
||||
* number of filters is zero; the maximum is
|
||||
* determined by available memory.
|
||||
* \param uncompressed_size
|
||||
* Size of the uncompressed data. If it is unknown,
|
||||
* use LZMA_VLI_VALUE_UNKNOWN. You need to give the
|
||||
* same value to the raw decoder to decode the data.
|
||||
* \param allow_implicit
|
||||
* If true, an implicit Copy or Subblock filter should be
|
||||
* automatically added when needed. If this is false and
|
||||
* an implicit filter would be needed, LZMA_PROG_ERROR is
|
||||
* returned.
|
||||
*
|
||||
* The `action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the
|
||||
* filter chain support it), or LZMA_FINISH.
|
||||
*
|
||||
* \return - LZMA_OK
|
||||
* - LZMA_MEM_ERROR
|
||||
* - LZMA_HEADER_ERROR
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_raw_encoder(
|
||||
lzma_stream *strm, const lzma_options_filter *options,
|
||||
lzma_vli uncompressed_size, lzma_bool allow_implicit);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes raw decoder
|
||||
*
|
||||
* The initialization of raw decoder goes similarly to raw encoder.
|
||||
*
|
||||
* The `action' with lzma_code() can be LZMA_RUN or LZMA_SYNC_FLUSH.
|
||||
*
|
||||
* \return - LZMA_OK
|
||||
* - LZMA_MEM_ERROR
|
||||
* - LZMA_HEADER_ERROR
|
||||
* - LZMA_PROG_ERROR
|
||||
*/
|
||||
extern lzma_ret lzma_raw_decoder(
|
||||
lzma_stream *strm, const lzma_options_filter *options,
|
||||
lzma_vli uncompressed_size, lzma_bool allow_implicit);
|
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* \file lzma/simple.h
|
||||
* \brief So called "simple" filters
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/* Filter IDs for lzma_options_filter.id */
|
||||
|
||||
#define LZMA_FILTER_X86 LZMA_VLI_C(0x04)
|
||||
/**<
|
||||
* BCJ (Branch, Call, Jump) filter for x86 binaries
|
||||
*/
|
||||
|
||||
#define LZMA_FILTER_POWERPC LZMA_VLI_C(0x05)
|
||||
/**<
|
||||
* Filter for Big endian PowerPC binaries
|
||||
*/
|
||||
|
||||
#define LZMA_FILTER_IA64 LZMA_VLI_C(0x06)
|
||||
/**<
|
||||
* Filter for IA64 (Itanium) binaries.
|
||||
*/
|
||||
|
||||
#define LZMA_FILTER_ARM LZMA_VLI_C(0x07)
|
||||
/**<
|
||||
* Filter for ARM binaries.
|
||||
*/
|
||||
|
||||
#define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08)
|
||||
/**<
|
||||
* Filter for ARMThumb binaries.
|
||||
*/
|
||||
|
||||
#define LZMA_FILTER_SPARC LZMA_VLI_C(0x09)
|
||||
/**<
|
||||
* Filter for SPARC binaries.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for so called "simple" filters
|
||||
*
|
||||
* The simple filters never change the size of the data. Specifying options
|
||||
* for them is optional: if pointer to options is NULL, default values are
|
||||
* used. You probably never need to specify these options, so just set the
|
||||
* options pointer to NULL and be happy.
|
||||
*
|
||||
* If options with non-default values have been specified when encoding,
|
||||
* the same options must also be specified when decoding.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Start offset for branch conversions
|
||||
*
|
||||
* This setting is useful only when the same filter is used
|
||||
* _separately_ for multiple sections of the same executable file,
|
||||
* and the sections contain cross-section branch/call/jump
|
||||
* instructions. In that case it is benefical to set the start
|
||||
* offset of the non-first sections so that the relative addresses
|
||||
* of the cross-section branch/call/jump instructions will use the
|
||||
* same absolute addresses as in the first section.
|
||||
*
|
||||
* When the pointer to options is NULL, the default value is used.
|
||||
* The default value is zero.
|
||||
*/
|
||||
uint32_t start_offset;
|
||||
|
||||
} lzma_options_simple;
|
|
@ -0,0 +1,178 @@
|
|||
/**
|
||||
* \file lzma/stream.h
|
||||
* \brief .lzma Stream handling
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for .lzma Stream encoder
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* \brief Type of integrity Check
|
||||
*
|
||||
* The type of the integrity Check is stored into Stream Header
|
||||
* and Stream Footer. The same Check is used for all Blocks in
|
||||
* the Stream.
|
||||
*/
|
||||
lzma_check_type check;
|
||||
|
||||
/**
|
||||
* \brief Precense of CRC32 of the Block Header
|
||||
*
|
||||
* Set this to true if CRC32 of every Block Header should be
|
||||
* calculated and stored in the Block Header. This is recommended.
|
||||
*
|
||||
* This setting is stored into Stream Header and Stream Footer.
|
||||
*/
|
||||
lzma_bool has_crc32;
|
||||
|
||||
/**
|
||||
* \brief Uncompressed Size in bytes
|
||||
*
|
||||
* This is somewhat advanced feature. Most users want to set this to
|
||||
* LZMA_VLI_VALUE_UNKNOWN to indicate unknown Uncompressed Size.
|
||||
*
|
||||
* If the Uncompressed Size of the Stream being encoded is known,
|
||||
* it can be stored to the beginning of the Stream. The details
|
||||
* differ for Single-Block and Multi-Block Streams:
|
||||
* - With Single-Block Streams, the Uncompressed Size is stored to
|
||||
* the Block Header and End of Payload Marker is omitted.
|
||||
* - With Multi-Block Streams, the Uncompressed Size is stored to
|
||||
* the Header Metadata Block. The Uncompressed Size of the Blocks
|
||||
* will be unknown, because liblzma cannot predict how the
|
||||
* application is going to split the data in Blocks.
|
||||
*/
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/**
|
||||
* \brief Alignment of the beginning of the Stream
|
||||
*
|
||||
* Certain filters handle data in bigger chunks than single bytes.
|
||||
* This affects two things:
|
||||
* - Performance: aligned memory access is usually faster.
|
||||
* - Further compression ratio in custom file formats: if you
|
||||
* encode multiple Blocks with some non-compression filter
|
||||
* such as LZMA_FILTER_POWERPC, it is a good idea to keep
|
||||
* the inter-Block alignment correct to maximize compression
|
||||
* ratio when all these Blocks are finally compressed as a
|
||||
* single step.
|
||||
*
|
||||
* Usually the Stream is stored into its own file, thus
|
||||
* the alignment is usually zero.
|
||||
*/
|
||||
uint32_t alignment;
|
||||
|
||||
/**
|
||||
* \brief Array of filters used to encode Data Blocks
|
||||
*
|
||||
* There can be at maximum of seven filters. The end of the array is
|
||||
* marked with .id = LZMA_VLI_VALUE_UNKNOWN. (That's why the array
|
||||
* has eight members.) Minimum number of filters is zero; in that
|
||||
* case, an implicit Copy filter is used.
|
||||
*/
|
||||
lzma_options_filter filters[8];
|
||||
|
||||
/**
|
||||
* \brief Array of filters used to encode Metadata Blocks
|
||||
*
|
||||
* This is like filters[] but for Metadata Blocks. If Metadata
|
||||
* Blocks are compressed, they usually are compressed with
|
||||
* settings that require only little memory to uncompress e.g.
|
||||
* LZMA with 64 KiB dictionary.
|
||||
*
|
||||
* \todo Recommend a preset.
|
||||
*
|
||||
* When liblzma sees that the Metadata Block would be very small
|
||||
* even in uncompressed form, it is not compressed no matter
|
||||
* what filter have been set here. This is to avoid possibly
|
||||
* increasing the size of the Metadata Block with bad compression,
|
||||
* and to avoid useless overhead of filters in uncompression phase.
|
||||
*/
|
||||
lzma_options_filter metadata_filters[8];
|
||||
|
||||
/**
|
||||
* \brief Extra information in the Header Metadata Block
|
||||
*/
|
||||
lzma_extra *header;
|
||||
|
||||
/**
|
||||
* \brief Extra information in the Footer Metadata Block
|
||||
*
|
||||
* It is enough to set this pointer any time before calling
|
||||
* lzma_code() with LZMA_FINISH as the second argument.
|
||||
*/
|
||||
lzma_extra *footer;
|
||||
|
||||
} lzma_options_stream;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Single-Block .lzma Stream encoder
|
||||
*
|
||||
* This is the function that most developers are looking for. :-) It
|
||||
* compresses using the specified options without storing any extra
|
||||
* information.
|
||||
*
|
||||
* \todo Describe that is_metadata is ignored, maybe something else.
|
||||
*/
|
||||
extern lzma_ret lzma_stream_encoder_single(
|
||||
lzma_stream *strm, const lzma_options_stream *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Multi-Block .lzma Stream encoder
|
||||
*
|
||||
*/
|
||||
extern lzma_ret lzma_stream_encoder_multi(
|
||||
lzma_stream *strm, const lzma_options_stream *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes decoder for .lzma Stream
|
||||
*
|
||||
* \param strm Pointer to propertily prepared lzma_stream
|
||||
* \param header Pointer to hold a pointer to Extra Records read
|
||||
* from the Header Metadata Block. Use NULL if
|
||||
* you don't care about Extra Records.
|
||||
* \param footer Same as header, but for Footer Metadata Block.
|
||||
*
|
||||
* \return - LZMA_OK: Initialization was successful.
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory.
|
||||
*
|
||||
* If header and/or footer are not NULL, *header and/or *footer will be
|
||||
* initially set to NULL.
|
||||
*
|
||||
* The application can detect that Header Metadata Block has been completely
|
||||
* parsed when the decoder procudes some output the first time. If *header
|
||||
* is still NULL, there was no Extra field in the Header Metadata Block (or
|
||||
* the whole Header Metadata Block wasn't present at all).
|
||||
*
|
||||
* The application can detect that Footer Metadata Block has been parsed
|
||||
* completely when lzma_code() returns LZMA_STREAM_END. If *footer is still
|
||||
* NULL, there was no Extra field in the Footer Metadata Block.
|
||||
*
|
||||
* \note If you use lzma_memory_limitter, the Extra Records will be
|
||||
* allocated with it, and thus remain in the lzma_memory_limitter
|
||||
* even after they get exported to the application via *header
|
||||
* and *footer pointers.
|
||||
*/
|
||||
extern lzma_ret lzma_stream_decoder(lzma_stream *strm,
|
||||
lzma_extra **header, lzma_extra **footer);
|
|
@ -0,0 +1,142 @@
|
|||
/**
|
||||
* \file lzma/stream_flags.h
|
||||
* \brief .lzma Stream Header and Stream tail encoder and decoder
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Size of Stream Header
|
||||
*
|
||||
* Magic Bytes (6) + Stream Flags (1) + CRC32 (4)
|
||||
*/
|
||||
#define LZMA_STREAM_HEADER_SIZE (6 + 1 + 4)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Size of Stream tail
|
||||
*
|
||||
* Because Stream Footer already has a defined meaning in the file format
|
||||
* specification, we use Stream tail to denote these two fields:
|
||||
* Stream Flags (1) + Magic Bytes (2)
|
||||
*/
|
||||
#define LZMA_STREAM_TAIL_SIZE (1 + 2)
|
||||
|
||||
|
||||
/**
|
||||
* Options for encoding and decoding Stream Header and Stream tail
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* Type of the Check calculated from uncompressed data
|
||||
*/
|
||||
lzma_check_type check;
|
||||
|
||||
/**
|
||||
* True if Block Headers have the CRC32 field. Note that the CRC32
|
||||
* field is always present in the Stream Header.
|
||||
*/
|
||||
lzma_bool has_crc32;
|
||||
|
||||
/**
|
||||
* True if the Stream is a Multi-Block Stream.
|
||||
*/
|
||||
lzma_bool is_multi;
|
||||
|
||||
} lzma_stream_flags;
|
||||
|
||||
|
||||
#define lzma_stream_flags_is_equal(a, b) \
|
||||
((a).check == (b).check \
|
||||
&& (a).has_crc32 == (b).has_crc32 \
|
||||
&& (a).is_multi == (b).is_multi)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes Stream Header
|
||||
*
|
||||
* Encoding of the Stream Header is done with a single call instead of
|
||||
* first initializing and then doing the actual work with lzma_code().
|
||||
*
|
||||
* \param out Beginning of the output buffer
|
||||
* \param out_pos out[*out_pos] is the next write position. This
|
||||
* is updated by the encoder.
|
||||
* \param out_size out[out_size] is the first byte to not write.
|
||||
* \param options Stream Header options to be encoded.
|
||||
*
|
||||
* \return - LZMA_OK: Encoding was successful.
|
||||
* - LZMA_PROG_ERROR: Invalid options.
|
||||
* - LZMA_BUF_ERROR: Not enough output buffer space.
|
||||
*/
|
||||
extern lzma_ret lzma_stream_header_encode(
|
||||
uint8_t *out, const lzma_stream_flags *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes Stream tail
|
||||
*
|
||||
* \param footer Pointer to a pointer that will hold the
|
||||
* allocated buffer. Caller must free it once
|
||||
* it isn't needed anymore.
|
||||
* \param footer_size Pointer to a variable that will the final size
|
||||
* of the footer buffer.
|
||||
* \param allocator lzma_allocator for custom allocator functions.
|
||||
* Set to NULL to use malloc().
|
||||
* \param options Stream Header options to be encoded.
|
||||
*
|
||||
* \return - LZMA_OK: Success; *header and *header_size set.
|
||||
* - LZMA_PROG_ERROR: *options is invalid.
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory.
|
||||
*/
|
||||
extern lzma_ret lzma_stream_tail_encode(
|
||||
uint8_t *out, const lzma_stream_flags *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Stream Header decoder
|
||||
*
|
||||
* \param strm Pointer to lzma_stream used to pass input data
|
||||
* \param options Target structure for parsed results
|
||||
*
|
||||
* \return - LZMA_OK: Successfully initialized
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory
|
||||
*
|
||||
* The actual decoding is done with lzma_code() and freed with lzma_end().
|
||||
*/
|
||||
extern lzma_ret lzma_stream_header_decoder(
|
||||
lzma_stream *strm, lzma_stream_flags *options);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Initializes Stream tail decoder
|
||||
*
|
||||
* \param strm Pointer to lzma_stream used to pass input data
|
||||
* \param options Target structure for parsed results.
|
||||
* \param decode_uncompressed_size
|
||||
* Set to true if the first field to decode is
|
||||
* Uncompressed Size. Set to false if the first
|
||||
* field to decode is Backward Size.
|
||||
*
|
||||
* \return - LZMA_OK: Successfully initialized
|
||||
* - LZMA_MEM_ERROR: Cannot allocate memory
|
||||
*
|
||||
* The actual decoding is done with lzma_code() and freed with lzma_end().
|
||||
*/
|
||||
extern lzma_ret lzma_stream_tail_decoder(
|
||||
lzma_stream *strm, lzma_stream_flags *options);
|
|
@ -0,0 +1,197 @@
|
|||
/**
|
||||
* \file lzma/subblock.h
|
||||
* \brief Subblock filter
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Filter ID
|
||||
*
|
||||
* Filter ID of the Subblock filter. This is used as lzma_options_filter.id.
|
||||
*/
|
||||
#define LZMA_FILTER_SUBBLOCK LZMA_VLI_C(0x01)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Subfilter mode
|
||||
*
|
||||
* See lzma_options_subblock.subfilter_mode for details.
|
||||
*/
|
||||
typedef enum {
|
||||
LZMA_SUBFILTER_NONE,
|
||||
/**<
|
||||
* No Subfilter is in use.
|
||||
*/
|
||||
|
||||
LZMA_SUBFILTER_SET,
|
||||
/**<
|
||||
* New Subfilter has been requested to be initialized.
|
||||
*/
|
||||
|
||||
LZMA_SUBFILTER_RUN,
|
||||
/**<
|
||||
* Subfilter is active.
|
||||
*/
|
||||
|
||||
LZMA_SUBFILTER_FINISH
|
||||
/**<
|
||||
* Subfilter has been requested to be finished.
|
||||
*/
|
||||
} lzma_subfilter_mode;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Options for the Subblock filter
|
||||
*
|
||||
* Specifying options for the Subblock filter is optional: if the pointer
|
||||
* options is NULL, no subfilters are allowed and the default value is used
|
||||
* for subblock_data_size.
|
||||
*/
|
||||
typedef struct {
|
||||
/* Options for encoder and decoder */
|
||||
|
||||
/**
|
||||
* \brief Allowing subfilters
|
||||
*
|
||||
* If this true, subfilters are allowed.
|
||||
*
|
||||
* In the encoder, if this is set to false, subfilter_mode and
|
||||
* subfilter_options are completely ignored.
|
||||
*/
|
||||
lzma_bool allow_subfilters;
|
||||
|
||||
/* Options for encoder only */
|
||||
|
||||
/**
|
||||
* \brief Alignment
|
||||
*
|
||||
* The Subblock filter encapsulates the input data into Subblocks.
|
||||
* Each Subblock has a header which takes a few bytes of space.
|
||||
* When the output of the Subblock encoder is fed to another filter
|
||||
* that takes advantage of the alignment of the input data (e.g. LZMA),
|
||||
* the Subblock filter can add padding to keep the actual data parts
|
||||
* in the Subblocks aligned correctly.
|
||||
*
|
||||
* The alignment should be a positive integer. Subblock filter will
|
||||
* add enough padding between Subblocks so that this is true for
|
||||
* every payload byte:
|
||||
* input_offset % alignment == output_offset % alignment
|
||||
*
|
||||
* The Subblock filter assumes that the first output byte will be
|
||||
* written to a position in the output stream that is properly aligned.
|
||||
*
|
||||
* FIXME desc
|
||||
*/
|
||||
uint32_t alignment;
|
||||
# define LZMA_SUBBLOCK_ALIGNMENT_MIN 1
|
||||
# define LZMA_SUBBLOCK_ALIGNMENT_MAX 32
|
||||
# define LZMA_SUBBLOCK_ALIGNMENT_DEFAULT 4
|
||||
|
||||
/**
|
||||
* \brief Size of the Subblock Data part of each Subblock
|
||||
*
|
||||
* This value is re-read every time a new Subblock is started.
|
||||
*
|
||||
* Bigger values
|
||||
* - save a few bytes of space;
|
||||
* - increase latency in the encoder (but no effect for decoding);
|
||||
* - decrease memory locality (increased cache pollution) in the
|
||||
* encoder (no effect in decoding).
|
||||
*/
|
||||
uint32_t subblock_data_size;
|
||||
# define LZMA_SUBBLOCK_DATA_SIZE_MIN 1
|
||||
# define LZMA_SUBBLOCK_DATA_SIZE_MAX (UINT32_C(1) << 28)
|
||||
# define LZMA_SUBBLOCK_DATA_SIZE_DEFAULT 4096
|
||||
|
||||
/**
|
||||
* \brief Run-length encoder remote control
|
||||
*
|
||||
* The Subblock filter has an internal run-length encoder (RLE). It
|
||||
* can be useful when the data includes byte sequences that repeat
|
||||
* very many times. The RLE can be used also when a Subfilter is
|
||||
* in use; the RLE will be applied to the output of the Subfilter.
|
||||
*
|
||||
* Note that in contrast to traditional RLE, this RLE is intended to
|
||||
* be used only when there's a lot of data to be repeated. If the
|
||||
* input data has e.g. 500 bytes of NULs now and then, this RLE
|
||||
* is probably useless, because plain LZMA should provide better
|
||||
* results.
|
||||
*
|
||||
* Due to above reasons, it was decided to keep the implementation
|
||||
* of the RLE very simple. When the rle variable is non-zero, it
|
||||
* subblock_data_size must be a multiple of rle. Once the Subblock
|
||||
* encoder has got subblock_data_size bytes of input, it will check
|
||||
* if the whole buffer of the last subblock_data_size can be
|
||||
* represented with repeats of chunks having size of rle bytes.
|
||||
*
|
||||
* If there are consecutive identical buffers of subblock_data_size
|
||||
* bytes, they will be encoded using a single repeat entry if
|
||||
* possible.
|
||||
*
|
||||
* If need arises, more advanced RLE can be implemented later
|
||||
* without breaking API or ABI.
|
||||
*/
|
||||
uint32_t rle;
|
||||
# define LZMA_SUBBLOCK_RLE_OFF 0
|
||||
# define LZMA_SUBBLOCK_RLE_MIN 1
|
||||
# define LZMA_SUBBLOCK_RLE_MAX 256
|
||||
|
||||
/**
|
||||
* \brief Subfilter remote control
|
||||
*
|
||||
* When the Subblock filter is initialized, this variable must be
|
||||
* LZMA_SUBFILTER_NONE or LZMA_SUBFILTER_SET.
|
||||
*
|
||||
* When subfilter_mode is LZMA_SUBFILTER_NONE, the application may
|
||||
* put Subfilter options to subfilter_options structure, and then
|
||||
* set subfilter_mode to LZMA_SUBFILTER_SET. This implies setting
|
||||
* flush to true. No new input data will be read until the Subfilter
|
||||
* has been enabled. Once the Subfilter has been enabled, liblzma
|
||||
* will set subfilter_mode to LZMA_SUBFILTER_RUN.
|
||||
*
|
||||
* When subfilter_mode is LZMA_SUBFILTER_RUN, the application may
|
||||
* set subfilter_mode to LZMA_SUBFILTER_FINISH. No new input data
|
||||
* will be read until the Subfilter has been finished. Once the
|
||||
* Subfilter has been finished, liblzma will set subfilter_mode
|
||||
* to LZMA_SUBFILTER_NONE.
|
||||
*
|
||||
* If the intent is to have Subfilter enabled to the very end of
|
||||
* the data, it is not needed to separately disable Subfilter with
|
||||
* LZMA_SUBFILTER_FINISH. Using LZMA_FINISH as the second argument
|
||||
* of lzma_code() will make the Subblock encoder to disable the
|
||||
* Subfilter once all the data has been ran through the Subfilter.
|
||||
*
|
||||
* \note This variable is ignored if allow_subfilters is false.
|
||||
*/
|
||||
lzma_subfilter_mode subfilter_mode;
|
||||
|
||||
/**
|
||||
* \brief Subfilter and its options
|
||||
*
|
||||
* When no Subfilter is used, the data is copied as is into Subblocks.
|
||||
* Setting a Subfilter allows encoding some parts of the data with
|
||||
* an additional filter. It is possible to many different Subfilters
|
||||
* in the same Block, although only one can be used at once.
|
||||
*
|
||||
* \note This variable is ignored if allow_subfilters is false.
|
||||
*/
|
||||
lzma_options_filter subfilter_options;
|
||||
|
||||
} lzma_options_subblock;
|
|
@ -0,0 +1,59 @@
|
|||
/**
|
||||
* \file lzma/version.h
|
||||
* \brief Version number
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Compile-time version number
|
||||
*
|
||||
* The version number is of format xyyyuuus where
|
||||
* - x is the major LZMA SDK version
|
||||
* - yyy is the minor LZMA SDK version
|
||||
* - uuu is LZMA Utils version (reset to zero every time SDK version
|
||||
* is incremented)
|
||||
* - s indicates stability: 0 = alpha, 1 = beta, 2 = stable
|
||||
*/
|
||||
#define LZMA_VERSION UINT32_C(40420010)
|
||||
|
||||
|
||||
/**
|
||||
* \brief liblzma version number as an integer
|
||||
*
|
||||
* This is the value of LZMA_VERSION macro at the compile time of liblzma.
|
||||
* This allows the application to compare if it was built against the same,
|
||||
* older, or newer version of liblzma that is currently running.
|
||||
*/
|
||||
extern const uint32_t lzma_version_number;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Returns versions number of liblzma as a string
|
||||
*
|
||||
* This function may be useful if you want to display which version of
|
||||
* libilzma your application is currently using.
|
||||
*
|
||||
* \return Returns a pointer to a statically allocated string constant,
|
||||
* which contains the version number of liblzma. The format of
|
||||
* the version string is usually (but not necessarily) x.y.z
|
||||
* e.g. "4.42.1". Alpha and beta versions contain a suffix
|
||||
* ("4.42.0alpha").
|
||||
*/
|
||||
extern const char *const lzma_version_string;
|
|
@ -0,0 +1,244 @@
|
|||
/**
|
||||
* \file lzma/vli.h
|
||||
* \brief Variable-length integer handling
|
||||
*
|
||||
* \author Copyright (C) 1999-2006 Igor Pavlov
|
||||
* \author Copyright (C) 2007 Lasse Collin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LZMA_H_INTERNAL
|
||||
# error Never include this file directly. Use <lzma.h> instead.
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \brief Maximum supported value of variable-length integer
|
||||
*/
|
||||
#define LZMA_VLI_VALUE_MAX (UINT64_MAX / 2)
|
||||
|
||||
/**
|
||||
* \brief VLI value to denote that the value is unknown
|
||||
*/
|
||||
#define LZMA_VLI_VALUE_UNKNOWN UINT64_MAX
|
||||
|
||||
/**
|
||||
* \brief Maximum supported length of variable length integers
|
||||
*/
|
||||
#define LZMA_VLI_BYTES_MAX 9
|
||||
|
||||
|
||||
/**
|
||||
* \brief VLI constant suffix
|
||||
*/
|
||||
#define LZMA_VLI_C(n) UINT64_C(n)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Variable-length integer type
|
||||
*
|
||||
* This will always be unsigned integer. Valid VLI values are in the range
|
||||
* [0, LZMA_VLI_VALUE_MAX]. Unknown value is indicated with
|
||||
* LZMA_VLI_VALUE_UNKNOWN, which is the maximum value of the underlaying
|
||||
* integer type (this feature is useful in several situations).
|
||||
*
|
||||
* In future, even if lzma_vli is typdefined to something else than uint64_t,
|
||||
* it is guaranteed that 2 * LZMA_VLI_VALUE_MAX will not overflow lzma_vli.
|
||||
* This simplifies integer overflow detection.
|
||||
*/
|
||||
typedef uint64_t lzma_vli;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Simple macro to validate variable-length integer
|
||||
*
|
||||
* This is useful to test that application has given acceptable values
|
||||
* for example in the uncompressed_size and compressed_size variables.
|
||||
*
|
||||
* \return True if the integer is representable as VLI or if it
|
||||
* indicates unknown value.
|
||||
*/
|
||||
#define lzma_vli_is_valid(vli) \
|
||||
((vli) <= LZMA_VLI_VALUE_MAX || (vli) == LZMA_VLI_VALUE_UNKNOWN)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Sets VLI to given value with error checking
|
||||
*
|
||||
* \param dest Target variable which must have type of lzma_vli.
|
||||
* \param src New value to be stored to dest.
|
||||
* \param limit Maximum allowed value for src.
|
||||
*
|
||||
* \return False on success, true on error. If an error occurred,
|
||||
* dest is left in undefined state (i.e. it's possible that
|
||||
* it will be different in newer liblzma versions).
|
||||
*/
|
||||
#define lzma_vli_set_lim(dest, src, limit) \
|
||||
((src) > (limit) || ((dest) = (src)) > (limit))
|
||||
|
||||
/**
|
||||
* \brief
|
||||
*/
|
||||
#define lzma_vli_add_lim(dest, src, limit) \
|
||||
((src) > (limit) || ((dest) += (src)) > (limit))
|
||||
|
||||
#define lzma_vli_add2_lim(dest, src1, src2, limit) \
|
||||
(lzma_vli_add_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit))
|
||||
|
||||
#define lzma_vli_add3_lim(dest, src1, src2, src3, limit) \
|
||||
(lzma_vli_add_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit) \
|
||||
|| lzma_vli_add_lim(dest, src3, limit))
|
||||
|
||||
#define lzma_vli_add4_lim(dest, src1, src2, src3, src4, limit) \
|
||||
(lzma_vli_add_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit) \
|
||||
|| lzma_vli_add_lim(dest, src3, limit) \
|
||||
|| lzma_vli_add_lim(dest, src4, limit))
|
||||
|
||||
#define lzma_vli_sum_lim(dest, src1, src2, limit) \
|
||||
(lzma_vli_set_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit))
|
||||
|
||||
#define lzma_vli_sum3_lim(dest, src1, src2, src3, limit) \
|
||||
(lzma_vli_set_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit) \
|
||||
|| lzma_vli_add_lim(dest, src3, limit))
|
||||
|
||||
#define lzma_vli_sum4_lim(dest, src1, src2, src3, src4, limit) \
|
||||
(lzma_vli_set_lim(dest, src1, limit) \
|
||||
|| lzma_vli_add_lim(dest, src2, limit) \
|
||||
|| lzma_vli_add_lim(dest, src3, limit) \
|
||||
|| lzma_vli_add_lim(dest, src4, limit))
|
||||
|
||||
#define lzma_vli_set(dest, src) lzma_vli_set_lim(dest, src, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_add(dest, src) lzma_vli_add_lim(dest, src, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_add2(dest, src1, src2) \
|
||||
lzma_vli_add2_lim(dest, src1, src2, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_add3(dest, src1, src2, src3) \
|
||||
lzma_vli_add3_lim(dest, src1, src2, src3, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_add4(dest, src1, src2, src3, src4) \
|
||||
lzma_vli_add4_lim(dest, src1, src2, src3, src4, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_sum(dest, src1, src2) \
|
||||
lzma_vli_sum_lim(dest, src1, src2, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_sum3(dest, src1, src2, src3) \
|
||||
lzma_vli_sum3_lim(dest, src1, src2, src3, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
#define lzma_vli_sum4(dest, src1, src2, src3, src4) \
|
||||
lzma_vli_sum4_lim(dest, src1, src2, src3, src4, LZMA_VLI_VALUE_MAX)
|
||||
|
||||
|
||||
/**
|
||||
* \brief Encodes variable-length integer
|
||||
*
|
||||
* In the new .lzma format, most integers are encoded in variable-length
|
||||
* representation. This saves space when smaller values are more likely
|
||||
* than bigger values.
|
||||
*
|
||||
* The encoding scheme encodes seven bits to every byte, using minimum
|
||||
* number of bytes required to represent the given value. In other words,
|
||||
* it puts 7-63 bits into 1-9 bytes. This implementation limits the number
|
||||
* of bits used to 63, thus num must be at maximum of INT64_MAX / 2. You
|
||||
* may use LZMA_VLI_VALUE_MAX for clarity.
|
||||
*
|
||||
* \param vli Integer to be encoded
|
||||
* \param vli_pos How many bytes have already been written out. This
|
||||
* must be less than 9 before calling this function.
|
||||
* \param vli_size Minimum size that the variable-length representation
|
||||
* must take. This is useful if you want to use
|
||||
* variable-length integers as padding. Usually you want
|
||||
* to set this to zero. The maximum allowed value is 9.
|
||||
* \param out Beginning of the output buffer
|
||||
* \param out_pos The next byte will be written to out[*out_pos].
|
||||
* \param out_size Size of the out buffer; the first byte into
|
||||
* which no data is written to is out[out_size].
|
||||
*
|
||||
* \return - LZMA_OK: So far all OK, but the integer is not
|
||||
* completely written out yet.
|
||||
* - LZMA_STREAM_END: Integer successfully encoded.
|
||||
* - LZMA_BUF_ERROR: No output space (*out_pos == out_size)
|
||||
* - LZMA_PROG_ERROR: Arguments are not sane.
|
||||
*/
|
||||
extern lzma_ret lzma_vli_encode(
|
||||
lzma_vli vli, size_t *lzma_restrict vli_pos, size_t vli_size,
|
||||
uint8_t *lzma_restrict out, size_t *lzma_restrict out_pos,
|
||||
size_t out_size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Decodes variable-length integer
|
||||
*
|
||||
* \param vli Pointer to decoded integer. The decoder will
|
||||
* initialize it to zero when *vli_pos == 0, so
|
||||
* application isn't required to initialize *vli.
|
||||
* \param vli_pos How many bytes have already been decoded. When
|
||||
* starting to decode a new integer, *vli_pos must
|
||||
* be initialized to zero.
|
||||
* \param in Beginning of the input buffer
|
||||
* \param in_pos The next byte will be read from in[*in_pos].
|
||||
* \param in_size Size of the input buffer; the first byte that
|
||||
* won't be read is in[in_size].
|
||||
*
|
||||
* \return - LZMA_OK: So far all OK, but the integer is not
|
||||
* completely decoded yet.
|
||||
* - LZMA_STREAM_END: Integer successfully decoded.
|
||||
* - LZMA_BUF_ERROR: No input data (*in_pos == in_size)
|
||||
* - LZMA_DATA_ERROR: Integer is longer than nine bytes.
|
||||
* - LZMA_PROG_ERROR: Arguments are not sane.
|
||||
*/
|
||||
extern lzma_ret lzma_vli_decode(lzma_vli *lzma_restrict vli,
|
||||
size_t *lzma_restrict vli_pos, const uint8_t *lzma_restrict in,
|
||||
size_t *lzma_restrict in_pos, size_t in_size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Decodes variable-length integer reading buffer backwards
|
||||
*
|
||||
* The variable-length integer encoding is designed so that it can be read
|
||||
* either from the beginning to the end, or from the end to the beginning.
|
||||
* This feature is needed to make the Stream parseable backwards;
|
||||
* specifically, to read the Backward Size field in Stream Footer.
|
||||
*
|
||||
* \param vli Pointer to variable to hold the decoded integer.
|
||||
* \param in Beginning of the input buffer
|
||||
* \param in_size Number of bytes available in the in[] buffer.
|
||||
* On successful decoding, this is updated to match
|
||||
* the number of bytes used. (in[*in_size - 1] is the
|
||||
* first byte to process. After successful decoding,
|
||||
* in[*in_size] will point to the first byte of the
|
||||
* variable-length integer.)
|
||||
*
|
||||
* \return - LZMA_OK: Decoding successful
|
||||
* - LZMA_DATA_ERROR: No valid variable-length integer was found.
|
||||
* - LZMA_BUF_ERROR: Not enough input. Note that in practice,
|
||||
* this tends to be a sign of broken input, because the
|
||||
* applications usually do give as much input to this function
|
||||
* as the applications have available.
|
||||
*/
|
||||
extern lzma_ret lzma_vli_reverse_decode(
|
||||
lzma_vli *vli, const uint8_t *in, size_t *in_size);
|
||||
|
||||
|
||||
/**
|
||||
* \brief Gets the minimum number of bytes required to encode vli
|
||||
*
|
||||
* \return Number of bytes on success (1-9). If vli isn't valid,
|
||||
* zero is returned.
|
||||
*/
|
||||
extern size_t lzma_vli_size(lzma_vli vli);
|
|
@ -0,0 +1,64 @@
|
|||
##
|
||||
## This code has been put into the public domain.
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
EXTRA_DIST = crc32_tablegen.c crc64_tablegen.c
|
||||
|
||||
noinst_LTLIBRARIES = libcheck.la
|
||||
libcheck_la_SOURCES = \
|
||||
check.c \
|
||||
check.h \
|
||||
check_init.c \
|
||||
check_byteswap.h \
|
||||
crc_macros.h
|
||||
libcheck_la_CPPFLAGS = \
|
||||
-I@top_srcdir@/src/liblzma/api \
|
||||
-I@top_srcdir@/src/liblzma/common
|
||||
|
||||
if COND_CHECK_CRC32
|
||||
|
||||
if COND_ASM_X86
|
||||
libcheck_la_SOURCES += crc32_x86.s
|
||||
else
|
||||
libcheck_la_SOURCES += crc32.c
|
||||
endif
|
||||
|
||||
if COND_SMALL
|
||||
libcheck_la_SOURCES += crc32_init.c
|
||||
else
|
||||
libcheck_la_SOURCES += crc32_table.c crc32_table_le.h crc32_table_be.h
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
if COND_CHECK_CRC64
|
||||
|
||||
if COND_ASM_X86
|
||||
libcheck_la_SOURCES += crc64_x86.s
|
||||
else
|
||||
libcheck_la_SOURCES += crc64.c
|
||||
endif
|
||||
|
||||
if COND_SMALL
|
||||
libcheck_la_SOURCES += crc64_init.c
|
||||
else
|
||||
libcheck_la_SOURCES += crc64_table.c crc64_table_le.h crc64_table_be.h
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
if COND_CHECK_SHA256
|
||||
libcheck_la_SOURCES += sha256.c
|
||||
# Hide bogus warning to allow usage of -Werror. If more issues like this
|
||||
# pop up, we'll drop -Werror.
|
||||
if COND_WNO_UNINITIALIZED
|
||||
CFLAGS += -Wno-uninitialized
|
||||
endif
|
||||
endif
|
|
@ -0,0 +1,160 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file check.c
|
||||
/// \brief Check sizes
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "check.h"
|
||||
|
||||
// See the .lzma header format specification section 2.2.2.
|
||||
LZMA_API const uint32_t lzma_check_sizes[8] = { 0, 4, 4, 8, 16, 32, 32, 64 };
|
||||
|
||||
|
||||
LZMA_API const lzma_bool lzma_available_checks[LZMA_CHECK_ID_MAX + 1] = {
|
||||
true, // LZMA_CHECK_NONE
|
||||
|
||||
#ifdef HAVE_CHECK_CRC32
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
false, // Reserved
|
||||
|
||||
#ifdef HAVE_CHECK_CRC64
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
false, // Reserved
|
||||
|
||||
#ifdef HAVE_CHECK_SHA256
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
false, // Reserved
|
||||
false, // Reserved
|
||||
};
|
||||
|
||||
|
||||
extern lzma_ret
|
||||
lzma_check_init(lzma_check *check, lzma_check_type type)
|
||||
{
|
||||
lzma_ret ret = LZMA_OK;
|
||||
|
||||
switch (type) {
|
||||
case LZMA_CHECK_NONE:
|
||||
break;
|
||||
|
||||
#ifdef HAVE_CHECK_CRC32
|
||||
case LZMA_CHECK_CRC32:
|
||||
check->crc32 = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHECK_CRC64
|
||||
case LZMA_CHECK_CRC64:
|
||||
check->crc64 = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHECK_SHA256
|
||||
case LZMA_CHECK_SHA256:
|
||||
lzma_sha256_init(&check->sha256);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
if (type <= LZMA_CHECK_ID_MAX)
|
||||
ret = LZMA_UNSUPPORTED_CHECK;
|
||||
else
|
||||
ret = LZMA_PROG_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_check_update(lzma_check *check, lzma_check_type type,
|
||||
const uint8_t *buf, size_t size)
|
||||
{
|
||||
switch (type) {
|
||||
#ifdef HAVE_CHECK_CRC32
|
||||
case LZMA_CHECK_CRC32:
|
||||
check->crc32 = lzma_crc32(buf, size, check->crc32);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHECK_CRC64
|
||||
case LZMA_CHECK_CRC64:
|
||||
check->crc64 = lzma_crc64(buf, size, check->crc64);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHECK_SHA256
|
||||
case LZMA_CHECK_SHA256:
|
||||
lzma_sha256_update(buf, size, &check->sha256);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_check_finish(lzma_check *check, lzma_check_type type)
|
||||
{
|
||||
#ifdef HAVE_CHECK_SHA256
|
||||
if (type == LZMA_CHECK_SHA256)
|
||||
lzma_sha256_finish(&check->sha256);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
extern bool
|
||||
lzma_check_compare(
|
||||
lzma_check *check1, lzma_check *check2, lzma_check_type type)
|
||||
{
|
||||
bool ret;
|
||||
|
||||
switch (type) {
|
||||
case LZMA_CHECK_NONE:
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_CRC32:
|
||||
ret = check1->crc32 != check2->crc32;
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_CRC64:
|
||||
ret = check1->crc64 != check2->crc64;
|
||||
break;
|
||||
|
||||
default:
|
||||
// Unsupported check
|
||||
assert(type <= 7);
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
*/
|
|
@ -0,0 +1,102 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file check.h
|
||||
/// \brief Prototypes for different check functions
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LZMA_CHECK_H
|
||||
#define LZMA_CHECK_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
/// Internal state
|
||||
uint32_t state[8];
|
||||
|
||||
/// Temporary 8-byte aligned buffer to hold incomplete chunk.
|
||||
/// After lzma_check_finish(), the first 32 bytes will contain
|
||||
/// the final digest in big endian byte order.
|
||||
uint8_t buffer[64];
|
||||
|
||||
/// Size of the message excluding padding
|
||||
uint64_t size;
|
||||
|
||||
} lzma_sha256;
|
||||
|
||||
|
||||
/// \note This is not in the public API because this structure will
|
||||
/// change in future.
|
||||
typedef union {
|
||||
uint32_t crc32;
|
||||
uint64_t crc64;
|
||||
lzma_sha256 sha256;
|
||||
} lzma_check;
|
||||
|
||||
|
||||
#ifdef HAVE_SMALL
|
||||
extern uint32_t lzma_crc32_table[8][256];
|
||||
extern uint64_t lzma_crc64_table[4][256];
|
||||
#else
|
||||
extern const uint32_t lzma_crc32_table[8][256];
|
||||
extern const uint64_t lzma_crc64_table[4][256];
|
||||
#endif
|
||||
|
||||
// Generic
|
||||
|
||||
/// \brief Initializes *check depending on type
|
||||
///
|
||||
/// \return LZMA_OK on success. LZMA_UNSUPPORTED_CHECK if the type is not
|
||||
/// supported by the current version or build of liblzma.
|
||||
/// LZMA_PROG_ERROR if type > LZMA_CHECK_ID_MAX.
|
||||
///
|
||||
extern lzma_ret lzma_check_init(lzma_check *check, lzma_check_type type);
|
||||
|
||||
/// \brief Updates *check
|
||||
///
|
||||
extern void lzma_check_update(lzma_check *check, lzma_check_type type,
|
||||
const uint8_t *buf, size_t size);
|
||||
|
||||
/// \brief Finishes *check
|
||||
///
|
||||
extern void lzma_check_finish(lzma_check *check, lzma_check_type type);
|
||||
|
||||
|
||||
/*
|
||||
/// \brief Compare two checks
|
||||
///
|
||||
/// \return false if the checks are identical; true if they differ.
|
||||
///
|
||||
extern bool lzma_check_compare(
|
||||
lzma_check *check1, lzma_check *check2, lzma_check_type type);
|
||||
*/
|
||||
|
||||
|
||||
// CRC32
|
||||
|
||||
extern void lzma_crc32_init(void);
|
||||
|
||||
|
||||
// CRC64
|
||||
|
||||
extern void lzma_crc64_init(void);
|
||||
|
||||
|
||||
// SHA256
|
||||
|
||||
extern void lzma_sha256_init(lzma_sha256 *sha256);
|
||||
|
||||
extern void lzma_sha256_update(
|
||||
const uint8_t *buf, size_t size, lzma_sha256 *sha256);
|
||||
|
||||
extern void lzma_sha256_finish(lzma_sha256 *sha256);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,43 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file check_byteswap.h
|
||||
/// \brief Byteswapping needed by the checks
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LZMA_CHECK_BYTESWAP_H
|
||||
#define LZMA_CHECK_BYTESWAP_H
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
// byteswap.h is a GNU extension. It contains inline assembly versions
|
||||
// for byteswapping. When byteswap.h is not available, we use generic code.
|
||||
#ifdef HAVE_BYTESWAP_H
|
||||
# include <byteswap.h>
|
||||
#else
|
||||
# define bswap_32(num) \
|
||||
( (((num) << 24) ) \
|
||||
| (((num) << 8) & UINT32_C(0x00FF0000)) \
|
||||
| (((num) >> 8) & UINT32_C(0x0000FF00)) \
|
||||
| (((num) >> 24) ) )
|
||||
|
||||
# define bswap_64(num) \
|
||||
( (((num) << 56) ) \
|
||||
| (((num) << 40) & UINT64_C(0x00FF000000000000)) \
|
||||
| (((num) << 24) & UINT64_C(0x0000FF0000000000)) \
|
||||
| (((num) << 8) & UINT64_C(0x000000FF00000000)) \
|
||||
| (((num) >> 8) & UINT64_C(0x00000000FF000000)) \
|
||||
| (((num) >> 24) & UINT64_C(0x0000000000FF0000)) \
|
||||
| (((num) >> 40) & UINT64_C(0x000000000000FF00)) \
|
||||
| (((num) >> 56) ) )
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,37 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file check_init.c
|
||||
/// \brief Static initializations for integrity checks
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "check.h"
|
||||
|
||||
|
||||
extern LZMA_API void
|
||||
lzma_init_check(void)
|
||||
{
|
||||
#ifdef HAVE_SMALL
|
||||
static bool already_initialized = false;
|
||||
if (already_initialized)
|
||||
return;
|
||||
|
||||
# ifdef HAVE_CHECK_CRC32
|
||||
lzma_crc32_init();
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_CHECK_CRC64
|
||||
lzma_crc64_init();
|
||||
# endif
|
||||
|
||||
already_initialized = true;
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc32.c
|
||||
/// \brief CRC32 calculation
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "check.h"
|
||||
#include "crc_macros.h"
|
||||
|
||||
|
||||
// If you make any changes, do some bench marking! Seemingly unrelated
|
||||
// changes can very easily ruin the performance (and very probably is
|
||||
// very compiler dependent).
|
||||
extern uint32_t
|
||||
lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc)
|
||||
{
|
||||
crc = ~crc;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
crc = bswap_32(crc);
|
||||
#endif
|
||||
|
||||
if (size > 8) {
|
||||
// Fix the alignment, if needed. The if statement above
|
||||
// ensures that this won't read past the end of buf[].
|
||||
while ((uintptr_t)(buf) & 7) {
|
||||
crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc);
|
||||
--size;
|
||||
}
|
||||
|
||||
// Calculate the position where to stop.
|
||||
const uint8_t *const limit = buf + (size & ~(size_t)(7));
|
||||
|
||||
// Calculate how many bytes must be calculated separately
|
||||
// before returning the result.
|
||||
size &= (size_t)(7);
|
||||
|
||||
// Calculate the CRC32 using the slice-by-eight algorithm.
|
||||
// It is explained in this document:
|
||||
// http://www.intel.com/technology/comms/perfnet/download/CRC_generators.pdf
|
||||
//
|
||||
// The code below is different than the code in Intel's
|
||||
// paper, but the principle is identical. This should be
|
||||
// faster with GCC than Intel's code. This is tested only
|
||||
// with GCC 3.4.6 and 4.1.2 on x86, so your results may vary.
|
||||
//
|
||||
// Using -Os and -fomit-frame-pointer seem to give the best
|
||||
// results at least with GCC 4.1.2 on x86. It's sill far
|
||||
// from the speed of hand-optimized assembler.
|
||||
while (buf < limit) {
|
||||
crc ^= *(uint32_t *)(buf);
|
||||
buf += 4;
|
||||
|
||||
crc = lzma_crc32_table[7][A(crc)]
|
||||
^ lzma_crc32_table[6][B(crc)]
|
||||
^ lzma_crc32_table[5][C(crc)]
|
||||
^ lzma_crc32_table[4][D(crc)];
|
||||
|
||||
const uint32_t tmp = *(uint32_t *)(buf);
|
||||
buf += 4;
|
||||
|
||||
// It is critical for performance, that
|
||||
// the crc variable is XORed between the
|
||||
// two table-lookup pairs.
|
||||
crc = lzma_crc32_table[3][A(tmp)]
|
||||
^ lzma_crc32_table[2][B(tmp)]
|
||||
^ crc
|
||||
^ lzma_crc32_table[1][C(tmp)]
|
||||
^ lzma_crc32_table[0][D(tmp)];
|
||||
}
|
||||
}
|
||||
|
||||
while (size-- != 0)
|
||||
crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc);
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
crc = bswap_32(crc);
|
||||
#endif
|
||||
|
||||
return ~crc;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc32_init.c
|
||||
/// \brief CRC32 table initialization
|
||||
//
|
||||
// This code is based on various public domain sources.
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# include "check_byteswap.h"
|
||||
#endif
|
||||
|
||||
|
||||
uint32_t lzma_crc32_table[8][256];
|
||||
|
||||
|
||||
extern void
|
||||
lzma_crc32_init(void)
|
||||
{
|
||||
static const uint32_t poly32 = UINT32_C(0xEDB88320);
|
||||
|
||||
for (size_t s = 0; s < 8; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
uint32_t r = s == 0 ? b : lzma_crc32_table[s - 1][b];
|
||||
|
||||
for (size_t i = 0; i < 8; ++i) {
|
||||
if (r & 1)
|
||||
r = (r >> 1) ^ poly32;
|
||||
else
|
||||
r >>= 1;
|
||||
}
|
||||
|
||||
lzma_crc32_table[s][b] = r;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
for (size_t s = 0; s < 8; ++s)
|
||||
for (size_t b = 0; b < 256; ++b)
|
||||
lzma_crc32_table[s][b]
|
||||
= bswap_32(lzma_crc32_table[s][b]);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc32_table.c
|
||||
/// \brief Precalculated CRC32 table with correct endianness
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# include "crc32_table_be.h"
|
||||
#else
|
||||
# include "crc32_table_le.h"
|
||||
#endif
|
|
@ -0,0 +1,527 @@
|
|||
/* This file has been automatically generated by crc32_tablegen.c. */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
const uint32_t lzma_crc32_table[8][256] = {
|
||||
{
|
||||
0x00000000, 0x96300777, 0x2C610EEE, 0xBA510999,
|
||||
0x19C46D07, 0x8FF46A70, 0x35A563E9, 0xA395649E,
|
||||
0x3288DB0E, 0xA4B8DC79, 0x1EE9D5E0, 0x88D9D297,
|
||||
0x2B4CB609, 0xBD7CB17E, 0x072DB8E7, 0x911DBF90,
|
||||
0x6410B71D, 0xF220B06A, 0x4871B9F3, 0xDE41BE84,
|
||||
0x7DD4DA1A, 0xEBE4DD6D, 0x51B5D4F4, 0xC785D383,
|
||||
0x56986C13, 0xC0A86B64, 0x7AF962FD, 0xECC9658A,
|
||||
0x4F5C0114, 0xD96C0663, 0x633D0FFA, 0xF50D088D,
|
||||
0xC8206E3B, 0x5E10694C, 0xE44160D5, 0x727167A2,
|
||||
0xD1E4033C, 0x47D4044B, 0xFD850DD2, 0x6BB50AA5,
|
||||
0xFAA8B535, 0x6C98B242, 0xD6C9BBDB, 0x40F9BCAC,
|
||||
0xE36CD832, 0x755CDF45, 0xCF0DD6DC, 0x593DD1AB,
|
||||
0xAC30D926, 0x3A00DE51, 0x8051D7C8, 0x1661D0BF,
|
||||
0xB5F4B421, 0x23C4B356, 0x9995BACF, 0x0FA5BDB8,
|
||||
0x9EB80228, 0x0888055F, 0xB2D90CC6, 0x24E90BB1,
|
||||
0x877C6F2F, 0x114C6858, 0xAB1D61C1, 0x3D2D66B6,
|
||||
0x9041DC76, 0x0671DB01, 0xBC20D298, 0x2A10D5EF,
|
||||
0x8985B171, 0x1FB5B606, 0xA5E4BF9F, 0x33D4B8E8,
|
||||
0xA2C90778, 0x34F9000F, 0x8EA80996, 0x18980EE1,
|
||||
0xBB0D6A7F, 0x2D3D6D08, 0x976C6491, 0x015C63E6,
|
||||
0xF4516B6B, 0x62616C1C, 0xD8306585, 0x4E0062F2,
|
||||
0xED95066C, 0x7BA5011B, 0xC1F40882, 0x57C40FF5,
|
||||
0xC6D9B065, 0x50E9B712, 0xEAB8BE8B, 0x7C88B9FC,
|
||||
0xDF1DDD62, 0x492DDA15, 0xF37CD38C, 0x654CD4FB,
|
||||
0x5861B24D, 0xCE51B53A, 0x7400BCA3, 0xE230BBD4,
|
||||
0x41A5DF4A, 0xD795D83D, 0x6DC4D1A4, 0xFBF4D6D3,
|
||||
0x6AE96943, 0xFCD96E34, 0x468867AD, 0xD0B860DA,
|
||||
0x732D0444, 0xE51D0333, 0x5F4C0AAA, 0xC97C0DDD,
|
||||
0x3C710550, 0xAA410227, 0x10100BBE, 0x86200CC9,
|
||||
0x25B56857, 0xB3856F20, 0x09D466B9, 0x9FE461CE,
|
||||
0x0EF9DE5E, 0x98C9D929, 0x2298D0B0, 0xB4A8D7C7,
|
||||
0x173DB359, 0x810DB42E, 0x3B5CBDB7, 0xAD6CBAC0,
|
||||
0x2083B8ED, 0xB6B3BF9A, 0x0CE2B603, 0x9AD2B174,
|
||||
0x3947D5EA, 0xAF77D29D, 0x1526DB04, 0x8316DC73,
|
||||
0x120B63E3, 0x843B6494, 0x3E6A6D0D, 0xA85A6A7A,
|
||||
0x0BCF0EE4, 0x9DFF0993, 0x27AE000A, 0xB19E077D,
|
||||
0x44930FF0, 0xD2A30887, 0x68F2011E, 0xFEC20669,
|
||||
0x5D5762F7, 0xCB676580, 0x71366C19, 0xE7066B6E,
|
||||
0x761BD4FE, 0xE02BD389, 0x5A7ADA10, 0xCC4ADD67,
|
||||
0x6FDFB9F9, 0xF9EFBE8E, 0x43BEB717, 0xD58EB060,
|
||||
0xE8A3D6D6, 0x7E93D1A1, 0xC4C2D838, 0x52F2DF4F,
|
||||
0xF167BBD1, 0x6757BCA6, 0xDD06B53F, 0x4B36B248,
|
||||
0xDA2B0DD8, 0x4C1B0AAF, 0xF64A0336, 0x607A0441,
|
||||
0xC3EF60DF, 0x55DF67A8, 0xEF8E6E31, 0x79BE6946,
|
||||
0x8CB361CB, 0x1A8366BC, 0xA0D26F25, 0x36E26852,
|
||||
0x95770CCC, 0x03470BBB, 0xB9160222, 0x2F260555,
|
||||
0xBE3BBAC5, 0x280BBDB2, 0x925AB42B, 0x046AB35C,
|
||||
0xA7FFD7C2, 0x31CFD0B5, 0x8B9ED92C, 0x1DAEDE5B,
|
||||
0xB0C2649B, 0x26F263EC, 0x9CA36A75, 0x0A936D02,
|
||||
0xA906099C, 0x3F360EEB, 0x85670772, 0x13570005,
|
||||
0x824ABF95, 0x147AB8E2, 0xAE2BB17B, 0x381BB60C,
|
||||
0x9B8ED292, 0x0DBED5E5, 0xB7EFDC7C, 0x21DFDB0B,
|
||||
0xD4D2D386, 0x42E2D4F1, 0xF8B3DD68, 0x6E83DA1F,
|
||||
0xCD16BE81, 0x5B26B9F6, 0xE177B06F, 0x7747B718,
|
||||
0xE65A0888, 0x706A0FFF, 0xCA3B0666, 0x5C0B0111,
|
||||
0xFF9E658F, 0x69AE62F8, 0xD3FF6B61, 0x45CF6C16,
|
||||
0x78E20AA0, 0xEED20DD7, 0x5483044E, 0xC2B30339,
|
||||
0x612667A7, 0xF71660D0, 0x4D476949, 0xDB776E3E,
|
||||
0x4A6AD1AE, 0xDC5AD6D9, 0x660BDF40, 0xF03BD837,
|
||||
0x53AEBCA9, 0xC59EBBDE, 0x7FCFB247, 0xE9FFB530,
|
||||
0x1CF2BDBD, 0x8AC2BACA, 0x3093B353, 0xA6A3B424,
|
||||
0x0536D0BA, 0x9306D7CD, 0x2957DE54, 0xBF67D923,
|
||||
0x2E7A66B3, 0xB84A61C4, 0x021B685D, 0x942B6F2A,
|
||||
0x37BE0BB4, 0xA18E0CC3, 0x1BDF055A, 0x8DEF022D
|
||||
}, {
|
||||
0x00000000, 0x41311B19, 0x82623632, 0xC3532D2B,
|
||||
0x04C56C64, 0x45F4777D, 0x86A75A56, 0xC796414F,
|
||||
0x088AD9C8, 0x49BBC2D1, 0x8AE8EFFA, 0xCBD9F4E3,
|
||||
0x0C4FB5AC, 0x4D7EAEB5, 0x8E2D839E, 0xCF1C9887,
|
||||
0x5112C24A, 0x1023D953, 0xD370F478, 0x9241EF61,
|
||||
0x55D7AE2E, 0x14E6B537, 0xD7B5981C, 0x96848305,
|
||||
0x59981B82, 0x18A9009B, 0xDBFA2DB0, 0x9ACB36A9,
|
||||
0x5D5D77E6, 0x1C6C6CFF, 0xDF3F41D4, 0x9E0E5ACD,
|
||||
0xA2248495, 0xE3159F8C, 0x2046B2A7, 0x6177A9BE,
|
||||
0xA6E1E8F1, 0xE7D0F3E8, 0x2483DEC3, 0x65B2C5DA,
|
||||
0xAAAE5D5D, 0xEB9F4644, 0x28CC6B6F, 0x69FD7076,
|
||||
0xAE6B3139, 0xEF5A2A20, 0x2C09070B, 0x6D381C12,
|
||||
0xF33646DF, 0xB2075DC6, 0x715470ED, 0x30656BF4,
|
||||
0xF7F32ABB, 0xB6C231A2, 0x75911C89, 0x34A00790,
|
||||
0xFBBC9F17, 0xBA8D840E, 0x79DEA925, 0x38EFB23C,
|
||||
0xFF79F373, 0xBE48E86A, 0x7D1BC541, 0x3C2ADE58,
|
||||
0x054F79F0, 0x447E62E9, 0x872D4FC2, 0xC61C54DB,
|
||||
0x018A1594, 0x40BB0E8D, 0x83E823A6, 0xC2D938BF,
|
||||
0x0DC5A038, 0x4CF4BB21, 0x8FA7960A, 0xCE968D13,
|
||||
0x0900CC5C, 0x4831D745, 0x8B62FA6E, 0xCA53E177,
|
||||
0x545DBBBA, 0x156CA0A3, 0xD63F8D88, 0x970E9691,
|
||||
0x5098D7DE, 0x11A9CCC7, 0xD2FAE1EC, 0x93CBFAF5,
|
||||
0x5CD76272, 0x1DE6796B, 0xDEB55440, 0x9F844F59,
|
||||
0x58120E16, 0x1923150F, 0xDA703824, 0x9B41233D,
|
||||
0xA76BFD65, 0xE65AE67C, 0x2509CB57, 0x6438D04E,
|
||||
0xA3AE9101, 0xE29F8A18, 0x21CCA733, 0x60FDBC2A,
|
||||
0xAFE124AD, 0xEED03FB4, 0x2D83129F, 0x6CB20986,
|
||||
0xAB2448C9, 0xEA1553D0, 0x29467EFB, 0x687765E2,
|
||||
0xF6793F2F, 0xB7482436, 0x741B091D, 0x352A1204,
|
||||
0xF2BC534B, 0xB38D4852, 0x70DE6579, 0x31EF7E60,
|
||||
0xFEF3E6E7, 0xBFC2FDFE, 0x7C91D0D5, 0x3DA0CBCC,
|
||||
0xFA368A83, 0xBB07919A, 0x7854BCB1, 0x3965A7A8,
|
||||
0x4B98833B, 0x0AA99822, 0xC9FAB509, 0x88CBAE10,
|
||||
0x4F5DEF5F, 0x0E6CF446, 0xCD3FD96D, 0x8C0EC274,
|
||||
0x43125AF3, 0x022341EA, 0xC1706CC1, 0x804177D8,
|
||||
0x47D73697, 0x06E62D8E, 0xC5B500A5, 0x84841BBC,
|
||||
0x1A8A4171, 0x5BBB5A68, 0x98E87743, 0xD9D96C5A,
|
||||
0x1E4F2D15, 0x5F7E360C, 0x9C2D1B27, 0xDD1C003E,
|
||||
0x120098B9, 0x533183A0, 0x9062AE8B, 0xD153B592,
|
||||
0x16C5F4DD, 0x57F4EFC4, 0x94A7C2EF, 0xD596D9F6,
|
||||
0xE9BC07AE, 0xA88D1CB7, 0x6BDE319C, 0x2AEF2A85,
|
||||
0xED796BCA, 0xAC4870D3, 0x6F1B5DF8, 0x2E2A46E1,
|
||||
0xE136DE66, 0xA007C57F, 0x6354E854, 0x2265F34D,
|
||||
0xE5F3B202, 0xA4C2A91B, 0x67918430, 0x26A09F29,
|
||||
0xB8AEC5E4, 0xF99FDEFD, 0x3ACCF3D6, 0x7BFDE8CF,
|
||||
0xBC6BA980, 0xFD5AB299, 0x3E099FB2, 0x7F3884AB,
|
||||
0xB0241C2C, 0xF1150735, 0x32462A1E, 0x73773107,
|
||||
0xB4E17048, 0xF5D06B51, 0x3683467A, 0x77B25D63,
|
||||
0x4ED7FACB, 0x0FE6E1D2, 0xCCB5CCF9, 0x8D84D7E0,
|
||||
0x4A1296AF, 0x0B238DB6, 0xC870A09D, 0x8941BB84,
|
||||
0x465D2303, 0x076C381A, 0xC43F1531, 0x850E0E28,
|
||||
0x42984F67, 0x03A9547E, 0xC0FA7955, 0x81CB624C,
|
||||
0x1FC53881, 0x5EF42398, 0x9DA70EB3, 0xDC9615AA,
|
||||
0x1B0054E5, 0x5A314FFC, 0x996262D7, 0xD85379CE,
|
||||
0x174FE149, 0x567EFA50, 0x952DD77B, 0xD41CCC62,
|
||||
0x138A8D2D, 0x52BB9634, 0x91E8BB1F, 0xD0D9A006,
|
||||
0xECF37E5E, 0xADC26547, 0x6E91486C, 0x2FA05375,
|
||||
0xE836123A, 0xA9070923, 0x6A542408, 0x2B653F11,
|
||||
0xE479A796, 0xA548BC8F, 0x661B91A4, 0x272A8ABD,
|
||||
0xE0BCCBF2, 0xA18DD0EB, 0x62DEFDC0, 0x23EFE6D9,
|
||||
0xBDE1BC14, 0xFCD0A70D, 0x3F838A26, 0x7EB2913F,
|
||||
0xB924D070, 0xF815CB69, 0x3B46E642, 0x7A77FD5B,
|
||||
0xB56B65DC, 0xF45A7EC5, 0x370953EE, 0x763848F7,
|
||||
0xB1AE09B8, 0xF09F12A1, 0x33CC3F8A, 0x72FD2493
|
||||
}, {
|
||||
0x00000000, 0x376AC201, 0x6ED48403, 0x59BE4602,
|
||||
0xDCA80907, 0xEBC2CB06, 0xB27C8D04, 0x85164F05,
|
||||
0xB851130E, 0x8F3BD10F, 0xD685970D, 0xE1EF550C,
|
||||
0x64F91A09, 0x5393D808, 0x0A2D9E0A, 0x3D475C0B,
|
||||
0x70A3261C, 0x47C9E41D, 0x1E77A21F, 0x291D601E,
|
||||
0xAC0B2F1B, 0x9B61ED1A, 0xC2DFAB18, 0xF5B56919,
|
||||
0xC8F23512, 0xFF98F713, 0xA626B111, 0x914C7310,
|
||||
0x145A3C15, 0x2330FE14, 0x7A8EB816, 0x4DE47A17,
|
||||
0xE0464D38, 0xD72C8F39, 0x8E92C93B, 0xB9F80B3A,
|
||||
0x3CEE443F, 0x0B84863E, 0x523AC03C, 0x6550023D,
|
||||
0x58175E36, 0x6F7D9C37, 0x36C3DA35, 0x01A91834,
|
||||
0x84BF5731, 0xB3D59530, 0xEA6BD332, 0xDD011133,
|
||||
0x90E56B24, 0xA78FA925, 0xFE31EF27, 0xC95B2D26,
|
||||
0x4C4D6223, 0x7B27A022, 0x2299E620, 0x15F32421,
|
||||
0x28B4782A, 0x1FDEBA2B, 0x4660FC29, 0x710A3E28,
|
||||
0xF41C712D, 0xC376B32C, 0x9AC8F52E, 0xADA2372F,
|
||||
0xC08D9A70, 0xF7E75871, 0xAE591E73, 0x9933DC72,
|
||||
0x1C259377, 0x2B4F5176, 0x72F11774, 0x459BD575,
|
||||
0x78DC897E, 0x4FB64B7F, 0x16080D7D, 0x2162CF7C,
|
||||
0xA4748079, 0x931E4278, 0xCAA0047A, 0xFDCAC67B,
|
||||
0xB02EBC6C, 0x87447E6D, 0xDEFA386F, 0xE990FA6E,
|
||||
0x6C86B56B, 0x5BEC776A, 0x02523168, 0x3538F369,
|
||||
0x087FAF62, 0x3F156D63, 0x66AB2B61, 0x51C1E960,
|
||||
0xD4D7A665, 0xE3BD6464, 0xBA032266, 0x8D69E067,
|
||||
0x20CBD748, 0x17A11549, 0x4E1F534B, 0x7975914A,
|
||||
0xFC63DE4F, 0xCB091C4E, 0x92B75A4C, 0xA5DD984D,
|
||||
0x989AC446, 0xAFF00647, 0xF64E4045, 0xC1248244,
|
||||
0x4432CD41, 0x73580F40, 0x2AE64942, 0x1D8C8B43,
|
||||
0x5068F154, 0x67023355, 0x3EBC7557, 0x09D6B756,
|
||||
0x8CC0F853, 0xBBAA3A52, 0xE2147C50, 0xD57EBE51,
|
||||
0xE839E25A, 0xDF53205B, 0x86ED6659, 0xB187A458,
|
||||
0x3491EB5D, 0x03FB295C, 0x5A456F5E, 0x6D2FAD5F,
|
||||
0x801B35E1, 0xB771F7E0, 0xEECFB1E2, 0xD9A573E3,
|
||||
0x5CB33CE6, 0x6BD9FEE7, 0x3267B8E5, 0x050D7AE4,
|
||||
0x384A26EF, 0x0F20E4EE, 0x569EA2EC, 0x61F460ED,
|
||||
0xE4E22FE8, 0xD388EDE9, 0x8A36ABEB, 0xBD5C69EA,
|
||||
0xF0B813FD, 0xC7D2D1FC, 0x9E6C97FE, 0xA90655FF,
|
||||
0x2C101AFA, 0x1B7AD8FB, 0x42C49EF9, 0x75AE5CF8,
|
||||
0x48E900F3, 0x7F83C2F2, 0x263D84F0, 0x115746F1,
|
||||
0x944109F4, 0xA32BCBF5, 0xFA958DF7, 0xCDFF4FF6,
|
||||
0x605D78D9, 0x5737BAD8, 0x0E89FCDA, 0x39E33EDB,
|
||||
0xBCF571DE, 0x8B9FB3DF, 0xD221F5DD, 0xE54B37DC,
|
||||
0xD80C6BD7, 0xEF66A9D6, 0xB6D8EFD4, 0x81B22DD5,
|
||||
0x04A462D0, 0x33CEA0D1, 0x6A70E6D3, 0x5D1A24D2,
|
||||
0x10FE5EC5, 0x27949CC4, 0x7E2ADAC6, 0x494018C7,
|
||||
0xCC5657C2, 0xFB3C95C3, 0xA282D3C1, 0x95E811C0,
|
||||
0xA8AF4DCB, 0x9FC58FCA, 0xC67BC9C8, 0xF1110BC9,
|
||||
0x740744CC, 0x436D86CD, 0x1AD3C0CF, 0x2DB902CE,
|
||||
0x4096AF91, 0x77FC6D90, 0x2E422B92, 0x1928E993,
|
||||
0x9C3EA696, 0xAB546497, 0xF2EA2295, 0xC580E094,
|
||||
0xF8C7BC9F, 0xCFAD7E9E, 0x9613389C, 0xA179FA9D,
|
||||
0x246FB598, 0x13057799, 0x4ABB319B, 0x7DD1F39A,
|
||||
0x3035898D, 0x075F4B8C, 0x5EE10D8E, 0x698BCF8F,
|
||||
0xEC9D808A, 0xDBF7428B, 0x82490489, 0xB523C688,
|
||||
0x88649A83, 0xBF0E5882, 0xE6B01E80, 0xD1DADC81,
|
||||
0x54CC9384, 0x63A65185, 0x3A181787, 0x0D72D586,
|
||||
0xA0D0E2A9, 0x97BA20A8, 0xCE0466AA, 0xF96EA4AB,
|
||||
0x7C78EBAE, 0x4B1229AF, 0x12AC6FAD, 0x25C6ADAC,
|
||||
0x1881F1A7, 0x2FEB33A6, 0x765575A4, 0x413FB7A5,
|
||||
0xC429F8A0, 0xF3433AA1, 0xAAFD7CA3, 0x9D97BEA2,
|
||||
0xD073C4B5, 0xE71906B4, 0xBEA740B6, 0x89CD82B7,
|
||||
0x0CDBCDB2, 0x3BB10FB3, 0x620F49B1, 0x55658BB0,
|
||||
0x6822D7BB, 0x5F4815BA, 0x06F653B8, 0x319C91B9,
|
||||
0xB48ADEBC, 0x83E01CBD, 0xDA5E5ABF, 0xED3498BE
|
||||
}, {
|
||||
0x00000000, 0x6567BCB8, 0x8BC809AA, 0xEEAFB512,
|
||||
0x5797628F, 0x32F0DE37, 0xDC5F6B25, 0xB938D79D,
|
||||
0xEF28B4C5, 0x8A4F087D, 0x64E0BD6F, 0x018701D7,
|
||||
0xB8BFD64A, 0xDDD86AF2, 0x3377DFE0, 0x56106358,
|
||||
0x9F571950, 0xFA30A5E8, 0x149F10FA, 0x71F8AC42,
|
||||
0xC8C07BDF, 0xADA7C767, 0x43087275, 0x266FCECD,
|
||||
0x707FAD95, 0x1518112D, 0xFBB7A43F, 0x9ED01887,
|
||||
0x27E8CF1A, 0x428F73A2, 0xAC20C6B0, 0xC9477A08,
|
||||
0x3EAF32A0, 0x5BC88E18, 0xB5673B0A, 0xD00087B2,
|
||||
0x6938502F, 0x0C5FEC97, 0xE2F05985, 0x8797E53D,
|
||||
0xD1878665, 0xB4E03ADD, 0x5A4F8FCF, 0x3F283377,
|
||||
0x8610E4EA, 0xE3775852, 0x0DD8ED40, 0x68BF51F8,
|
||||
0xA1F82BF0, 0xC49F9748, 0x2A30225A, 0x4F579EE2,
|
||||
0xF66F497F, 0x9308F5C7, 0x7DA740D5, 0x18C0FC6D,
|
||||
0x4ED09F35, 0x2BB7238D, 0xC518969F, 0xA07F2A27,
|
||||
0x1947FDBA, 0x7C204102, 0x928FF410, 0xF7E848A8,
|
||||
0x3D58149B, 0x583FA823, 0xB6901D31, 0xD3F7A189,
|
||||
0x6ACF7614, 0x0FA8CAAC, 0xE1077FBE, 0x8460C306,
|
||||
0xD270A05E, 0xB7171CE6, 0x59B8A9F4, 0x3CDF154C,
|
||||
0x85E7C2D1, 0xE0807E69, 0x0E2FCB7B, 0x6B4877C3,
|
||||
0xA20F0DCB, 0xC768B173, 0x29C70461, 0x4CA0B8D9,
|
||||
0xF5986F44, 0x90FFD3FC, 0x7E5066EE, 0x1B37DA56,
|
||||
0x4D27B90E, 0x284005B6, 0xC6EFB0A4, 0xA3880C1C,
|
||||
0x1AB0DB81, 0x7FD76739, 0x9178D22B, 0xF41F6E93,
|
||||
0x03F7263B, 0x66909A83, 0x883F2F91, 0xED589329,
|
||||
0x546044B4, 0x3107F80C, 0xDFA84D1E, 0xBACFF1A6,
|
||||
0xECDF92FE, 0x89B82E46, 0x67179B54, 0x027027EC,
|
||||
0xBB48F071, 0xDE2F4CC9, 0x3080F9DB, 0x55E74563,
|
||||
0x9CA03F6B, 0xF9C783D3, 0x176836C1, 0x720F8A79,
|
||||
0xCB375DE4, 0xAE50E15C, 0x40FF544E, 0x2598E8F6,
|
||||
0x73888BAE, 0x16EF3716, 0xF8408204, 0x9D273EBC,
|
||||
0x241FE921, 0x41785599, 0xAFD7E08B, 0xCAB05C33,
|
||||
0x3BB659ED, 0x5ED1E555, 0xB07E5047, 0xD519ECFF,
|
||||
0x6C213B62, 0x094687DA, 0xE7E932C8, 0x828E8E70,
|
||||
0xD49EED28, 0xB1F95190, 0x5F56E482, 0x3A31583A,
|
||||
0x83098FA7, 0xE66E331F, 0x08C1860D, 0x6DA63AB5,
|
||||
0xA4E140BD, 0xC186FC05, 0x2F294917, 0x4A4EF5AF,
|
||||
0xF3762232, 0x96119E8A, 0x78BE2B98, 0x1DD99720,
|
||||
0x4BC9F478, 0x2EAE48C0, 0xC001FDD2, 0xA566416A,
|
||||
0x1C5E96F7, 0x79392A4F, 0x97969F5D, 0xF2F123E5,
|
||||
0x05196B4D, 0x607ED7F5, 0x8ED162E7, 0xEBB6DE5F,
|
||||
0x528E09C2, 0x37E9B57A, 0xD9460068, 0xBC21BCD0,
|
||||
0xEA31DF88, 0x8F566330, 0x61F9D622, 0x049E6A9A,
|
||||
0xBDA6BD07, 0xD8C101BF, 0x366EB4AD, 0x53090815,
|
||||
0x9A4E721D, 0xFF29CEA5, 0x11867BB7, 0x74E1C70F,
|
||||
0xCDD91092, 0xA8BEAC2A, 0x46111938, 0x2376A580,
|
||||
0x7566C6D8, 0x10017A60, 0xFEAECF72, 0x9BC973CA,
|
||||
0x22F1A457, 0x479618EF, 0xA939ADFD, 0xCC5E1145,
|
||||
0x06EE4D76, 0x6389F1CE, 0x8D2644DC, 0xE841F864,
|
||||
0x51792FF9, 0x341E9341, 0xDAB12653, 0xBFD69AEB,
|
||||
0xE9C6F9B3, 0x8CA1450B, 0x620EF019, 0x07694CA1,
|
||||
0xBE519B3C, 0xDB362784, 0x35999296, 0x50FE2E2E,
|
||||
0x99B95426, 0xFCDEE89E, 0x12715D8C, 0x7716E134,
|
||||
0xCE2E36A9, 0xAB498A11, 0x45E63F03, 0x208183BB,
|
||||
0x7691E0E3, 0x13F65C5B, 0xFD59E949, 0x983E55F1,
|
||||
0x2106826C, 0x44613ED4, 0xAACE8BC6, 0xCFA9377E,
|
||||
0x38417FD6, 0x5D26C36E, 0xB389767C, 0xD6EECAC4,
|
||||
0x6FD61D59, 0x0AB1A1E1, 0xE41E14F3, 0x8179A84B,
|
||||
0xD769CB13, 0xB20E77AB, 0x5CA1C2B9, 0x39C67E01,
|
||||
0x80FEA99C, 0xE5991524, 0x0B36A036, 0x6E511C8E,
|
||||
0xA7166686, 0xC271DA3E, 0x2CDE6F2C, 0x49B9D394,
|
||||
0xF0810409, 0x95E6B8B1, 0x7B490DA3, 0x1E2EB11B,
|
||||
0x483ED243, 0x2D596EFB, 0xC3F6DBE9, 0xA6916751,
|
||||
0x1FA9B0CC, 0x7ACE0C74, 0x9461B966, 0xF10605DE
|
||||
}, {
|
||||
0x00000000, 0xB029603D, 0x6053C07A, 0xD07AA047,
|
||||
0xC0A680F5, 0x708FE0C8, 0xA0F5408F, 0x10DC20B2,
|
||||
0xC14B7030, 0x7162100D, 0xA118B04A, 0x1131D077,
|
||||
0x01EDF0C5, 0xB1C490F8, 0x61BE30BF, 0xD1975082,
|
||||
0x8297E060, 0x32BE805D, 0xE2C4201A, 0x52ED4027,
|
||||
0x42316095, 0xF21800A8, 0x2262A0EF, 0x924BC0D2,
|
||||
0x43DC9050, 0xF3F5F06D, 0x238F502A, 0x93A63017,
|
||||
0x837A10A5, 0x33537098, 0xE329D0DF, 0x5300B0E2,
|
||||
0x042FC1C1, 0xB406A1FC, 0x647C01BB, 0xD4556186,
|
||||
0xC4894134, 0x74A02109, 0xA4DA814E, 0x14F3E173,
|
||||
0xC564B1F1, 0x754DD1CC, 0xA537718B, 0x151E11B6,
|
||||
0x05C23104, 0xB5EB5139, 0x6591F17E, 0xD5B89143,
|
||||
0x86B821A1, 0x3691419C, 0xE6EBE1DB, 0x56C281E6,
|
||||
0x461EA154, 0xF637C169, 0x264D612E, 0x96640113,
|
||||
0x47F35191, 0xF7DA31AC, 0x27A091EB, 0x9789F1D6,
|
||||
0x8755D164, 0x377CB159, 0xE706111E, 0x572F7123,
|
||||
0x4958F358, 0xF9719365, 0x290B3322, 0x9922531F,
|
||||
0x89FE73AD, 0x39D71390, 0xE9ADB3D7, 0x5984D3EA,
|
||||
0x88138368, 0x383AE355, 0xE8404312, 0x5869232F,
|
||||
0x48B5039D, 0xF89C63A0, 0x28E6C3E7, 0x98CFA3DA,
|
||||
0xCBCF1338, 0x7BE67305, 0xAB9CD342, 0x1BB5B37F,
|
||||
0x0B6993CD, 0xBB40F3F0, 0x6B3A53B7, 0xDB13338A,
|
||||
0x0A846308, 0xBAAD0335, 0x6AD7A372, 0xDAFEC34F,
|
||||
0xCA22E3FD, 0x7A0B83C0, 0xAA712387, 0x1A5843BA,
|
||||
0x4D773299, 0xFD5E52A4, 0x2D24F2E3, 0x9D0D92DE,
|
||||
0x8DD1B26C, 0x3DF8D251, 0xED827216, 0x5DAB122B,
|
||||
0x8C3C42A9, 0x3C152294, 0xEC6F82D3, 0x5C46E2EE,
|
||||
0x4C9AC25C, 0xFCB3A261, 0x2CC90226, 0x9CE0621B,
|
||||
0xCFE0D2F9, 0x7FC9B2C4, 0xAFB31283, 0x1F9A72BE,
|
||||
0x0F46520C, 0xBF6F3231, 0x6F159276, 0xDF3CF24B,
|
||||
0x0EABA2C9, 0xBE82C2F4, 0x6EF862B3, 0xDED1028E,
|
||||
0xCE0D223C, 0x7E244201, 0xAE5EE246, 0x1E77827B,
|
||||
0x92B0E6B1, 0x2299868C, 0xF2E326CB, 0x42CA46F6,
|
||||
0x52166644, 0xE23F0679, 0x3245A63E, 0x826CC603,
|
||||
0x53FB9681, 0xE3D2F6BC, 0x33A856FB, 0x838136C6,
|
||||
0x935D1674, 0x23747649, 0xF30ED60E, 0x4327B633,
|
||||
0x102706D1, 0xA00E66EC, 0x7074C6AB, 0xC05DA696,
|
||||
0xD0818624, 0x60A8E619, 0xB0D2465E, 0x00FB2663,
|
||||
0xD16C76E1, 0x614516DC, 0xB13FB69B, 0x0116D6A6,
|
||||
0x11CAF614, 0xA1E39629, 0x7199366E, 0xC1B05653,
|
||||
0x969F2770, 0x26B6474D, 0xF6CCE70A, 0x46E58737,
|
||||
0x5639A785, 0xE610C7B8, 0x366A67FF, 0x864307C2,
|
||||
0x57D45740, 0xE7FD377D, 0x3787973A, 0x87AEF707,
|
||||
0x9772D7B5, 0x275BB788, 0xF72117CF, 0x470877F2,
|
||||
0x1408C710, 0xA421A72D, 0x745B076A, 0xC4726757,
|
||||
0xD4AE47E5, 0x648727D8, 0xB4FD879F, 0x04D4E7A2,
|
||||
0xD543B720, 0x656AD71D, 0xB510775A, 0x05391767,
|
||||
0x15E537D5, 0xA5CC57E8, 0x75B6F7AF, 0xC59F9792,
|
||||
0xDBE815E9, 0x6BC175D4, 0xBBBBD593, 0x0B92B5AE,
|
||||
0x1B4E951C, 0xAB67F521, 0x7B1D5566, 0xCB34355B,
|
||||
0x1AA365D9, 0xAA8A05E4, 0x7AF0A5A3, 0xCAD9C59E,
|
||||
0xDA05E52C, 0x6A2C8511, 0xBA562556, 0x0A7F456B,
|
||||
0x597FF589, 0xE95695B4, 0x392C35F3, 0x890555CE,
|
||||
0x99D9757C, 0x29F01541, 0xF98AB506, 0x49A3D53B,
|
||||
0x983485B9, 0x281DE584, 0xF86745C3, 0x484E25FE,
|
||||
0x5892054C, 0xE8BB6571, 0x38C1C536, 0x88E8A50B,
|
||||
0xDFC7D428, 0x6FEEB415, 0xBF941452, 0x0FBD746F,
|
||||
0x1F6154DD, 0xAF4834E0, 0x7F3294A7, 0xCF1BF49A,
|
||||
0x1E8CA418, 0xAEA5C425, 0x7EDF6462, 0xCEF6045F,
|
||||
0xDE2A24ED, 0x6E0344D0, 0xBE79E497, 0x0E5084AA,
|
||||
0x5D503448, 0xED795475, 0x3D03F432, 0x8D2A940F,
|
||||
0x9DF6B4BD, 0x2DDFD480, 0xFDA574C7, 0x4D8C14FA,
|
||||
0x9C1B4478, 0x2C322445, 0xFC488402, 0x4C61E43F,
|
||||
0x5CBDC48D, 0xEC94A4B0, 0x3CEE04F7, 0x8CC764CA
|
||||
}, {
|
||||
0x00000000, 0xA5D35CCB, 0x0BA1C84D, 0xAE729486,
|
||||
0x1642919B, 0xB391CD50, 0x1DE359D6, 0xB830051D,
|
||||
0x6D8253EC, 0xC8510F27, 0x66239BA1, 0xC3F0C76A,
|
||||
0x7BC0C277, 0xDE139EBC, 0x70610A3A, 0xD5B256F1,
|
||||
0x9B02D603, 0x3ED18AC8, 0x90A31E4E, 0x35704285,
|
||||
0x8D404798, 0x28931B53, 0x86E18FD5, 0x2332D31E,
|
||||
0xF68085EF, 0x5353D924, 0xFD214DA2, 0x58F21169,
|
||||
0xE0C21474, 0x451148BF, 0xEB63DC39, 0x4EB080F2,
|
||||
0x3605AC07, 0x93D6F0CC, 0x3DA4644A, 0x98773881,
|
||||
0x20473D9C, 0x85946157, 0x2BE6F5D1, 0x8E35A91A,
|
||||
0x5B87FFEB, 0xFE54A320, 0x502637A6, 0xF5F56B6D,
|
||||
0x4DC56E70, 0xE81632BB, 0x4664A63D, 0xE3B7FAF6,
|
||||
0xAD077A04, 0x08D426CF, 0xA6A6B249, 0x0375EE82,
|
||||
0xBB45EB9F, 0x1E96B754, 0xB0E423D2, 0x15377F19,
|
||||
0xC08529E8, 0x65567523, 0xCB24E1A5, 0x6EF7BD6E,
|
||||
0xD6C7B873, 0x7314E4B8, 0xDD66703E, 0x78B52CF5,
|
||||
0x6C0A580F, 0xC9D904C4, 0x67AB9042, 0xC278CC89,
|
||||
0x7A48C994, 0xDF9B955F, 0x71E901D9, 0xD43A5D12,
|
||||
0x01880BE3, 0xA45B5728, 0x0A29C3AE, 0xAFFA9F65,
|
||||
0x17CA9A78, 0xB219C6B3, 0x1C6B5235, 0xB9B80EFE,
|
||||
0xF7088E0C, 0x52DBD2C7, 0xFCA94641, 0x597A1A8A,
|
||||
0xE14A1F97, 0x4499435C, 0xEAEBD7DA, 0x4F388B11,
|
||||
0x9A8ADDE0, 0x3F59812B, 0x912B15AD, 0x34F84966,
|
||||
0x8CC84C7B, 0x291B10B0, 0x87698436, 0x22BAD8FD,
|
||||
0x5A0FF408, 0xFFDCA8C3, 0x51AE3C45, 0xF47D608E,
|
||||
0x4C4D6593, 0xE99E3958, 0x47ECADDE, 0xE23FF115,
|
||||
0x378DA7E4, 0x925EFB2F, 0x3C2C6FA9, 0x99FF3362,
|
||||
0x21CF367F, 0x841C6AB4, 0x2A6EFE32, 0x8FBDA2F9,
|
||||
0xC10D220B, 0x64DE7EC0, 0xCAACEA46, 0x6F7FB68D,
|
||||
0xD74FB390, 0x729CEF5B, 0xDCEE7BDD, 0x793D2716,
|
||||
0xAC8F71E7, 0x095C2D2C, 0xA72EB9AA, 0x02FDE561,
|
||||
0xBACDE07C, 0x1F1EBCB7, 0xB16C2831, 0x14BF74FA,
|
||||
0xD814B01E, 0x7DC7ECD5, 0xD3B57853, 0x76662498,
|
||||
0xCE562185, 0x6B857D4E, 0xC5F7E9C8, 0x6024B503,
|
||||
0xB596E3F2, 0x1045BF39, 0xBE372BBF, 0x1BE47774,
|
||||
0xA3D47269, 0x06072EA2, 0xA875BA24, 0x0DA6E6EF,
|
||||
0x4316661D, 0xE6C53AD6, 0x48B7AE50, 0xED64F29B,
|
||||
0x5554F786, 0xF087AB4D, 0x5EF53FCB, 0xFB266300,
|
||||
0x2E9435F1, 0x8B47693A, 0x2535FDBC, 0x80E6A177,
|
||||
0x38D6A46A, 0x9D05F8A1, 0x33776C27, 0x96A430EC,
|
||||
0xEE111C19, 0x4BC240D2, 0xE5B0D454, 0x4063889F,
|
||||
0xF8538D82, 0x5D80D149, 0xF3F245CF, 0x56211904,
|
||||
0x83934FF5, 0x2640133E, 0x883287B8, 0x2DE1DB73,
|
||||
0x95D1DE6E, 0x300282A5, 0x9E701623, 0x3BA34AE8,
|
||||
0x7513CA1A, 0xD0C096D1, 0x7EB20257, 0xDB615E9C,
|
||||
0x63515B81, 0xC682074A, 0x68F093CC, 0xCD23CF07,
|
||||
0x189199F6, 0xBD42C53D, 0x133051BB, 0xB6E30D70,
|
||||
0x0ED3086D, 0xAB0054A6, 0x0572C020, 0xA0A19CEB,
|
||||
0xB41EE811, 0x11CDB4DA, 0xBFBF205C, 0x1A6C7C97,
|
||||
0xA25C798A, 0x078F2541, 0xA9FDB1C7, 0x0C2EED0C,
|
||||
0xD99CBBFD, 0x7C4FE736, 0xD23D73B0, 0x77EE2F7B,
|
||||
0xCFDE2A66, 0x6A0D76AD, 0xC47FE22B, 0x61ACBEE0,
|
||||
0x2F1C3E12, 0x8ACF62D9, 0x24BDF65F, 0x816EAA94,
|
||||
0x395EAF89, 0x9C8DF342, 0x32FF67C4, 0x972C3B0F,
|
||||
0x429E6DFE, 0xE74D3135, 0x493FA5B3, 0xECECF978,
|
||||
0x54DCFC65, 0xF10FA0AE, 0x5F7D3428, 0xFAAE68E3,
|
||||
0x821B4416, 0x27C818DD, 0x89BA8C5B, 0x2C69D090,
|
||||
0x9459D58D, 0x318A8946, 0x9FF81DC0, 0x3A2B410B,
|
||||
0xEF9917FA, 0x4A4A4B31, 0xE438DFB7, 0x41EB837C,
|
||||
0xF9DB8661, 0x5C08DAAA, 0xF27A4E2C, 0x57A912E7,
|
||||
0x19199215, 0xBCCACEDE, 0x12B85A58, 0xB76B0693,
|
||||
0x0F5B038E, 0xAA885F45, 0x04FACBC3, 0xA1299708,
|
||||
0x749BC1F9, 0xD1489D32, 0x7F3A09B4, 0xDAE9557F,
|
||||
0x62D95062, 0xC70A0CA9, 0x6978982F, 0xCCABC4E4
|
||||
}, {
|
||||
0x00000000, 0xB40B77A6, 0x29119F97, 0x9D1AE831,
|
||||
0x13244FF4, 0xA72F3852, 0x3A35D063, 0x8E3EA7C5,
|
||||
0x674EEF33, 0xD3459895, 0x4E5F70A4, 0xFA540702,
|
||||
0x746AA0C7, 0xC061D761, 0x5D7B3F50, 0xE97048F6,
|
||||
0xCE9CDE67, 0x7A97A9C1, 0xE78D41F0, 0x53863656,
|
||||
0xDDB89193, 0x69B3E635, 0xF4A90E04, 0x40A279A2,
|
||||
0xA9D23154, 0x1DD946F2, 0x80C3AEC3, 0x34C8D965,
|
||||
0xBAF67EA0, 0x0EFD0906, 0x93E7E137, 0x27EC9691,
|
||||
0x9C39BDCF, 0x2832CA69, 0xB5282258, 0x012355FE,
|
||||
0x8F1DF23B, 0x3B16859D, 0xA60C6DAC, 0x12071A0A,
|
||||
0xFB7752FC, 0x4F7C255A, 0xD266CD6B, 0x666DBACD,
|
||||
0xE8531D08, 0x5C586AAE, 0xC142829F, 0x7549F539,
|
||||
0x52A563A8, 0xE6AE140E, 0x7BB4FC3F, 0xCFBF8B99,
|
||||
0x41812C5C, 0xF58A5BFA, 0x6890B3CB, 0xDC9BC46D,
|
||||
0x35EB8C9B, 0x81E0FB3D, 0x1CFA130C, 0xA8F164AA,
|
||||
0x26CFC36F, 0x92C4B4C9, 0x0FDE5CF8, 0xBBD52B5E,
|
||||
0x79750B44, 0xCD7E7CE2, 0x506494D3, 0xE46FE375,
|
||||
0x6A5144B0, 0xDE5A3316, 0x4340DB27, 0xF74BAC81,
|
||||
0x1E3BE477, 0xAA3093D1, 0x372A7BE0, 0x83210C46,
|
||||
0x0D1FAB83, 0xB914DC25, 0x240E3414, 0x900543B2,
|
||||
0xB7E9D523, 0x03E2A285, 0x9EF84AB4, 0x2AF33D12,
|
||||
0xA4CD9AD7, 0x10C6ED71, 0x8DDC0540, 0x39D772E6,
|
||||
0xD0A73A10, 0x64AC4DB6, 0xF9B6A587, 0x4DBDD221,
|
||||
0xC38375E4, 0x77880242, 0xEA92EA73, 0x5E999DD5,
|
||||
0xE54CB68B, 0x5147C12D, 0xCC5D291C, 0x78565EBA,
|
||||
0xF668F97F, 0x42638ED9, 0xDF7966E8, 0x6B72114E,
|
||||
0x820259B8, 0x36092E1E, 0xAB13C62F, 0x1F18B189,
|
||||
0x9126164C, 0x252D61EA, 0xB83789DB, 0x0C3CFE7D,
|
||||
0x2BD068EC, 0x9FDB1F4A, 0x02C1F77B, 0xB6CA80DD,
|
||||
0x38F42718, 0x8CFF50BE, 0x11E5B88F, 0xA5EECF29,
|
||||
0x4C9E87DF, 0xF895F079, 0x658F1848, 0xD1846FEE,
|
||||
0x5FBAC82B, 0xEBB1BF8D, 0x76AB57BC, 0xC2A0201A,
|
||||
0xF2EA1688, 0x46E1612E, 0xDBFB891F, 0x6FF0FEB9,
|
||||
0xE1CE597C, 0x55C52EDA, 0xC8DFC6EB, 0x7CD4B14D,
|
||||
0x95A4F9BB, 0x21AF8E1D, 0xBCB5662C, 0x08BE118A,
|
||||
0x8680B64F, 0x328BC1E9, 0xAF9129D8, 0x1B9A5E7E,
|
||||
0x3C76C8EF, 0x887DBF49, 0x15675778, 0xA16C20DE,
|
||||
0x2F52871B, 0x9B59F0BD, 0x0643188C, 0xB2486F2A,
|
||||
0x5B3827DC, 0xEF33507A, 0x7229B84B, 0xC622CFED,
|
||||
0x481C6828, 0xFC171F8E, 0x610DF7BF, 0xD5068019,
|
||||
0x6ED3AB47, 0xDAD8DCE1, 0x47C234D0, 0xF3C94376,
|
||||
0x7DF7E4B3, 0xC9FC9315, 0x54E67B24, 0xE0ED0C82,
|
||||
0x099D4474, 0xBD9633D2, 0x208CDBE3, 0x9487AC45,
|
||||
0x1AB90B80, 0xAEB27C26, 0x33A89417, 0x87A3E3B1,
|
||||
0xA04F7520, 0x14440286, 0x895EEAB7, 0x3D559D11,
|
||||
0xB36B3AD4, 0x07604D72, 0x9A7AA543, 0x2E71D2E5,
|
||||
0xC7019A13, 0x730AEDB5, 0xEE100584, 0x5A1B7222,
|
||||
0xD425D5E7, 0x602EA241, 0xFD344A70, 0x493F3DD6,
|
||||
0x8B9F1DCC, 0x3F946A6A, 0xA28E825B, 0x1685F5FD,
|
||||
0x98BB5238, 0x2CB0259E, 0xB1AACDAF, 0x05A1BA09,
|
||||
0xECD1F2FF, 0x58DA8559, 0xC5C06D68, 0x71CB1ACE,
|
||||
0xFFF5BD0B, 0x4BFECAAD, 0xD6E4229C, 0x62EF553A,
|
||||
0x4503C3AB, 0xF108B40D, 0x6C125C3C, 0xD8192B9A,
|
||||
0x56278C5F, 0xE22CFBF9, 0x7F3613C8, 0xCB3D646E,
|
||||
0x224D2C98, 0x96465B3E, 0x0B5CB30F, 0xBF57C4A9,
|
||||
0x3169636C, 0x856214CA, 0x1878FCFB, 0xAC738B5D,
|
||||
0x17A6A003, 0xA3ADD7A5, 0x3EB73F94, 0x8ABC4832,
|
||||
0x0482EFF7, 0xB0899851, 0x2D937060, 0x999807C6,
|
||||
0x70E84F30, 0xC4E33896, 0x59F9D0A7, 0xEDF2A701,
|
||||
0x63CC00C4, 0xD7C77762, 0x4ADD9F53, 0xFED6E8F5,
|
||||
0xD93A7E64, 0x6D3109C2, 0xF02BE1F3, 0x44209655,
|
||||
0xCA1E3190, 0x7E154636, 0xE30FAE07, 0x5704D9A1,
|
||||
0xBE749157, 0x0A7FE6F1, 0x97650EC0, 0x236E7966,
|
||||
0xAD50DEA3, 0x195BA905, 0x84414134, 0x304A3692
|
||||
}, {
|
||||
0x00000000, 0x9E00AACC, 0x7D072542, 0xE3078F8E,
|
||||
0xFA0E4A84, 0x640EE048, 0x87096FC6, 0x1909C50A,
|
||||
0xB51BE5D3, 0x2B1B4F1F, 0xC81CC091, 0x561C6A5D,
|
||||
0x4F15AF57, 0xD115059B, 0x32128A15, 0xAC1220D9,
|
||||
0x2B31BB7C, 0xB53111B0, 0x56369E3E, 0xC83634F2,
|
||||
0xD13FF1F8, 0x4F3F5B34, 0xAC38D4BA, 0x32387E76,
|
||||
0x9E2A5EAF, 0x002AF463, 0xE32D7BED, 0x7D2DD121,
|
||||
0x6424142B, 0xFA24BEE7, 0x19233169, 0x87239BA5,
|
||||
0x566276F9, 0xC862DC35, 0x2B6553BB, 0xB565F977,
|
||||
0xAC6C3C7D, 0x326C96B1, 0xD16B193F, 0x4F6BB3F3,
|
||||
0xE379932A, 0x7D7939E6, 0x9E7EB668, 0x007E1CA4,
|
||||
0x1977D9AE, 0x87777362, 0x6470FCEC, 0xFA705620,
|
||||
0x7D53CD85, 0xE3536749, 0x0054E8C7, 0x9E54420B,
|
||||
0x875D8701, 0x195D2DCD, 0xFA5AA243, 0x645A088F,
|
||||
0xC8482856, 0x5648829A, 0xB54F0D14, 0x2B4FA7D8,
|
||||
0x324662D2, 0xAC46C81E, 0x4F414790, 0xD141ED5C,
|
||||
0xEDC29D29, 0x73C237E5, 0x90C5B86B, 0x0EC512A7,
|
||||
0x17CCD7AD, 0x89CC7D61, 0x6ACBF2EF, 0xF4CB5823,
|
||||
0x58D978FA, 0xC6D9D236, 0x25DE5DB8, 0xBBDEF774,
|
||||
0xA2D7327E, 0x3CD798B2, 0xDFD0173C, 0x41D0BDF0,
|
||||
0xC6F32655, 0x58F38C99, 0xBBF40317, 0x25F4A9DB,
|
||||
0x3CFD6CD1, 0xA2FDC61D, 0x41FA4993, 0xDFFAE35F,
|
||||
0x73E8C386, 0xEDE8694A, 0x0EEFE6C4, 0x90EF4C08,
|
||||
0x89E68902, 0x17E623CE, 0xF4E1AC40, 0x6AE1068C,
|
||||
0xBBA0EBD0, 0x25A0411C, 0xC6A7CE92, 0x58A7645E,
|
||||
0x41AEA154, 0xDFAE0B98, 0x3CA98416, 0xA2A92EDA,
|
||||
0x0EBB0E03, 0x90BBA4CF, 0x73BC2B41, 0xEDBC818D,
|
||||
0xF4B54487, 0x6AB5EE4B, 0x89B261C5, 0x17B2CB09,
|
||||
0x909150AC, 0x0E91FA60, 0xED9675EE, 0x7396DF22,
|
||||
0x6A9F1A28, 0xF49FB0E4, 0x17983F6A, 0x899895A6,
|
||||
0x258AB57F, 0xBB8A1FB3, 0x588D903D, 0xC68D3AF1,
|
||||
0xDF84FFFB, 0x41845537, 0xA283DAB9, 0x3C837075,
|
||||
0xDA853B53, 0x4485919F, 0xA7821E11, 0x3982B4DD,
|
||||
0x208B71D7, 0xBE8BDB1B, 0x5D8C5495, 0xC38CFE59,
|
||||
0x6F9EDE80, 0xF19E744C, 0x1299FBC2, 0x8C99510E,
|
||||
0x95909404, 0x0B903EC8, 0xE897B146, 0x76971B8A,
|
||||
0xF1B4802F, 0x6FB42AE3, 0x8CB3A56D, 0x12B30FA1,
|
||||
0x0BBACAAB, 0x95BA6067, 0x76BDEFE9, 0xE8BD4525,
|
||||
0x44AF65FC, 0xDAAFCF30, 0x39A840BE, 0xA7A8EA72,
|
||||
0xBEA12F78, 0x20A185B4, 0xC3A60A3A, 0x5DA6A0F6,
|
||||
0x8CE74DAA, 0x12E7E766, 0xF1E068E8, 0x6FE0C224,
|
||||
0x76E9072E, 0xE8E9ADE2, 0x0BEE226C, 0x95EE88A0,
|
||||
0x39FCA879, 0xA7FC02B5, 0x44FB8D3B, 0xDAFB27F7,
|
||||
0xC3F2E2FD, 0x5DF24831, 0xBEF5C7BF, 0x20F56D73,
|
||||
0xA7D6F6D6, 0x39D65C1A, 0xDAD1D394, 0x44D17958,
|
||||
0x5DD8BC52, 0xC3D8169E, 0x20DF9910, 0xBEDF33DC,
|
||||
0x12CD1305, 0x8CCDB9C9, 0x6FCA3647, 0xF1CA9C8B,
|
||||
0xE8C35981, 0x76C3F34D, 0x95C47CC3, 0x0BC4D60F,
|
||||
0x3747A67A, 0xA9470CB6, 0x4A408338, 0xD44029F4,
|
||||
0xCD49ECFE, 0x53494632, 0xB04EC9BC, 0x2E4E6370,
|
||||
0x825C43A9, 0x1C5CE965, 0xFF5B66EB, 0x615BCC27,
|
||||
0x7852092D, 0xE652A3E1, 0x05552C6F, 0x9B5586A3,
|
||||
0x1C761D06, 0x8276B7CA, 0x61713844, 0xFF719288,
|
||||
0xE6785782, 0x7878FD4E, 0x9B7F72C0, 0x057FD80C,
|
||||
0xA96DF8D5, 0x376D5219, 0xD46ADD97, 0x4A6A775B,
|
||||
0x5363B251, 0xCD63189D, 0x2E649713, 0xB0643DDF,
|
||||
0x6125D083, 0xFF257A4F, 0x1C22F5C1, 0x82225F0D,
|
||||
0x9B2B9A07, 0x052B30CB, 0xE62CBF45, 0x782C1589,
|
||||
0xD43E3550, 0x4A3E9F9C, 0xA9391012, 0x3739BADE,
|
||||
0x2E307FD4, 0xB030D518, 0x53375A96, 0xCD37F05A,
|
||||
0x4A146BFF, 0xD414C133, 0x37134EBD, 0xA913E471,
|
||||
0xB01A217B, 0x2E1A8BB7, 0xCD1D0439, 0x531DAEF5,
|
||||
0xFF0F8E2C, 0x610F24E0, 0x8208AB6E, 0x1C0801A2,
|
||||
0x0501C4A8, 0x9B016E64, 0x7806E1EA, 0xE6064B26
|
||||
}
|
||||
};
|
|
@ -0,0 +1,527 @@
|
|||
/* This file has been automatically generated by crc32_tablegen.c. */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
const uint32_t lzma_crc32_table[8][256] = {
|
||||
{
|
||||
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
|
||||
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
|
||||
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
|
||||
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
|
||||
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
|
||||
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
|
||||
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
|
||||
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
|
||||
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
|
||||
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
|
||||
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
|
||||
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
|
||||
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
|
||||
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
|
||||
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
|
||||
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
|
||||
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
|
||||
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
|
||||
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
|
||||
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
|
||||
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
|
||||
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
|
||||
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
|
||||
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
|
||||
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
|
||||
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
|
||||
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
|
||||
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
|
||||
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
|
||||
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
|
||||
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
|
||||
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
|
||||
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
|
||||
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
|
||||
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
|
||||
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
|
||||
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
|
||||
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
|
||||
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
|
||||
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
|
||||
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
|
||||
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
|
||||
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
|
||||
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
|
||||
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
|
||||
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
|
||||
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
|
||||
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
|
||||
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
|
||||
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
|
||||
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
|
||||
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
|
||||
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
|
||||
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
|
||||
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
|
||||
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
|
||||
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
|
||||
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
|
||||
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
|
||||
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
|
||||
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
|
||||
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
|
||||
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
|
||||
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
||||
}, {
|
||||
0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3,
|
||||
0x646CC504, 0x7D77F445, 0x565AA786, 0x4F4196C7,
|
||||
0xC8D98A08, 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB,
|
||||
0xACB54F0C, 0xB5AE7E4D, 0x9E832D8E, 0x87981CCF,
|
||||
0x4AC21251, 0x53D92310, 0x78F470D3, 0x61EF4192,
|
||||
0x2EAED755, 0x37B5E614, 0x1C98B5D7, 0x05838496,
|
||||
0x821B9859, 0x9B00A918, 0xB02DFADB, 0xA936CB9A,
|
||||
0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E,
|
||||
0x958424A2, 0x8C9F15E3, 0xA7B24620, 0xBEA97761,
|
||||
0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265,
|
||||
0x5D5DAEAA, 0x44469FEB, 0x6F6BCC28, 0x7670FD69,
|
||||
0x39316BAE, 0x202A5AEF, 0x0B07092C, 0x121C386D,
|
||||
0xDF4636F3, 0xC65D07B2, 0xED705471, 0xF46B6530,
|
||||
0xBB2AF3F7, 0xA231C2B6, 0x891C9175, 0x9007A034,
|
||||
0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38,
|
||||
0x73F379FF, 0x6AE848BE, 0x41C51B7D, 0x58DE2A3C,
|
||||
0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6,
|
||||
0x94158A01, 0x8D0EBB40, 0xA623E883, 0xBF38D9C2,
|
||||
0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE,
|
||||
0x5CCC0009, 0x45D73148, 0x6EFA628B, 0x77E153CA,
|
||||
0xBABB5D54, 0xA3A06C15, 0x888D3FD6, 0x91960E97,
|
||||
0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93,
|
||||
0x7262D75C, 0x6B79E61D, 0x4054B5DE, 0x594F849F,
|
||||
0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B,
|
||||
0x65FD6BA7, 0x7CE65AE6, 0x57CB0925, 0x4ED03864,
|
||||
0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60,
|
||||
0xAD24E1AF, 0xB43FD0EE, 0x9F12832D, 0x8609B26C,
|
||||
0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768,
|
||||
0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35,
|
||||
0x4B53BCF2, 0x52488DB3, 0x7965DE70, 0x607EEF31,
|
||||
0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D,
|
||||
0x838A36FA, 0x9A9107BB, 0xB1BC5478, 0xA8A76539,
|
||||
0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88,
|
||||
0x5FEF5D4F, 0x46F46C0E, 0x6DD93FCD, 0x74C20E8C,
|
||||
0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180,
|
||||
0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484,
|
||||
0x71418A1A, 0x685ABB5B, 0x4377E898, 0x5A6CD9D9,
|
||||
0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD,
|
||||
0xB9980012, 0xA0833153, 0x8BAE6290, 0x92B553D1,
|
||||
0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5,
|
||||
0xAE07BCE9, 0xB71C8DA8, 0x9C31DE6B, 0x852AEF2A,
|
||||
0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E,
|
||||
0x66DE36E1, 0x7FC507A0, 0x54E85463, 0x4DF36522,
|
||||
0x02B2F3E5, 0x1BA9C2A4, 0x30849167, 0x299FA026,
|
||||
0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B,
|
||||
0x80A96BBC, 0x99B25AFD, 0xB29F093E, 0xAB84387F,
|
||||
0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773,
|
||||
0x4870E1B4, 0x516BD0F5, 0x7A468336, 0x635DB277,
|
||||
0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D,
|
||||
0xAF96124A, 0xB68D230B, 0x9DA070C8, 0x84BB4189,
|
||||
0x03235D46, 0x1A386C07, 0x31153FC4, 0x280E0E85,
|
||||
0x674F9842, 0x7E54A903, 0x5579FAC0, 0x4C62CB81,
|
||||
0x8138C51F, 0x9823F45E, 0xB30EA79D, 0xAA1596DC,
|
||||
0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8,
|
||||
0x49E14F17, 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4,
|
||||
0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0,
|
||||
0x5E7EF3EC, 0x4765C2AD, 0x6C48916E, 0x7553A02F,
|
||||
0x3A1236E8, 0x230907A9, 0x0824546A, 0x113F652B,
|
||||
0x96A779E4, 0x8FBC48A5, 0xA4911B66, 0xBD8A2A27,
|
||||
0xF2CBBCE0, 0xEBD08DA1, 0xC0FDDE62, 0xD9E6EF23,
|
||||
0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, 0x3F91B27E,
|
||||
0x70D024B9, 0x69CB15F8, 0x42E6463B, 0x5BFD777A,
|
||||
0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876,
|
||||
0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72
|
||||
}, {
|
||||
0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59,
|
||||
0x0709A8DC, 0x06CBC2EB, 0x048D7CB2, 0x054F1685,
|
||||
0x0E1351B8, 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1,
|
||||
0x091AF964, 0x08D89353, 0x0A9E2D0A, 0x0B5C473D,
|
||||
0x1C26A370, 0x1DE4C947, 0x1FA2771E, 0x1E601D29,
|
||||
0x1B2F0BAC, 0x1AED619B, 0x18ABDFC2, 0x1969B5F5,
|
||||
0x1235F2C8, 0x13F798FF, 0x11B126A6, 0x10734C91,
|
||||
0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D,
|
||||
0x384D46E0, 0x398F2CD7, 0x3BC9928E, 0x3A0BF8B9,
|
||||
0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065,
|
||||
0x365E1758, 0x379C7D6F, 0x35DAC336, 0x3418A901,
|
||||
0x3157BF84, 0x3095D5B3, 0x32D36BEA, 0x331101DD,
|
||||
0x246BE590, 0x25A98FA7, 0x27EF31FE, 0x262D5BC9,
|
||||
0x23624D4C, 0x22A0277B, 0x20E69922, 0x2124F315,
|
||||
0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71,
|
||||
0x2D711CF4, 0x2CB376C3, 0x2EF5C89A, 0x2F37A2AD,
|
||||
0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399,
|
||||
0x7793251C, 0x76514F2B, 0x7417F172, 0x75D59B45,
|
||||
0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221,
|
||||
0x798074A4, 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD,
|
||||
0x6CBC2EB0, 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9,
|
||||
0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835,
|
||||
0x62AF7F08, 0x636D153F, 0x612BAB66, 0x60E9C151,
|
||||
0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D,
|
||||
0x48D7CB20, 0x4915A117, 0x4B531F4E, 0x4A917579,
|
||||
0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5,
|
||||
0x46C49A98, 0x4706F0AF, 0x45404EF6, 0x448224C1,
|
||||
0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D,
|
||||
0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609,
|
||||
0x53F8C08C, 0x523AAABB, 0x507C14E2, 0x51BE7ED5,
|
||||
0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1,
|
||||
0x5DEB9134, 0x5C29FB03, 0x5E6F455A, 0x5FAD2F6D,
|
||||
0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9,
|
||||
0xE63CB35C, 0xE7FED96B, 0xE5B86732, 0xE47A0D05,
|
||||
0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461,
|
||||
0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD,
|
||||
0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E, 0xFF5506A9,
|
||||
0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75,
|
||||
0xF300E948, 0xF2C2837F, 0xF0843D26, 0xF1465711,
|
||||
0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD,
|
||||
0xD9785D60, 0xD8BA3757, 0xDAFC890E, 0xDB3EE339,
|
||||
0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5,
|
||||
0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, 0xD52DB281,
|
||||
0xD062A404, 0xD1A0CE33, 0xD3E6706A, 0xD2241A5D,
|
||||
0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049,
|
||||
0xC25756CC, 0xC3953CFB, 0xC1D382A2, 0xC011E895,
|
||||
0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1,
|
||||
0xCC440774, 0xCD866D43, 0xCFC0D31A, 0xCE02B92D,
|
||||
0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819,
|
||||
0x96A63E9C, 0x976454AB, 0x9522EAF2, 0x94E080C5,
|
||||
0x9FBCC7F8, 0x9E7EADCF, 0x9C381396, 0x9DFA79A1,
|
||||
0x98B56F24, 0x99770513, 0x9B31BB4A, 0x9AF3D17D,
|
||||
0x8D893530, 0x8C4B5F07, 0x8E0DE15E, 0x8FCF8B69,
|
||||
0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5,
|
||||
0x839A6488, 0x82580EBF, 0x801EB0E6, 0x81DCDAD1,
|
||||
0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D,
|
||||
0xA9E2D0A0, 0xA820BA97, 0xAA6604CE, 0xABA46EF9,
|
||||
0xAEEB787C, 0xAF29124B, 0xAD6FAC12, 0xACADC625,
|
||||
0xA7F18118, 0xA633EB2F, 0xA4755576, 0xA5B73F41,
|
||||
0xA0F829C4, 0xA13A43F3, 0xA37CFDAA, 0xA2BE979D,
|
||||
0xB5C473D0, 0xB40619E7, 0xB640A7BE, 0xB782CD89,
|
||||
0xB2CDDB0C, 0xB30FB13B, 0xB1490F62, 0xB08B6555,
|
||||
0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31,
|
||||
0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED
|
||||
}, {
|
||||
0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE,
|
||||
0x8F629757, 0x37DEF032, 0x256B5FDC, 0x9DD738B9,
|
||||
0xC5B428EF, 0x7D084F8A, 0x6FBDE064, 0xD7018701,
|
||||
0x4AD6BFB8, 0xF26AD8DD, 0xE0DF7733, 0x58631056,
|
||||
0x5019579F, 0xE8A530FA, 0xFA109F14, 0x42ACF871,
|
||||
0xDF7BC0C8, 0x67C7A7AD, 0x75720843, 0xCDCE6F26,
|
||||
0x95AD7F70, 0x2D111815, 0x3FA4B7FB, 0x8718D09E,
|
||||
0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9,
|
||||
0xA032AF3E, 0x188EC85B, 0x0A3B67B5, 0xB28700D0,
|
||||
0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787,
|
||||
0x658687D1, 0xDD3AE0B4, 0xCF8F4F5A, 0x7733283F,
|
||||
0xEAE41086, 0x525877E3, 0x40EDD80D, 0xF851BF68,
|
||||
0xF02BF8A1, 0x48979FC4, 0x5A22302A, 0xE29E574F,
|
||||
0x7F496FF6, 0xC7F50893, 0xD540A77D, 0x6DFCC018,
|
||||
0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0,
|
||||
0xBAFD4719, 0x0241207C, 0x10F48F92, 0xA848E8F7,
|
||||
0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3,
|
||||
0x1476CF6A, 0xACCAA80F, 0xBE7F07E1, 0x06C36084,
|
||||
0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C,
|
||||
0xD1C2E785, 0x697E80E0, 0x7BCB2F0E, 0xC377486B,
|
||||
0xCB0D0FA2, 0x73B168C7, 0x6104C729, 0xD9B8A04C,
|
||||
0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B,
|
||||
0x0EB9274D, 0xB6054028, 0xA4B0EFC6, 0x1C0C88A3,
|
||||
0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4,
|
||||
0x3B26F703, 0x839A9066, 0x912F3F88, 0x299358ED,
|
||||
0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA,
|
||||
0xFE92DFEC, 0x462EB889, 0x549B1767, 0xEC277002,
|
||||
0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755,
|
||||
0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72,
|
||||
0xE45D37CB, 0x5CE150AE, 0x4E54FF40, 0xF6E89825,
|
||||
0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D,
|
||||
0x21E91F24, 0x99557841, 0x8BE0D7AF, 0x335CB0CA,
|
||||
0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5,
|
||||
0x623B216C, 0xDA874609, 0xC832E9E7, 0x708E8E82,
|
||||
0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A,
|
||||
0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D,
|
||||
0xBD40E1A4, 0x05FC86C1, 0x1749292F, 0xAFF54E4A,
|
||||
0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D,
|
||||
0x78F4C94B, 0xC048AE2E, 0xD2FD01C0, 0x6A4166A5,
|
||||
0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2,
|
||||
0x4D6B1905, 0xF5D77E60, 0xE762D18E, 0x5FDEB6EB,
|
||||
0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC,
|
||||
0x88DF31EA, 0x3063568F, 0x22D6F961, 0x9A6A9E04,
|
||||
0x07BDA6BD, 0xBF01C1D8, 0xADB46E36, 0x15080953,
|
||||
0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174,
|
||||
0x9210D9CD, 0x2AACBEA8, 0x38191146, 0x80A57623,
|
||||
0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B,
|
||||
0x57A4F122, 0xEF189647, 0xFDAD39A9, 0x45115ECC,
|
||||
0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8,
|
||||
0xF92F7951, 0x41931E34, 0x5326B1DA, 0xEB9AD6BF,
|
||||
0xB3F9C6E9, 0x0B45A18C, 0x19F00E62, 0xA14C6907,
|
||||
0x3C9B51BE, 0x842736DB, 0x96929935, 0x2E2EFE50,
|
||||
0x2654B999, 0x9EE8DEFC, 0x8C5D7112, 0x34E11677,
|
||||
0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120,
|
||||
0xE3E09176, 0x5B5CF613, 0x49E959FD, 0xF1553E98,
|
||||
0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF,
|
||||
0xD67F4138, 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6,
|
||||
0x591DD66F, 0xE1A1B10A, 0xF3141EE4, 0x4BA87981,
|
||||
0x13CB69D7, 0xAB770EB2, 0xB9C2A15C, 0x017EC639,
|
||||
0x9CA9FE80, 0x241599E5, 0x36A0360B, 0x8E1C516E,
|
||||
0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, 0x94D3B949,
|
||||
0x090481F0, 0xB1B8E695, 0xA30D497B, 0x1BB12E1E,
|
||||
0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6,
|
||||
0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1
|
||||
}, {
|
||||
0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0,
|
||||
0xF580A6C0, 0xC8E08F70, 0x8F40F5A0, 0xB220DC10,
|
||||
0x30704BC1, 0x0D106271, 0x4AB018A1, 0x77D03111,
|
||||
0xC5F0ED01, 0xF890C4B1, 0xBF30BE61, 0x825097D1,
|
||||
0x60E09782, 0x5D80BE32, 0x1A20C4E2, 0x2740ED52,
|
||||
0x95603142, 0xA80018F2, 0xEFA06222, 0xD2C04B92,
|
||||
0x5090DC43, 0x6DF0F5F3, 0x2A508F23, 0x1730A693,
|
||||
0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053,
|
||||
0xC1C12F04, 0xFCA106B4, 0xBB017C64, 0x866155D4,
|
||||
0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314,
|
||||
0xF1B164C5, 0xCCD14D75, 0x8B7137A5, 0xB6111E15,
|
||||
0x0431C205, 0x3951EBB5, 0x7EF19165, 0x4391B8D5,
|
||||
0xA121B886, 0x9C419136, 0xDBE1EBE6, 0xE681C256,
|
||||
0x54A11E46, 0x69C137F6, 0x2E614D26, 0x13016496,
|
||||
0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997,
|
||||
0x64D15587, 0x59B17C37, 0x1E1106E7, 0x23712F57,
|
||||
0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299,
|
||||
0xAD73FE89, 0x9013D739, 0xD7B3ADE9, 0xEAD38459,
|
||||
0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958,
|
||||
0x9D03B548, 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98,
|
||||
0x3813CFCB, 0x0573E67B, 0x42D39CAB, 0x7FB3B51B,
|
||||
0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB,
|
||||
0x0863840A, 0x3503ADBA, 0x72A3D76A, 0x4FC3FEDA,
|
||||
0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A,
|
||||
0x9932774D, 0xA4525EFD, 0xE3F2242D, 0xDE920D9D,
|
||||
0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D,
|
||||
0xA9423C8C, 0x9422153C, 0xD3826FEC, 0xEEE2465C,
|
||||
0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C,
|
||||
0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F,
|
||||
0x0C52460F, 0x31326FBF, 0x7692156F, 0x4BF23CDF,
|
||||
0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE,
|
||||
0x3C220DCE, 0x0142247E, 0x46E25EAE, 0x7B82771E,
|
||||
0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42,
|
||||
0x44661652, 0x79063FE2, 0x3EA64532, 0x03C66C82,
|
||||
0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183,
|
||||
0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743,
|
||||
0xD1062710, 0xEC660EA0, 0xABC67470, 0x96A65DC0,
|
||||
0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00,
|
||||
0xE1766CD1, 0xDC164561, 0x9BB63FB1, 0xA6D61601,
|
||||
0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1,
|
||||
0x70279F96, 0x4D47B626, 0x0AE7CCF6, 0x3787E546,
|
||||
0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386,
|
||||
0x4057D457, 0x7D37FDE7, 0x3A978737, 0x07F7AE87,
|
||||
0xB5D77297, 0x88B75B27, 0xCF1721F7, 0xF2770847,
|
||||
0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4,
|
||||
0xE547AED4, 0xD8278764, 0x9F87FDB4, 0xA2E7D404,
|
||||
0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905,
|
||||
0xD537E515, 0xE857CCA5, 0xAFF7B675, 0x92979FC5,
|
||||
0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B,
|
||||
0x1C954E1B, 0x21F567AB, 0x66551D7B, 0x5B3534CB,
|
||||
0xD965A31A, 0xE4058AAA, 0xA3A5F07A, 0x9EC5D9CA,
|
||||
0x2CE505DA, 0x11852C6A, 0x562556BA, 0x6B457F0A,
|
||||
0x89F57F59, 0xB49556E9, 0xF3352C39, 0xCE550589,
|
||||
0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349,
|
||||
0xB9853498, 0x84E51D28, 0xC34567F8, 0xFE254E48,
|
||||
0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888,
|
||||
0x28D4C7DF, 0x15B4EE6F, 0x521494BF, 0x6F74BD0F,
|
||||
0xDD54611F, 0xE03448AF, 0xA794327F, 0x9AF41BCF,
|
||||
0x18A48C1E, 0x25C4A5AE, 0x6264DF7E, 0x5F04F6CE,
|
||||
0xED242ADE, 0xD044036E, 0x97E479BE, 0xAA84500E,
|
||||
0x4834505D, 0x755479ED, 0x32F4033D, 0x0F942A8D,
|
||||
0xBDB4F69D, 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D,
|
||||
0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C,
|
||||
0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C
|
||||
}, {
|
||||
0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE,
|
||||
0x9B914216, 0x50CD91B3, 0xD659E31D, 0x1D0530B8,
|
||||
0xEC53826D, 0x270F51C8, 0xA19B2366, 0x6AC7F0C3,
|
||||
0x77C2C07B, 0xBC9E13DE, 0x3A0A6170, 0xF156B2D5,
|
||||
0x03D6029B, 0xC88AD13E, 0x4E1EA390, 0x85427035,
|
||||
0x9847408D, 0x531B9328, 0xD58FE186, 0x1ED33223,
|
||||
0xEF8580F6, 0x24D95353, 0xA24D21FD, 0x6911F258,
|
||||
0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E,
|
||||
0x07AC0536, 0xCCF0D693, 0x4A64A43D, 0x81387798,
|
||||
0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E,
|
||||
0xEBFF875B, 0x20A354FE, 0xA6372650, 0x6D6BF5F5,
|
||||
0x706EC54D, 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3,
|
||||
0x047A07AD, 0xCF26D408, 0x49B2A6A6, 0x82EE7503,
|
||||
0x9FEB45BB, 0x54B7961E, 0xD223E4B0, 0x197F3715,
|
||||
0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E,
|
||||
0x73B8C7D6, 0xB8E41473, 0x3E7066DD, 0xF52CB578,
|
||||
0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2,
|
||||
0x94C9487A, 0x5F959BDF, 0xD901E971, 0x125D3AD4,
|
||||
0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF,
|
||||
0x789ACA17, 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9,
|
||||
0x0C8E08F7, 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59,
|
||||
0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F,
|
||||
0xE0DD8A9A, 0x2B81593F, 0xAD152B91, 0x6649F834,
|
||||
0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22,
|
||||
0x08F40F5A, 0xC3A8DCFF, 0x453CAE51, 0x8E607DF4,
|
||||
0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2,
|
||||
0xE4A78D37, 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99,
|
||||
0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F,
|
||||
0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F,
|
||||
0x90B34FD7, 0x5BEF9C72, 0xDD7BEEDC, 0x16273D79,
|
||||
0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02,
|
||||
0x7CE0CDBA, 0xB7BC1E1F, 0x31286CB1, 0xFA74BF14,
|
||||
0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676,
|
||||
0x852156CE, 0x4E7D856B, 0xC8E9F7C5, 0x03B52460,
|
||||
0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B,
|
||||
0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D,
|
||||
0x1D661643, 0xD63AC5E6, 0x50AEB748, 0x9BF264ED,
|
||||
0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB,
|
||||
0xF135942E, 0x3A69478B, 0xBCFD3525, 0x77A1E680,
|
||||
0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496,
|
||||
0x191C11EE, 0xD240C24B, 0x54D4B0E5, 0x9F886340,
|
||||
0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156,
|
||||
0xF54F9383, 0x3E134026, 0xB8873288, 0x73DBE12D,
|
||||
0x6EDED195, 0xA5820230, 0x2316709E, 0xE84AA33B,
|
||||
0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB,
|
||||
0x815B5163, 0x4A0782C6, 0xCC93F068, 0x07CF23CD,
|
||||
0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6,
|
||||
0x6D08D30E, 0xA65400AB, 0x20C07205, 0xEB9CA1A0,
|
||||
0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A,
|
||||
0x8A795CA2, 0x41258F07, 0xC7B1FDA9, 0x0CED2E0C,
|
||||
0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2, 0x7B2FEE77,
|
||||
0x662ADECF, 0xAD760D6A, 0x2BE27FC4, 0xE0BEAC61,
|
||||
0x123E1C2F, 0xD962CF8A, 0x5FF6BD24, 0x94AA6E81,
|
||||
0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97,
|
||||
0xFE6D9E42, 0x35314DE7, 0xB3A53F49, 0x78F9ECEC,
|
||||
0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA,
|
||||
0x16441B82, 0xDD18C827, 0x5B8CBA89, 0x90D0692C,
|
||||
0x8DD55994, 0x46898A31, 0xC01DF89F, 0x0B412B3A,
|
||||
0xFA1799EF, 0x314B4A4A, 0xB7DF38E4, 0x7C83EB41,
|
||||
0x6186DBF9, 0xAADA085C, 0x2C4E7AF2, 0xE712A957,
|
||||
0x15921919, 0xDECECABC, 0x585AB812, 0x93066BB7,
|
||||
0x8E035B0F, 0x455F88AA, 0xC3CBFA04, 0x089729A1,
|
||||
0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA,
|
||||
0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC
|
||||
}, {
|
||||
0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D,
|
||||
0xF44F2413, 0x52382FA7, 0x63D0353A, 0xC5A73E8E,
|
||||
0x33EF4E67, 0x959845D3, 0xA4705F4E, 0x020754FA,
|
||||
0xC7A06A74, 0x61D761C0, 0x503F7B5D, 0xF64870E9,
|
||||
0x67DE9CCE, 0xC1A9977A, 0xF0418DE7, 0x56368653,
|
||||
0x9391B8DD, 0x35E6B369, 0x040EA9F4, 0xA279A240,
|
||||
0x5431D2A9, 0xF246D91D, 0xC3AEC380, 0x65D9C834,
|
||||
0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27,
|
||||
0xCFBD399C, 0x69CA3228, 0x582228B5, 0xFE552301,
|
||||
0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712,
|
||||
0xFC5277FB, 0x5A257C4F, 0x6BCD66D2, 0xCDBA6D66,
|
||||
0x081D53E8, 0xAE6A585C, 0x9F8242C1, 0x39F54975,
|
||||
0xA863A552, 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF,
|
||||
0x5C2C8141, 0xFA5B8AF5, 0xCBB39068, 0x6DC49BDC,
|
||||
0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8,
|
||||
0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F, 0x5E2BD5BB,
|
||||
0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4,
|
||||
0xB044516A, 0x16335ADE, 0x27DB4043, 0x81AC4BF7,
|
||||
0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183,
|
||||
0x83AB1F0D, 0x25DC14B9, 0x14340E24, 0xB2430590,
|
||||
0x23D5E9B7, 0x85A2E203, 0xB44AF89E, 0x123DF32A,
|
||||
0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739,
|
||||
0x103AA7D0, 0xB64DAC64, 0x87A5B6F9, 0x21D2BD4D,
|
||||
0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E,
|
||||
0x8BB64CE5, 0x2DC14751, 0x1C295DCC, 0xBA5E5678,
|
||||
0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B,
|
||||
0xB8590282, 0x1E2E0936, 0x2FC613AB, 0x89B1181F,
|
||||
0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C,
|
||||
0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6,
|
||||
0x1827F438, 0xBE50FF8C, 0x8FB8E511, 0x29CFEEA5,
|
||||
0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1,
|
||||
0x2BC8BA5F, 0x8DBFB1EB, 0xBC57AB76, 0x1A20A0C2,
|
||||
0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F,
|
||||
0x7C59CEE1, 0xDA2EC555, 0xEBC6DFC8, 0x4DB1D47C,
|
||||
0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08,
|
||||
0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B,
|
||||
0xEFC8763C, 0x49BF7D88, 0x78576715, 0xDE206CA1,
|
||||
0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2,
|
||||
0xDC27385B, 0x7A5033EF, 0x4BB82972, 0xEDCF22C6,
|
||||
0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5,
|
||||
0x47ABD36E, 0xE1DCD8DA, 0xD034C247, 0x7643C9F3,
|
||||
0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0,
|
||||
0x74449D09, 0xD23396BD, 0xE3DB8C20, 0x45AC8794,
|
||||
0x800BB91A, 0x267CB2AE, 0x1794A833, 0xB1E3A387,
|
||||
0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D,
|
||||
0xD43A6BB3, 0x724D6007, 0x43A57A9A, 0xE5D2712E,
|
||||
0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A,
|
||||
0xE7D525D4, 0x41A22E60, 0x704A34FD, 0xD63D3F49,
|
||||
0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516,
|
||||
0x3852BB98, 0x9E25B02C, 0xAFCDAAB1, 0x09BAA105,
|
||||
0xFFF2D1EC, 0x5985DA58, 0x686DC0C5, 0xCE1ACB71,
|
||||
0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, 0x3A55EF62,
|
||||
0xABC30345, 0x0DB408F1, 0x3C5C126C, 0x9A2B19D8,
|
||||
0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB,
|
||||
0x982C4D22, 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF,
|
||||
0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC,
|
||||
0x03A0A617, 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A,
|
||||
0xF7EF8204, 0x519889B0, 0x6070932D, 0xC6079899,
|
||||
0x304FE870, 0x9638E3C4, 0xA7D0F959, 0x01A7F2ED,
|
||||
0xC400CC63, 0x6277C7D7, 0x539FDD4A, 0xF5E8D6FE,
|
||||
0x647E3AD9, 0xC209316D, 0xF3E12BF0, 0x55962044,
|
||||
0x90311ECA, 0x3646157E, 0x07AE0FE3, 0xA1D90457,
|
||||
0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23,
|
||||
0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30
|
||||
}, {
|
||||
0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3,
|
||||
0x844A0EFA, 0x48E00E64, 0xC66F0987, 0x0AC50919,
|
||||
0xD3E51BB5, 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56,
|
||||
0x57AF154F, 0x9B0515D1, 0x158A1232, 0xD92012AC,
|
||||
0x7CBB312B, 0xB01131B5, 0x3E9E3656, 0xF23436C8,
|
||||
0xF8F13FD1, 0x345B3F4F, 0xBAD438AC, 0x767E3832,
|
||||
0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, 0x21D12D7D,
|
||||
0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387,
|
||||
0xF9766256, 0x35DC62C8, 0xBB53652B, 0x77F965B5,
|
||||
0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F,
|
||||
0x2A9379E3, 0xE639797D, 0x68B67E9E, 0xA41C7E00,
|
||||
0xAED97719, 0x62737787, 0xECFC7064, 0x205670FA,
|
||||
0x85CD537D, 0x496753E3, 0xC7E85400, 0x0B42549E,
|
||||
0x01875D87, 0xCD2D5D19, 0x43A25AFA, 0x8F085A64,
|
||||
0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B,
|
||||
0xD2624632, 0x1EC846AC, 0x9047414F, 0x5CED41D1,
|
||||
0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E,
|
||||
0xADD7CC17, 0x617DCC89, 0xEFF2CB6A, 0x2358CBF4,
|
||||
0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB,
|
||||
0x7E32D7A2, 0xB298D73C, 0x3C17D0DF, 0xF0BDD041,
|
||||
0x5526F3C6, 0x998CF358, 0x1703F4BB, 0xDBA9F425,
|
||||
0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF,
|
||||
0x86C3E873, 0x4A69E8ED, 0xC4E6EF0E, 0x084CEF90,
|
||||
0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A,
|
||||
0xD0EBA0BB, 0x1C41A025, 0x92CEA7C6, 0x5E64A758,
|
||||
0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2,
|
||||
0x030EBB0E, 0xCFA4BB90, 0x412BBC73, 0x8D81BCED,
|
||||
0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217,
|
||||
0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673,
|
||||
0x281A9F6A, 0xE4B09FF4, 0x6A3F9817, 0xA6959889,
|
||||
0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6,
|
||||
0xFBFF84DF, 0x37558441, 0xB9DA83A2, 0x7570833C,
|
||||
0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239,
|
||||
0xD7718B20, 0x1BDB8BBE, 0x95548C5D, 0x59FE8CC3,
|
||||
0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C,
|
||||
0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776,
|
||||
0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C, 0xA10FB312,
|
||||
0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8,
|
||||
0xFC65AF44, 0x30CFAFDA, 0xBE40A839, 0x72EAA8A7,
|
||||
0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D,
|
||||
0xAA4DE78C, 0x66E7E712, 0xE868E0F1, 0x24C2E06F,
|
||||
0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95,
|
||||
0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, 0xF727FBDA,
|
||||
0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE, 0x736DF520,
|
||||
0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144,
|
||||
0x52BCD85D, 0x9E16D8C3, 0x1099DF20, 0xDC33DFBE,
|
||||
0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1,
|
||||
0x8159C3E8, 0x4DF3C376, 0xC37CC495, 0x0FD6C40B,
|
||||
0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4,
|
||||
0xFEEC49CD, 0x32464953, 0xBCC94EB0, 0x70634E2E,
|
||||
0xA9435C82, 0x65E95C1C, 0xEB665BFF, 0x27CC5B61,
|
||||
0x2D095278, 0xE1A352E6, 0x6F2C5505, 0xA386559B,
|
||||
0x061D761C, 0xCAB77682, 0x44387161, 0x889271FF,
|
||||
0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05,
|
||||
0xD5F86DA9, 0x19526D37, 0x97DD6AD4, 0x5B776A4A,
|
||||
0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0,
|
||||
0x83D02561, 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282,
|
||||
0x079A2B9B, 0xCB302B05, 0x45BF2CE6, 0x89152C78,
|
||||
0x50353ED4, 0x9C9F3E4A, 0x121039A9, 0xDEBA3937,
|
||||
0xD47F302E, 0x18D530B0, 0x965A3753, 0x5AF037CD,
|
||||
0xFF6B144A, 0x33C114D4, 0xBD4E1337, 0x71E413A9,
|
||||
0x7B211AB0, 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53,
|
||||
0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C,
|
||||
0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6
|
||||
}
|
||||
};
|
|
@ -0,0 +1,55 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc32_tablegen.c
|
||||
/// \brief Generates CRC32 crc32_table.c
|
||||
///
|
||||
/// Compiling: gcc -std=c99 -o crc32_tablegen crc32_tablegen.c crc32_init.c
|
||||
/// Add -DWORDS_BIGENDIAN to generate big endian table.
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
extern void lzma_crc32_init(void);
|
||||
|
||||
extern uint32_t lzma_crc32_table[8][256];
|
||||
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
lzma_crc32_init();
|
||||
|
||||
printf("/* This file has been automatically generated by "
|
||||
"crc32_tablegen.c. */\n\n"
|
||||
"#include <inttypes.h>\n\n"
|
||||
"const uint32_t lzma_crc32_table[8][256] = {\n\t{");
|
||||
|
||||
for (size_t s = 0; s < 8; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
if ((b % 4) == 0)
|
||||
printf("\n\t\t");
|
||||
|
||||
printf("0x%08" PRIX32, lzma_crc32_table[s][b]);
|
||||
|
||||
if (b != 255)
|
||||
printf(", ");
|
||||
}
|
||||
|
||||
if (s == 7)
|
||||
printf("\n\t}\n};\n");
|
||||
else
|
||||
printf("\n\t}, {");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,217 @@
|
|||
/*
|
||||
* Speed-optimized CRC32 using slicing-by-eight algorithm
|
||||
* Instruction set: i386
|
||||
* Optimized for: i686
|
||||
*
|
||||
* This code has been put into the public domain by its authors:
|
||||
* Original code by Igor Pavlov <http://7-zip.org/>
|
||||
* Position-independent version by Lasse Collin <lasse.collin@tukaani.org>
|
||||
*
|
||||
* This code needs lzma_crc32_table, which can be created using the
|
||||
* following C code:
|
||||
|
||||
uint32_t lzma_crc32_table[8][256];
|
||||
|
||||
void
|
||||
init_table(void)
|
||||
{
|
||||
// IEEE-802.3 (CRC32)
|
||||
static const uint32_t poly32 = UINT32_C(0xEDB88320);
|
||||
|
||||
// Castagnoli (CRC32C)
|
||||
// static const uint32_t poly32 = UINT32_C(0x82F63B78);
|
||||
|
||||
// Koopman
|
||||
// static const uint32_t poly32 = UINT32_C(0xEB31D82E);
|
||||
|
||||
for (size_t s = 0; s < 8; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
uint32_t r = s == 0 ? b : lzma_crc32_table[s - 1][b];
|
||||
|
||||
for (size_t i = 0; i < 8; ++i) {
|
||||
if (r & 1)
|
||||
r = (r >> 1) ^ poly32;
|
||||
else
|
||||
r >>= 1;
|
||||
}
|
||||
|
||||
lzma_crc32_table[s][b] = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
* The prototype of the CRC32 function:
|
||||
* extern uint32_t lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc);
|
||||
*/
|
||||
|
||||
.text
|
||||
.global lzma_crc32
|
||||
.type lzma_crc32, @function
|
||||
|
||||
.align 16
|
||||
lzma_crc32:
|
||||
/*
|
||||
* Register usage:
|
||||
* %eax crc
|
||||
* %esi buf
|
||||
* %edi size or buf + size
|
||||
* %ebx lzma_crc32_table
|
||||
* %ebp Table index
|
||||
* %ecx Temporary
|
||||
* %edx Temporary
|
||||
*/
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
pushl %ebp
|
||||
movl 0x14(%esp), %esi /* buf */
|
||||
movl 0x18(%esp), %edi /* size */
|
||||
movl 0x1C(%esp), %eax /* crc */
|
||||
|
||||
/*
|
||||
* Store the address of lzma_crc32_table to %ebx. This is needed to
|
||||
* get position-independent code (PIC).
|
||||
*/
|
||||
call .L_PIC
|
||||
.L_PIC:
|
||||
popl %ebx
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-.L_PIC], %ebx
|
||||
movl lzma_crc32_table@GOT(%ebx), %ebx
|
||||
|
||||
/* Complement the initial value. */
|
||||
notl %eax
|
||||
|
||||
.align 16
|
||||
.L_align:
|
||||
/*
|
||||
* Check if there is enough input to use slicing-by-eight.
|
||||
* We need 16 bytes, because the loop pre-reads eight bytes.
|
||||
*/
|
||||
cmpl $16, %edi
|
||||
jl .L_rest
|
||||
|
||||
/* Check if we have reached alignment of eight bytes. */
|
||||
testl $7, %esi
|
||||
jz .L_slice
|
||||
|
||||
/* Calculate CRC of the next input byte. */
|
||||
movzbl (%esi), %ebp
|
||||
incl %esi
|
||||
movzbl %al, %ecx
|
||||
xorl %ecx, %ebp
|
||||
shrl $8, %eax
|
||||
xorl (%ebx, %ebp, 4), %eax
|
||||
decl %edi
|
||||
jmp .L_align
|
||||
|
||||
.align 4
|
||||
.L_slice:
|
||||
/*
|
||||
* If we get here, there's at least 16 bytes of aligned input
|
||||
* available. Make %edi multiple of eight bytes. Store the possible
|
||||
* remainder over the "size" variable in the argument stack.
|
||||
*/
|
||||
movl %edi, 0x18(%esp)
|
||||
andl $-8, %edi
|
||||
subl %edi, 0x18(%esp)
|
||||
|
||||
/*
|
||||
* Let %edi be buf + size - 8 while running the main loop. This way
|
||||
* we can compare for equality to determine when exit the loop.
|
||||
*/
|
||||
addl %esi, %edi
|
||||
subl $8, %edi
|
||||
|
||||
/* Read in the first eight aligned bytes. */
|
||||
xorl (%esi), %eax
|
||||
movl 4(%esi), %ecx
|
||||
movzbl %cl, %ebp
|
||||
|
||||
.L_loop:
|
||||
movl 0x0C00(%ebx, %ebp, 4), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl 0x0800(%ebx, %ebp, 4), %edx
|
||||
shrl $16, %ecx
|
||||
xorl 8(%esi), %edx
|
||||
movzbl %cl, %ebp
|
||||
xorl 0x0400(%ebx, %ebp, 4), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl (%ebx, %ebp, 4), %edx
|
||||
movzbl %al, %ebp
|
||||
|
||||
/*
|
||||
* Read the next four bytes, for which the CRC is calculated
|
||||
* on the next interation of the loop.
|
||||
*/
|
||||
movl 12(%esi), %ecx
|
||||
|
||||
xorl 0x1C00(%ebx, %ebp, 4), %edx
|
||||
movzbl %ah, %ebp
|
||||
shrl $16, %eax
|
||||
xorl 0x1800(%ebx, %ebp, 4), %edx
|
||||
movzbl %ah, %ebp
|
||||
movzbl %al, %eax
|
||||
movl 0x1400(%ebx, %eax, 4), %eax
|
||||
addl $8, %esi
|
||||
xorl %edx, %eax
|
||||
xorl 0x1000(%ebx, %ebp, 4), %eax
|
||||
|
||||
/* Check for end of aligned input. */
|
||||
cmpl %edi, %esi
|
||||
movzbl %cl, %ebp
|
||||
jne .L_loop
|
||||
|
||||
/*
|
||||
* Process the remaining eight bytes, which we have already
|
||||
* copied to %ecx and %edx.
|
||||
*/
|
||||
movl 0x0C00(%ebx, %ebp, 4), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl 0x0800(%ebx, %ebp, 4), %edx
|
||||
shrl $16, %ecx
|
||||
movzbl %cl, %ebp
|
||||
xorl 0x0400(%ebx, %ebp, 4), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl (%ebx, %ebp, 4), %edx
|
||||
movzbl %al, %ebp
|
||||
|
||||
xorl 0x1C00(%ebx, %ebp, 4), %edx
|
||||
movzbl %ah, %ebp
|
||||
shrl $16, %eax
|
||||
xorl 0x1800(%ebx, %ebp, 4), %edx
|
||||
movzbl %ah, %ebp
|
||||
movzbl %al, %eax
|
||||
movl 0x1400(%ebx, %eax, 4), %eax
|
||||
addl $8, %esi
|
||||
xorl %edx, %eax
|
||||
xorl 0x1000(%ebx, %ebp, 4), %eax
|
||||
|
||||
/* Copy the number of remaining bytes to %edi. */
|
||||
movl 0x18(%esp), %edi
|
||||
|
||||
.L_rest:
|
||||
/* Check for end of input. */
|
||||
testl %edi, %edi
|
||||
jz .L_return
|
||||
|
||||
/* Calculate CRC of the next input byte. */
|
||||
movzbl (%esi), %ebp
|
||||
incl %esi
|
||||
movzbl %al, %ecx
|
||||
xorl %ecx, %ebp
|
||||
shrl $8, %eax
|
||||
xorl (%ebx, %ebp, 4), %eax
|
||||
decl %edi
|
||||
jmp .L_rest
|
||||
|
||||
.L_return:
|
||||
/* Complement the final value. */
|
||||
notl %eax
|
||||
|
||||
popl %ebp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
.size lzma_crc32, .-lzma_crc32
|
|
@ -0,0 +1,75 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc64.c
|
||||
/// \brief CRC64 calculation
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "check.h"
|
||||
#include "crc_macros.h"
|
||||
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# define A1(x) ((x) >> 56)
|
||||
#else
|
||||
# define A1 A
|
||||
#endif
|
||||
|
||||
|
||||
// See comments in crc32.c.
|
||||
extern uint64_t
|
||||
lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc)
|
||||
{
|
||||
crc = ~crc;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
crc = bswap_64(crc);
|
||||
#endif
|
||||
|
||||
if (size > 4) {
|
||||
while ((uintptr_t)(buf) & 3) {
|
||||
crc = lzma_crc64_table[0][*buf++ ^ A1(crc)] ^ S8(crc);
|
||||
--size;
|
||||
}
|
||||
|
||||
const uint8_t *const limit = buf + (size & ~(size_t)(3));
|
||||
size &= (size_t)(3);
|
||||
|
||||
// Calculate the CRC64 using the slice-by-four algorithm.
|
||||
//
|
||||
// In contrast to CRC32 code, this one seems to be fastest
|
||||
// with -O3 -fomit-frame-pointer.
|
||||
while (buf < limit) {
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
const uint32_t tmp = (crc >> 32) ^ *(uint32_t *)(buf);
|
||||
#else
|
||||
const uint32_t tmp = crc ^ *(uint32_t *)(buf);
|
||||
#endif
|
||||
buf += 4;
|
||||
|
||||
// It is critical for performance, that
|
||||
// the crc variable is XORed between the
|
||||
// two table-lookup pairs.
|
||||
crc = lzma_crc64_table[3][A(tmp)]
|
||||
^ lzma_crc64_table[2][B(tmp)]
|
||||
^ S32(crc)
|
||||
^ lzma_crc64_table[1][C(tmp)]
|
||||
^ lzma_crc64_table[0][D(tmp)];
|
||||
}
|
||||
}
|
||||
|
||||
while (size-- != 0)
|
||||
crc = lzma_crc64_table[0][*buf++ ^ A1(crc)] ^ S8(crc);
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
crc = bswap_64(crc);
|
||||
#endif
|
||||
|
||||
return ~crc;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc64_init.c
|
||||
/// \brief CRC64 table initialization
|
||||
//
|
||||
// This code is based on various public domain sources.
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# include "check_byteswap.h"
|
||||
#endif
|
||||
|
||||
|
||||
uint64_t lzma_crc64_table[4][256];
|
||||
|
||||
|
||||
extern void
|
||||
lzma_crc64_init(void)
|
||||
{
|
||||
static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42);
|
||||
|
||||
for (size_t s = 0; s < 4; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
uint64_t r = s == 0 ? b : lzma_crc64_table[s - 1][b];
|
||||
|
||||
for (size_t i = 0; i < 8; ++i) {
|
||||
if (r & 1)
|
||||
r = (r >> 1) ^ poly64;
|
||||
else
|
||||
r >>= 1;
|
||||
}
|
||||
|
||||
lzma_crc64_table[s][b] = r;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
for (size_t s = 0; s < 4; ++s)
|
||||
for (size_t b = 0; b < 256; ++b)
|
||||
lzma_crc64_table[s][b]
|
||||
= bswap_64(lzma_crc64_table[s][b]);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc64_table.c
|
||||
/// \brief Precalculated CRC64 table with correct endianness
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# include "crc64_table_be.h"
|
||||
#else
|
||||
# include "crc64_table_le.h"
|
||||
#endif
|
|
@ -0,0 +1,523 @@
|
|||
/* This file has been automatically generated by crc64_tablegen.c. */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
const uint64_t lzma_crc64_table[4][256] = {
|
||||
{
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0x6F5FA703BE4C2EB3),
|
||||
UINT64_C(0x5BA040A8573684F4), UINT64_C(0x34FFE7ABE97AAA47),
|
||||
UINT64_C(0x335E8FFF84C3D07B), UINT64_C(0x5C0128FC3A8FFEC8),
|
||||
UINT64_C(0x68FECF57D3F5548F), UINT64_C(0x07A168546DB97A3C),
|
||||
UINT64_C(0x66BC1EFF0987A1F7), UINT64_C(0x09E3B9FCB7CB8F44),
|
||||
UINT64_C(0x3D1C5E575EB12503), UINT64_C(0x5243F954E0FD0BB0),
|
||||
UINT64_C(0x55E291008D44718C), UINT64_C(0x3ABD360333085F3F),
|
||||
UINT64_C(0x0E42D1A8DA72F578), UINT64_C(0x611D76AB643EDBCB),
|
||||
UINT64_C(0x4966335138A19B7D), UINT64_C(0x2639945286EDB5CE),
|
||||
UINT64_C(0x12C673F96F971F89), UINT64_C(0x7D99D4FAD1DB313A),
|
||||
UINT64_C(0x7A38BCAEBC624B06), UINT64_C(0x15671BAD022E65B5),
|
||||
UINT64_C(0x2198FC06EB54CFF2), UINT64_C(0x4EC75B055518E141),
|
||||
UINT64_C(0x2FDA2DAE31263A8A), UINT64_C(0x40858AAD8F6A1439),
|
||||
UINT64_C(0x747A6D066610BE7E), UINT64_C(0x1B25CA05D85C90CD),
|
||||
UINT64_C(0x1C84A251B5E5EAF1), UINT64_C(0x73DB05520BA9C442),
|
||||
UINT64_C(0x4724E2F9E2D36E05), UINT64_C(0x287B45FA5C9F40B6),
|
||||
UINT64_C(0x92CC66A2704237FB), UINT64_C(0xFD93C1A1CE0E1948),
|
||||
UINT64_C(0xC96C260A2774B30F), UINT64_C(0xA633810999389DBC),
|
||||
UINT64_C(0xA192E95DF481E780), UINT64_C(0xCECD4E5E4ACDC933),
|
||||
UINT64_C(0xFA32A9F5A3B76374), UINT64_C(0x956D0EF61DFB4DC7),
|
||||
UINT64_C(0xF470785D79C5960C), UINT64_C(0x9B2FDF5EC789B8BF),
|
||||
UINT64_C(0xAFD038F52EF312F8), UINT64_C(0xC08F9FF690BF3C4B),
|
||||
UINT64_C(0xC72EF7A2FD064677), UINT64_C(0xA87150A1434A68C4),
|
||||
UINT64_C(0x9C8EB70AAA30C283), UINT64_C(0xF3D11009147CEC30),
|
||||
UINT64_C(0xDBAA55F348E3AC86), UINT64_C(0xB4F5F2F0F6AF8235),
|
||||
UINT64_C(0x800A155B1FD52872), UINT64_C(0xEF55B258A19906C1),
|
||||
UINT64_C(0xE8F4DA0CCC207CFD), UINT64_C(0x87AB7D0F726C524E),
|
||||
UINT64_C(0xB3549AA49B16F809), UINT64_C(0xDC0B3DA7255AD6BA),
|
||||
UINT64_C(0xBD164B0C41640D71), UINT64_C(0xD249EC0FFF2823C2),
|
||||
UINT64_C(0xE6B60BA416528985), UINT64_C(0x89E9ACA7A81EA736),
|
||||
UINT64_C(0x8E48C4F3C5A7DD0A), UINT64_C(0xE11763F07BEBF3B9),
|
||||
UINT64_C(0xD5E8845B929159FE), UINT64_C(0xBAB723582CDD774D),
|
||||
UINT64_C(0xA187C3EBCA2BB664), UINT64_C(0xCED864E8746798D7),
|
||||
UINT64_C(0xFA2783439D1D3290), UINT64_C(0x9578244023511C23),
|
||||
UINT64_C(0x92D94C144EE8661F), UINT64_C(0xFD86EB17F0A448AC),
|
||||
UINT64_C(0xC9790CBC19DEE2EB), UINT64_C(0xA626ABBFA792CC58),
|
||||
UINT64_C(0xC73BDD14C3AC1793), UINT64_C(0xA8647A177DE03920),
|
||||
UINT64_C(0x9C9B9DBC949A9367), UINT64_C(0xF3C43ABF2AD6BDD4),
|
||||
UINT64_C(0xF46552EB476FC7E8), UINT64_C(0x9B3AF5E8F923E95B),
|
||||
UINT64_C(0xAFC512431059431C), UINT64_C(0xC09AB540AE156DAF),
|
||||
UINT64_C(0xE8E1F0BAF28A2D19), UINT64_C(0x87BE57B94CC603AA),
|
||||
UINT64_C(0xB341B012A5BCA9ED), UINT64_C(0xDC1E17111BF0875E),
|
||||
UINT64_C(0xDBBF7F457649FD62), UINT64_C(0xB4E0D846C805D3D1),
|
||||
UINT64_C(0x801F3FED217F7996), UINT64_C(0xEF4098EE9F335725),
|
||||
UINT64_C(0x8E5DEE45FB0D8CEE), UINT64_C(0xE10249464541A25D),
|
||||
UINT64_C(0xD5FDAEEDAC3B081A), UINT64_C(0xBAA209EE127726A9),
|
||||
UINT64_C(0xBD0361BA7FCE5C95), UINT64_C(0xD25CC6B9C1827226),
|
||||
UINT64_C(0xE6A3211228F8D861), UINT64_C(0x89FC861196B4F6D2),
|
||||
UINT64_C(0x334BA549BA69819F), UINT64_C(0x5C14024A0425AF2C),
|
||||
UINT64_C(0x68EBE5E1ED5F056B), UINT64_C(0x07B442E253132BD8),
|
||||
UINT64_C(0x00152AB63EAA51E4), UINT64_C(0x6F4A8DB580E67F57),
|
||||
UINT64_C(0x5BB56A1E699CD510), UINT64_C(0x34EACD1DD7D0FBA3),
|
||||
UINT64_C(0x55F7BBB6B3EE2068), UINT64_C(0x3AA81CB50DA20EDB),
|
||||
UINT64_C(0x0E57FB1EE4D8A49C), UINT64_C(0x61085C1D5A948A2F),
|
||||
UINT64_C(0x66A93449372DF013), UINT64_C(0x09F6934A8961DEA0),
|
||||
UINT64_C(0x3D0974E1601B74E7), UINT64_C(0x5256D3E2DE575A54),
|
||||
UINT64_C(0x7A2D961882C81AE2), UINT64_C(0x1572311B3C843451),
|
||||
UINT64_C(0x218DD6B0D5FE9E16), UINT64_C(0x4ED271B36BB2B0A5),
|
||||
UINT64_C(0x497319E7060BCA99), UINT64_C(0x262CBEE4B847E42A),
|
||||
UINT64_C(0x12D3594F513D4E6D), UINT64_C(0x7D8CFE4CEF7160DE),
|
||||
UINT64_C(0x1C9188E78B4FBB15), UINT64_C(0x73CE2FE4350395A6),
|
||||
UINT64_C(0x4731C84FDC793FE1), UINT64_C(0x286E6F4C62351152),
|
||||
UINT64_C(0x2FCF07180F8C6B6E), UINT64_C(0x4090A01BB1C045DD),
|
||||
UINT64_C(0x746F47B058BAEF9A), UINT64_C(0x1B30E0B3E6F6C129),
|
||||
UINT64_C(0x420F87D795576CC9), UINT64_C(0x2D5020D42B1B427A),
|
||||
UINT64_C(0x19AFC77FC261E83D), UINT64_C(0x76F0607C7C2DC68E),
|
||||
UINT64_C(0x715108281194BCB2), UINT64_C(0x1E0EAF2BAFD89201),
|
||||
UINT64_C(0x2AF1488046A23846), UINT64_C(0x45AEEF83F8EE16F5),
|
||||
UINT64_C(0x24B399289CD0CD3E), UINT64_C(0x4BEC3E2B229CE38D),
|
||||
UINT64_C(0x7F13D980CBE649CA), UINT64_C(0x104C7E8375AA6779),
|
||||
UINT64_C(0x17ED16D718131D45), UINT64_C(0x78B2B1D4A65F33F6),
|
||||
UINT64_C(0x4C4D567F4F2599B1), UINT64_C(0x2312F17CF169B702),
|
||||
UINT64_C(0x0B69B486ADF6F7B4), UINT64_C(0x6436138513BAD907),
|
||||
UINT64_C(0x50C9F42EFAC07340), UINT64_C(0x3F96532D448C5DF3),
|
||||
UINT64_C(0x38373B79293527CF), UINT64_C(0x57689C7A9779097C),
|
||||
UINT64_C(0x63977BD17E03A33B), UINT64_C(0x0CC8DCD2C04F8D88),
|
||||
UINT64_C(0x6DD5AA79A4715643), UINT64_C(0x028A0D7A1A3D78F0),
|
||||
UINT64_C(0x3675EAD1F347D2B7), UINT64_C(0x592A4DD24D0BFC04),
|
||||
UINT64_C(0x5E8B258620B28638), UINT64_C(0x31D482859EFEA88B),
|
||||
UINT64_C(0x052B652E778402CC), UINT64_C(0x6A74C22DC9C82C7F),
|
||||
UINT64_C(0xD0C3E175E5155B32), UINT64_C(0xBF9C46765B597581),
|
||||
UINT64_C(0x8B63A1DDB223DFC6), UINT64_C(0xE43C06DE0C6FF175),
|
||||
UINT64_C(0xE39D6E8A61D68B49), UINT64_C(0x8CC2C989DF9AA5FA),
|
||||
UINT64_C(0xB83D2E2236E00FBD), UINT64_C(0xD762892188AC210E),
|
||||
UINT64_C(0xB67FFF8AEC92FAC5), UINT64_C(0xD920588952DED476),
|
||||
UINT64_C(0xEDDFBF22BBA47E31), UINT64_C(0x8280182105E85082),
|
||||
UINT64_C(0x8521707568512ABE), UINT64_C(0xEA7ED776D61D040D),
|
||||
UINT64_C(0xDE8130DD3F67AE4A), UINT64_C(0xB1DE97DE812B80F9),
|
||||
UINT64_C(0x99A5D224DDB4C04F), UINT64_C(0xF6FA752763F8EEFC),
|
||||
UINT64_C(0xC205928C8A8244BB), UINT64_C(0xAD5A358F34CE6A08),
|
||||
UINT64_C(0xAAFB5DDB59771034), UINT64_C(0xC5A4FAD8E73B3E87),
|
||||
UINT64_C(0xF15B1D730E4194C0), UINT64_C(0x9E04BA70B00DBA73),
|
||||
UINT64_C(0xFF19CCDBD43361B8), UINT64_C(0x90466BD86A7F4F0B),
|
||||
UINT64_C(0xA4B98C738305E54C), UINT64_C(0xCBE62B703D49CBFF),
|
||||
UINT64_C(0xCC47432450F0B1C3), UINT64_C(0xA318E427EEBC9F70),
|
||||
UINT64_C(0x97E7038C07C63537), UINT64_C(0xF8B8A48FB98A1B84),
|
||||
UINT64_C(0xE388443C5F7CDAAD), UINT64_C(0x8CD7E33FE130F41E),
|
||||
UINT64_C(0xB8280494084A5E59), UINT64_C(0xD777A397B60670EA),
|
||||
UINT64_C(0xD0D6CBC3DBBF0AD6), UINT64_C(0xBF896CC065F32465),
|
||||
UINT64_C(0x8B768B6B8C898E22), UINT64_C(0xE4292C6832C5A091),
|
||||
UINT64_C(0x85345AC356FB7B5A), UINT64_C(0xEA6BFDC0E8B755E9),
|
||||
UINT64_C(0xDE941A6B01CDFFAE), UINT64_C(0xB1CBBD68BF81D11D),
|
||||
UINT64_C(0xB66AD53CD238AB21), UINT64_C(0xD935723F6C748592),
|
||||
UINT64_C(0xEDCA9594850E2FD5), UINT64_C(0x829532973B420166),
|
||||
UINT64_C(0xAAEE776D67DD41D0), UINT64_C(0xC5B1D06ED9916F63),
|
||||
UINT64_C(0xF14E37C530EBC524), UINT64_C(0x9E1190C68EA7EB97),
|
||||
UINT64_C(0x99B0F892E31E91AB), UINT64_C(0xF6EF5F915D52BF18),
|
||||
UINT64_C(0xC210B83AB428155F), UINT64_C(0xAD4F1F390A643BEC),
|
||||
UINT64_C(0xCC5269926E5AE027), UINT64_C(0xA30DCE91D016CE94),
|
||||
UINT64_C(0x97F2293A396C64D3), UINT64_C(0xF8AD8E3987204A60),
|
||||
UINT64_C(0xFF0CE66DEA99305C), UINT64_C(0x9053416E54D51EEF),
|
||||
UINT64_C(0xA4ACA6C5BDAFB4A8), UINT64_C(0xCBF301C603E39A1B),
|
||||
UINT64_C(0x7144229E2F3EED56), UINT64_C(0x1E1B859D9172C3E5),
|
||||
UINT64_C(0x2AE46236780869A2), UINT64_C(0x45BBC535C6444711),
|
||||
UINT64_C(0x421AAD61ABFD3D2D), UINT64_C(0x2D450A6215B1139E),
|
||||
UINT64_C(0x19BAEDC9FCCBB9D9), UINT64_C(0x76E54ACA4287976A),
|
||||
UINT64_C(0x17F83C6126B94CA1), UINT64_C(0x78A79B6298F56212),
|
||||
UINT64_C(0x4C587CC9718FC855), UINT64_C(0x2307DBCACFC3E6E6),
|
||||
UINT64_C(0x24A6B39EA27A9CDA), UINT64_C(0x4BF9149D1C36B269),
|
||||
UINT64_C(0x7F06F336F54C182E), UINT64_C(0x105954354B00369D),
|
||||
UINT64_C(0x382211CF179F762B), UINT64_C(0x577DB6CCA9D35898),
|
||||
UINT64_C(0x6382516740A9F2DF), UINT64_C(0x0CDDF664FEE5DC6C),
|
||||
UINT64_C(0x0B7C9E30935CA650), UINT64_C(0x642339332D1088E3),
|
||||
UINT64_C(0x50DCDE98C46A22A4), UINT64_C(0x3F83799B7A260C17),
|
||||
UINT64_C(0x5E9E0F301E18D7DC), UINT64_C(0x31C1A833A054F96F),
|
||||
UINT64_C(0x053E4F98492E5328), UINT64_C(0x6A61E89BF7627D9B),
|
||||
UINT64_C(0x6DC080CF9ADB07A7), UINT64_C(0x029F27CC24972914),
|
||||
UINT64_C(0x3660C067CDED8353), UINT64_C(0x593F676473A1ADE0)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0x0DF1D05C9279E954),
|
||||
UINT64_C(0x1AE2A1B924F3D2A9), UINT64_C(0x171371E5B68A3BFD),
|
||||
UINT64_C(0xB1DA4DDC62497DC1), UINT64_C(0xBC2B9D80F0309495),
|
||||
UINT64_C(0xAB38EC6546BAAF68), UINT64_C(0xA6C93C39D4C3463C),
|
||||
UINT64_C(0xE7AB9517EE3D2210), UINT64_C(0xEA5A454B7C44CB44),
|
||||
UINT64_C(0xFD4934AECACEF0B9), UINT64_C(0xF0B8E4F258B719ED),
|
||||
UINT64_C(0x5671D8CB8C745FD1), UINT64_C(0x5B8008971E0DB685),
|
||||
UINT64_C(0x4C937972A8878D78), UINT64_C(0x4162A92E3AFE642C),
|
||||
UINT64_C(0xCE572B2FDC7B4420), UINT64_C(0xC3A6FB734E02AD74),
|
||||
UINT64_C(0xD4B58A96F8889689), UINT64_C(0xD9445ACA6AF17FDD),
|
||||
UINT64_C(0x7F8D66F3BE3239E1), UINT64_C(0x727CB6AF2C4BD0B5),
|
||||
UINT64_C(0x656FC74A9AC1EB48), UINT64_C(0x689E171608B8021C),
|
||||
UINT64_C(0x29FCBE3832466630), UINT64_C(0x240D6E64A03F8F64),
|
||||
UINT64_C(0x331E1F8116B5B499), UINT64_C(0x3EEFCFDD84CC5DCD),
|
||||
UINT64_C(0x9826F3E4500F1BF1), UINT64_C(0x95D723B8C276F2A5),
|
||||
UINT64_C(0x82C4525D74FCC958), UINT64_C(0x8F358201E685200C),
|
||||
UINT64_C(0x9CAF565EB8F78840), UINT64_C(0x915E86022A8E6114),
|
||||
UINT64_C(0x864DF7E79C045AE9), UINT64_C(0x8BBC27BB0E7DB3BD),
|
||||
UINT64_C(0x2D751B82DABEF581), UINT64_C(0x2084CBDE48C71CD5),
|
||||
UINT64_C(0x3797BA3BFE4D2728), UINT64_C(0x3A666A676C34CE7C),
|
||||
UINT64_C(0x7B04C34956CAAA50), UINT64_C(0x76F51315C4B34304),
|
||||
UINT64_C(0x61E662F0723978F9), UINT64_C(0x6C17B2ACE04091AD),
|
||||
UINT64_C(0xCADE8E953483D791), UINT64_C(0xC72F5EC9A6FA3EC5),
|
||||
UINT64_C(0xD03C2F2C10700538), UINT64_C(0xDDCDFF708209EC6C),
|
||||
UINT64_C(0x52F87D71648CCC60), UINT64_C(0x5F09AD2DF6F52534),
|
||||
UINT64_C(0x481ADCC8407F1EC9), UINT64_C(0x45EB0C94D206F79D),
|
||||
UINT64_C(0xE32230AD06C5B1A1), UINT64_C(0xEED3E0F194BC58F5),
|
||||
UINT64_C(0xF9C0911422366308), UINT64_C(0xF4314148B04F8A5C),
|
||||
UINT64_C(0xB553E8668AB1EE70), UINT64_C(0xB8A2383A18C80724),
|
||||
UINT64_C(0xAFB149DFAE423CD9), UINT64_C(0xA24099833C3BD58D),
|
||||
UINT64_C(0x0489A5BAE8F893B1), UINT64_C(0x097875E67A817AE5),
|
||||
UINT64_C(0x1E6B0403CC0B4118), UINT64_C(0x139AD45F5E72A84C),
|
||||
UINT64_C(0x385FADBC70EF1181), UINT64_C(0x35AE7DE0E296F8D5),
|
||||
UINT64_C(0x22BD0C05541CC328), UINT64_C(0x2F4CDC59C6652A7C),
|
||||
UINT64_C(0x8985E06012A66C40), UINT64_C(0x8474303C80DF8514),
|
||||
UINT64_C(0x936741D93655BEE9), UINT64_C(0x9E969185A42C57BD),
|
||||
UINT64_C(0xDFF438AB9ED23391), UINT64_C(0xD205E8F70CABDAC5),
|
||||
UINT64_C(0xC5169912BA21E138), UINT64_C(0xC8E7494E2858086C),
|
||||
UINT64_C(0x6E2E7577FC9B4E50), UINT64_C(0x63DFA52B6EE2A704),
|
||||
UINT64_C(0x74CCD4CED8689CF9), UINT64_C(0x793D04924A1175AD),
|
||||
UINT64_C(0xF6088693AC9455A1), UINT64_C(0xFBF956CF3EEDBCF5),
|
||||
UINT64_C(0xECEA272A88678708), UINT64_C(0xE11BF7761A1E6E5C),
|
||||
UINT64_C(0x47D2CB4FCEDD2860), UINT64_C(0x4A231B135CA4C134),
|
||||
UINT64_C(0x5D306AF6EA2EFAC9), UINT64_C(0x50C1BAAA7857139D),
|
||||
UINT64_C(0x11A3138442A977B1), UINT64_C(0x1C52C3D8D0D09EE5),
|
||||
UINT64_C(0x0B41B23D665AA518), UINT64_C(0x06B06261F4234C4C),
|
||||
UINT64_C(0xA0795E5820E00A70), UINT64_C(0xAD888E04B299E324),
|
||||
UINT64_C(0xBA9BFFE10413D8D9), UINT64_C(0xB76A2FBD966A318D),
|
||||
UINT64_C(0xA4F0FBE2C81899C1), UINT64_C(0xA9012BBE5A617095),
|
||||
UINT64_C(0xBE125A5BECEB4B68), UINT64_C(0xB3E38A077E92A23C),
|
||||
UINT64_C(0x152AB63EAA51E400), UINT64_C(0x18DB666238280D54),
|
||||
UINT64_C(0x0FC817878EA236A9), UINT64_C(0x0239C7DB1CDBDFFD),
|
||||
UINT64_C(0x435B6EF52625BBD1), UINT64_C(0x4EAABEA9B45C5285),
|
||||
UINT64_C(0x59B9CF4C02D66978), UINT64_C(0x54481F1090AF802C),
|
||||
UINT64_C(0xF2812329446CC610), UINT64_C(0xFF70F375D6152F44),
|
||||
UINT64_C(0xE8638290609F14B9), UINT64_C(0xE59252CCF2E6FDED),
|
||||
UINT64_C(0x6AA7D0CD1463DDE1), UINT64_C(0x67560091861A34B5),
|
||||
UINT64_C(0x7045717430900F48), UINT64_C(0x7DB4A128A2E9E61C),
|
||||
UINT64_C(0xDB7D9D11762AA020), UINT64_C(0xD68C4D4DE4534974),
|
||||
UINT64_C(0xC19F3CA852D97289), UINT64_C(0xCC6EECF4C0A09BDD),
|
||||
UINT64_C(0x8D0C45DAFA5EFFF1), UINT64_C(0x80FD9586682716A5),
|
||||
UINT64_C(0x97EEE463DEAD2D58), UINT64_C(0x9A1F343F4CD4C40C),
|
||||
UINT64_C(0x3CD6080698178230), UINT64_C(0x3127D85A0A6E6B64),
|
||||
UINT64_C(0x2634A9BFBCE45099), UINT64_C(0x2BC579E32E9DB9CD),
|
||||
UINT64_C(0xF5A054D6CA71FB90), UINT64_C(0xF851848A580812C4),
|
||||
UINT64_C(0xEF42F56FEE822939), UINT64_C(0xE2B325337CFBC06D),
|
||||
UINT64_C(0x447A190AA8388651), UINT64_C(0x498BC9563A416F05),
|
||||
UINT64_C(0x5E98B8B38CCB54F8), UINT64_C(0x536968EF1EB2BDAC),
|
||||
UINT64_C(0x120BC1C1244CD980), UINT64_C(0x1FFA119DB63530D4),
|
||||
UINT64_C(0x08E9607800BF0B29), UINT64_C(0x0518B02492C6E27D),
|
||||
UINT64_C(0xA3D18C1D4605A441), UINT64_C(0xAE205C41D47C4D15),
|
||||
UINT64_C(0xB9332DA462F676E8), UINT64_C(0xB4C2FDF8F08F9FBC),
|
||||
UINT64_C(0x3BF77FF9160ABFB0), UINT64_C(0x3606AFA5847356E4),
|
||||
UINT64_C(0x2115DE4032F96D19), UINT64_C(0x2CE40E1CA080844D),
|
||||
UINT64_C(0x8A2D32257443C271), UINT64_C(0x87DCE279E63A2B25),
|
||||
UINT64_C(0x90CF939C50B010D8), UINT64_C(0x9D3E43C0C2C9F98C),
|
||||
UINT64_C(0xDC5CEAEEF8379DA0), UINT64_C(0xD1AD3AB26A4E74F4),
|
||||
UINT64_C(0xC6BE4B57DCC44F09), UINT64_C(0xCB4F9B0B4EBDA65D),
|
||||
UINT64_C(0x6D86A7329A7EE061), UINT64_C(0x6077776E08070935),
|
||||
UINT64_C(0x7764068BBE8D32C8), UINT64_C(0x7A95D6D72CF4DB9C),
|
||||
UINT64_C(0x690F0288728673D0), UINT64_C(0x64FED2D4E0FF9A84),
|
||||
UINT64_C(0x73EDA3315675A179), UINT64_C(0x7E1C736DC40C482D),
|
||||
UINT64_C(0xD8D54F5410CF0E11), UINT64_C(0xD5249F0882B6E745),
|
||||
UINT64_C(0xC237EEED343CDCB8), UINT64_C(0xCFC63EB1A64535EC),
|
||||
UINT64_C(0x8EA4979F9CBB51C0), UINT64_C(0x835547C30EC2B894),
|
||||
UINT64_C(0x94463626B8488369), UINT64_C(0x99B7E67A2A316A3D),
|
||||
UINT64_C(0x3F7EDA43FEF22C01), UINT64_C(0x328F0A1F6C8BC555),
|
||||
UINT64_C(0x259C7BFADA01FEA8), UINT64_C(0x286DABA6487817FC),
|
||||
UINT64_C(0xA75829A7AEFD37F0), UINT64_C(0xAAA9F9FB3C84DEA4),
|
||||
UINT64_C(0xBDBA881E8A0EE559), UINT64_C(0xB04B584218770C0D),
|
||||
UINT64_C(0x1682647BCCB44A31), UINT64_C(0x1B73B4275ECDA365),
|
||||
UINT64_C(0x0C60C5C2E8479898), UINT64_C(0x0191159E7A3E71CC),
|
||||
UINT64_C(0x40F3BCB040C015E0), UINT64_C(0x4D026CECD2B9FCB4),
|
||||
UINT64_C(0x5A111D096433C749), UINT64_C(0x57E0CD55F64A2E1D),
|
||||
UINT64_C(0xF129F16C22896821), UINT64_C(0xFCD82130B0F08175),
|
||||
UINT64_C(0xEBCB50D5067ABA88), UINT64_C(0xE63A8089940353DC),
|
||||
UINT64_C(0xCDFFF96ABA9EEA11), UINT64_C(0xC00E293628E70345),
|
||||
UINT64_C(0xD71D58D39E6D38B8), UINT64_C(0xDAEC888F0C14D1EC),
|
||||
UINT64_C(0x7C25B4B6D8D797D0), UINT64_C(0x71D464EA4AAE7E84),
|
||||
UINT64_C(0x66C7150FFC244579), UINT64_C(0x6B36C5536E5DAC2D),
|
||||
UINT64_C(0x2A546C7D54A3C801), UINT64_C(0x27A5BC21C6DA2155),
|
||||
UINT64_C(0x30B6CDC470501AA8), UINT64_C(0x3D471D98E229F3FC),
|
||||
UINT64_C(0x9B8E21A136EAB5C0), UINT64_C(0x967FF1FDA4935C94),
|
||||
UINT64_C(0x816C801812196769), UINT64_C(0x8C9D504480608E3D),
|
||||
UINT64_C(0x03A8D24566E5AE31), UINT64_C(0x0E590219F49C4765),
|
||||
UINT64_C(0x194A73FC42167C98), UINT64_C(0x14BBA3A0D06F95CC),
|
||||
UINT64_C(0xB2729F9904ACD3F0), UINT64_C(0xBF834FC596D53AA4),
|
||||
UINT64_C(0xA8903E20205F0159), UINT64_C(0xA561EE7CB226E80D),
|
||||
UINT64_C(0xE403475288D88C21), UINT64_C(0xE9F2970E1AA16575),
|
||||
UINT64_C(0xFEE1E6EBAC2B5E88), UINT64_C(0xF31036B73E52B7DC),
|
||||
UINT64_C(0x55D90A8EEA91F1E0), UINT64_C(0x5828DAD278E818B4),
|
||||
UINT64_C(0x4F3BAB37CE622349), UINT64_C(0x42CA7B6B5C1BCA1D),
|
||||
UINT64_C(0x5150AF3402696251), UINT64_C(0x5CA17F6890108B05),
|
||||
UINT64_C(0x4BB20E8D269AB0F8), UINT64_C(0x4643DED1B4E359AC),
|
||||
UINT64_C(0xE08AE2E860201F90), UINT64_C(0xED7B32B4F259F6C4),
|
||||
UINT64_C(0xFA68435144D3CD39), UINT64_C(0xF799930DD6AA246D),
|
||||
UINT64_C(0xB6FB3A23EC544041), UINT64_C(0xBB0AEA7F7E2DA915),
|
||||
UINT64_C(0xAC199B9AC8A792E8), UINT64_C(0xA1E84BC65ADE7BBC),
|
||||
UINT64_C(0x072177FF8E1D3D80), UINT64_C(0x0AD0A7A31C64D4D4),
|
||||
UINT64_C(0x1DC3D646AAEEEF29), UINT64_C(0x1032061A3897067D),
|
||||
UINT64_C(0x9F07841BDE122671), UINT64_C(0x92F654474C6BCF25),
|
||||
UINT64_C(0x85E525A2FAE1F4D8), UINT64_C(0x8814F5FE68981D8C),
|
||||
UINT64_C(0x2EDDC9C7BC5B5BB0), UINT64_C(0x232C199B2E22B2E4),
|
||||
UINT64_C(0x343F687E98A88919), UINT64_C(0x39CEB8220AD1604D),
|
||||
UINT64_C(0x78AC110C302F0461), UINT64_C(0x755DC150A256ED35),
|
||||
UINT64_C(0x624EB0B514DCD6C8), UINT64_C(0x6FBF60E986A53F9C),
|
||||
UINT64_C(0xC9765CD0526679A0), UINT64_C(0xC4878C8CC01F90F4),
|
||||
UINT64_C(0xD394FD697695AB09), UINT64_C(0xDE652D35E4EC425D)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0xCB6D6A914AE10B3F),
|
||||
UINT64_C(0x96DBD42295C2177E), UINT64_C(0x5DB6BEB3DF231C41),
|
||||
UINT64_C(0x2CB7A9452A852FFC), UINT64_C(0xE7DAC3D4606424C3),
|
||||
UINT64_C(0xBA6C7D67BF473882), UINT64_C(0x710117F6F5A633BD),
|
||||
UINT64_C(0xDD705D247FA5876A), UINT64_C(0x161D37B535448C55),
|
||||
UINT64_C(0x4BAB8906EA679014), UINT64_C(0x80C6E397A0869B2B),
|
||||
UINT64_C(0xF1C7F4615520A896), UINT64_C(0x3AAA9EF01FC1A3A9),
|
||||
UINT64_C(0x671C2043C0E2BFE8), UINT64_C(0xAC714AD28A03B4D7),
|
||||
UINT64_C(0xBAE1BA48FE4A0FD5), UINT64_C(0x718CD0D9B4AB04EA),
|
||||
UINT64_C(0x2C3A6E6A6B8818AB), UINT64_C(0xE75704FB21691394),
|
||||
UINT64_C(0x9656130DD4CF2029), UINT64_C(0x5D3B799C9E2E2B16),
|
||||
UINT64_C(0x008DC72F410D3757), UINT64_C(0xCBE0ADBE0BEC3C68),
|
||||
UINT64_C(0x6791E76C81EF88BF), UINT64_C(0xACFC8DFDCB0E8380),
|
||||
UINT64_C(0xF14A334E142D9FC1), UINT64_C(0x3A2759DF5ECC94FE),
|
||||
UINT64_C(0x4B264E29AB6AA743), UINT64_C(0x804B24B8E18BAC7C),
|
||||
UINT64_C(0xDDFD9A0B3EA8B03D), UINT64_C(0x1690F09A7449BB02),
|
||||
UINT64_C(0xF1DD7B3ED73AC638), UINT64_C(0x3AB011AF9DDBCD07),
|
||||
UINT64_C(0x6706AF1C42F8D146), UINT64_C(0xAC6BC58D0819DA79),
|
||||
UINT64_C(0xDD6AD27BFDBFE9C4), UINT64_C(0x1607B8EAB75EE2FB),
|
||||
UINT64_C(0x4BB10659687DFEBA), UINT64_C(0x80DC6CC8229CF585),
|
||||
UINT64_C(0x2CAD261AA89F4152), UINT64_C(0xE7C04C8BE27E4A6D),
|
||||
UINT64_C(0xBA76F2383D5D562C), UINT64_C(0x711B98A977BC5D13),
|
||||
UINT64_C(0x001A8F5F821A6EAE), UINT64_C(0xCB77E5CEC8FB6591),
|
||||
UINT64_C(0x96C15B7D17D879D0), UINT64_C(0x5DAC31EC5D3972EF),
|
||||
UINT64_C(0x4B3CC1762970C9ED), UINT64_C(0x8051ABE76391C2D2),
|
||||
UINT64_C(0xDDE71554BCB2DE93), UINT64_C(0x168A7FC5F653D5AC),
|
||||
UINT64_C(0x678B683303F5E611), UINT64_C(0xACE602A24914ED2E),
|
||||
UINT64_C(0xF150BC119637F16F), UINT64_C(0x3A3DD680DCD6FA50),
|
||||
UINT64_C(0x964C9C5256D54E87), UINT64_C(0x5D21F6C31C3445B8),
|
||||
UINT64_C(0x00974870C31759F9), UINT64_C(0xCBFA22E189F652C6),
|
||||
UINT64_C(0xBAFB35177C50617B), UINT64_C(0x71965F8636B16A44),
|
||||
UINT64_C(0x2C20E135E9927605), UINT64_C(0xE74D8BA4A3737D3A),
|
||||
UINT64_C(0xE2BBF77CAE758C71), UINT64_C(0x29D69DEDE494874E),
|
||||
UINT64_C(0x7460235E3BB79B0F), UINT64_C(0xBF0D49CF71569030),
|
||||
UINT64_C(0xCE0C5E3984F0A38D), UINT64_C(0x056134A8CE11A8B2),
|
||||
UINT64_C(0x58D78A1B1132B4F3), UINT64_C(0x93BAE08A5BD3BFCC),
|
||||
UINT64_C(0x3FCBAA58D1D00B1B), UINT64_C(0xF4A6C0C99B310024),
|
||||
UINT64_C(0xA9107E7A44121C65), UINT64_C(0x627D14EB0EF3175A),
|
||||
UINT64_C(0x137C031DFB5524E7), UINT64_C(0xD811698CB1B42FD8),
|
||||
UINT64_C(0x85A7D73F6E973399), UINT64_C(0x4ECABDAE247638A6),
|
||||
UINT64_C(0x585A4D34503F83A4), UINT64_C(0x933727A51ADE889B),
|
||||
UINT64_C(0xCE819916C5FD94DA), UINT64_C(0x05ECF3878F1C9FE5),
|
||||
UINT64_C(0x74EDE4717ABAAC58), UINT64_C(0xBF808EE0305BA767),
|
||||
UINT64_C(0xE2363053EF78BB26), UINT64_C(0x295B5AC2A599B019),
|
||||
UINT64_C(0x852A10102F9A04CE), UINT64_C(0x4E477A81657B0FF1),
|
||||
UINT64_C(0x13F1C432BA5813B0), UINT64_C(0xD89CAEA3F0B9188F),
|
||||
UINT64_C(0xA99DB955051F2B32), UINT64_C(0x62F0D3C44FFE200D),
|
||||
UINT64_C(0x3F466D7790DD3C4C), UINT64_C(0xF42B07E6DA3C3773),
|
||||
UINT64_C(0x13668C42794F4A49), UINT64_C(0xD80BE6D333AE4176),
|
||||
UINT64_C(0x85BD5860EC8D5D37), UINT64_C(0x4ED032F1A66C5608),
|
||||
UINT64_C(0x3FD1250753CA65B5), UINT64_C(0xF4BC4F96192B6E8A),
|
||||
UINT64_C(0xA90AF125C60872CB), UINT64_C(0x62679BB48CE979F4),
|
||||
UINT64_C(0xCE16D16606EACD23), UINT64_C(0x057BBBF74C0BC61C),
|
||||
UINT64_C(0x58CD05449328DA5D), UINT64_C(0x93A06FD5D9C9D162),
|
||||
UINT64_C(0xE2A178232C6FE2DF), UINT64_C(0x29CC12B2668EE9E0),
|
||||
UINT64_C(0x747AAC01B9ADF5A1), UINT64_C(0xBF17C690F34CFE9E),
|
||||
UINT64_C(0xA987360A8705459C), UINT64_C(0x62EA5C9BCDE44EA3),
|
||||
UINT64_C(0x3F5CE22812C752E2), UINT64_C(0xF43188B9582659DD),
|
||||
UINT64_C(0x85309F4FAD806A60), UINT64_C(0x4E5DF5DEE761615F),
|
||||
UINT64_C(0x13EB4B6D38427D1E), UINT64_C(0xD88621FC72A37621),
|
||||
UINT64_C(0x74F76B2EF8A0C2F6), UINT64_C(0xBF9A01BFB241C9C9),
|
||||
UINT64_C(0xE22CBF0C6D62D588), UINT64_C(0x2941D59D2783DEB7),
|
||||
UINT64_C(0x5840C26BD225ED0A), UINT64_C(0x932DA8FA98C4E635),
|
||||
UINT64_C(0xCE9B164947E7FA74), UINT64_C(0x05F67CD80D06F14B),
|
||||
UINT64_C(0xC477EFF95CEB18E3), UINT64_C(0x0F1A8568160A13DC),
|
||||
UINT64_C(0x52AC3BDBC9290F9D), UINT64_C(0x99C1514A83C804A2),
|
||||
UINT64_C(0xE8C046BC766E371F), UINT64_C(0x23AD2C2D3C8F3C20),
|
||||
UINT64_C(0x7E1B929EE3AC2061), UINT64_C(0xB576F80FA94D2B5E),
|
||||
UINT64_C(0x1907B2DD234E9F89), UINT64_C(0xD26AD84C69AF94B6),
|
||||
UINT64_C(0x8FDC66FFB68C88F7), UINT64_C(0x44B10C6EFC6D83C8),
|
||||
UINT64_C(0x35B01B9809CBB075), UINT64_C(0xFEDD7109432ABB4A),
|
||||
UINT64_C(0xA36BCFBA9C09A70B), UINT64_C(0x6806A52BD6E8AC34),
|
||||
UINT64_C(0x7E9655B1A2A11736), UINT64_C(0xB5FB3F20E8401C09),
|
||||
UINT64_C(0xE84D819337630048), UINT64_C(0x2320EB027D820B77),
|
||||
UINT64_C(0x5221FCF4882438CA), UINT64_C(0x994C9665C2C533F5),
|
||||
UINT64_C(0xC4FA28D61DE62FB4), UINT64_C(0x0F9742475707248B),
|
||||
UINT64_C(0xA3E60895DD04905C), UINT64_C(0x688B620497E59B63),
|
||||
UINT64_C(0x353DDCB748C68722), UINT64_C(0xFE50B62602278C1D),
|
||||
UINT64_C(0x8F51A1D0F781BFA0), UINT64_C(0x443CCB41BD60B49F),
|
||||
UINT64_C(0x198A75F26243A8DE), UINT64_C(0xD2E71F6328A2A3E1),
|
||||
UINT64_C(0x35AA94C78BD1DEDB), UINT64_C(0xFEC7FE56C130D5E4),
|
||||
UINT64_C(0xA37140E51E13C9A5), UINT64_C(0x681C2A7454F2C29A),
|
||||
UINT64_C(0x191D3D82A154F127), UINT64_C(0xD2705713EBB5FA18),
|
||||
UINT64_C(0x8FC6E9A03496E659), UINT64_C(0x44AB83317E77ED66),
|
||||
UINT64_C(0xE8DAC9E3F47459B1), UINT64_C(0x23B7A372BE95528E),
|
||||
UINT64_C(0x7E011DC161B64ECF), UINT64_C(0xB56C77502B5745F0),
|
||||
UINT64_C(0xC46D60A6DEF1764D), UINT64_C(0x0F000A3794107D72),
|
||||
UINT64_C(0x52B6B4844B336133), UINT64_C(0x99DBDE1501D26A0C),
|
||||
UINT64_C(0x8F4B2E8F759BD10E), UINT64_C(0x4426441E3F7ADA31),
|
||||
UINT64_C(0x1990FAADE059C670), UINT64_C(0xD2FD903CAAB8CD4F),
|
||||
UINT64_C(0xA3FC87CA5F1EFEF2), UINT64_C(0x6891ED5B15FFF5CD),
|
||||
UINT64_C(0x352753E8CADCE98C), UINT64_C(0xFE4A3979803DE2B3),
|
||||
UINT64_C(0x523B73AB0A3E5664), UINT64_C(0x9956193A40DF5D5B),
|
||||
UINT64_C(0xC4E0A7899FFC411A), UINT64_C(0x0F8DCD18D51D4A25),
|
||||
UINT64_C(0x7E8CDAEE20BB7998), UINT64_C(0xB5E1B07F6A5A72A7),
|
||||
UINT64_C(0xE8570ECCB5796EE6), UINT64_C(0x233A645DFF9865D9),
|
||||
UINT64_C(0x26CC1885F29E9492), UINT64_C(0xEDA17214B87F9FAD),
|
||||
UINT64_C(0xB017CCA7675C83EC), UINT64_C(0x7B7AA6362DBD88D3),
|
||||
UINT64_C(0x0A7BB1C0D81BBB6E), UINT64_C(0xC116DB5192FAB051),
|
||||
UINT64_C(0x9CA065E24DD9AC10), UINT64_C(0x57CD0F730738A72F),
|
||||
UINT64_C(0xFBBC45A18D3B13F8), UINT64_C(0x30D12F30C7DA18C7),
|
||||
UINT64_C(0x6D67918318F90486), UINT64_C(0xA60AFB1252180FB9),
|
||||
UINT64_C(0xD70BECE4A7BE3C04), UINT64_C(0x1C668675ED5F373B),
|
||||
UINT64_C(0x41D038C6327C2B7A), UINT64_C(0x8ABD5257789D2045),
|
||||
UINT64_C(0x9C2DA2CD0CD49B47), UINT64_C(0x5740C85C46359078),
|
||||
UINT64_C(0x0AF676EF99168C39), UINT64_C(0xC19B1C7ED3F78706),
|
||||
UINT64_C(0xB09A0B882651B4BB), UINT64_C(0x7BF761196CB0BF84),
|
||||
UINT64_C(0x2641DFAAB393A3C5), UINT64_C(0xED2CB53BF972A8FA),
|
||||
UINT64_C(0x415DFFE973711C2D), UINT64_C(0x8A30957839901712),
|
||||
UINT64_C(0xD7862BCBE6B30B53), UINT64_C(0x1CEB415AAC52006C),
|
||||
UINT64_C(0x6DEA56AC59F433D1), UINT64_C(0xA6873C3D131538EE),
|
||||
UINT64_C(0xFB31828ECC3624AF), UINT64_C(0x305CE81F86D72F90),
|
||||
UINT64_C(0xD71163BB25A452AA), UINT64_C(0x1C7C092A6F455995),
|
||||
UINT64_C(0x41CAB799B06645D4), UINT64_C(0x8AA7DD08FA874EEB),
|
||||
UINT64_C(0xFBA6CAFE0F217D56), UINT64_C(0x30CBA06F45C07669),
|
||||
UINT64_C(0x6D7D1EDC9AE36A28), UINT64_C(0xA610744DD0026117),
|
||||
UINT64_C(0x0A613E9F5A01D5C0), UINT64_C(0xC10C540E10E0DEFF),
|
||||
UINT64_C(0x9CBAEABDCFC3C2BE), UINT64_C(0x57D7802C8522C981),
|
||||
UINT64_C(0x26D697DA7084FA3C), UINT64_C(0xEDBBFD4B3A65F103),
|
||||
UINT64_C(0xB00D43F8E546ED42), UINT64_C(0x7B602969AFA7E67D),
|
||||
UINT64_C(0x6DF0D9F3DBEE5D7F), UINT64_C(0xA69DB362910F5640),
|
||||
UINT64_C(0xFB2B0DD14E2C4A01), UINT64_C(0x3046674004CD413E),
|
||||
UINT64_C(0x414770B6F16B7283), UINT64_C(0x8A2A1A27BB8A79BC),
|
||||
UINT64_C(0xD79CA49464A965FD), UINT64_C(0x1CF1CE052E486EC2),
|
||||
UINT64_C(0xB08084D7A44BDA15), UINT64_C(0x7BEDEE46EEAAD12A),
|
||||
UINT64_C(0x265B50F53189CD6B), UINT64_C(0xED363A647B68C654),
|
||||
UINT64_C(0x9C372D928ECEF5E9), UINT64_C(0x575A4703C42FFED6),
|
||||
UINT64_C(0x0AECF9B01B0CE297), UINT64_C(0xC181932151EDE9A8)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0xDCA12C225E8AEE1D),
|
||||
UINT64_C(0xB8435944BC14DD3B), UINT64_C(0x64E27566E29E3326),
|
||||
UINT64_C(0x7087B2887829BA77), UINT64_C(0xAC269EAA26A3546A),
|
||||
UINT64_C(0xC8C4EBCCC43D674C), UINT64_C(0x1465C7EE9AB78951),
|
||||
UINT64_C(0xE00E6511F15274EF), UINT64_C(0x3CAF4933AFD89AF2),
|
||||
UINT64_C(0x584D3C554D46A9D4), UINT64_C(0x84EC107713CC47C9),
|
||||
UINT64_C(0x9089D799897BCE98), UINT64_C(0x4C28FBBBD7F12085),
|
||||
UINT64_C(0x28CA8EDD356F13A3), UINT64_C(0xF46BA2FF6BE5FDBE),
|
||||
UINT64_C(0x4503C48DC90A304C), UINT64_C(0x99A2E8AF9780DE51),
|
||||
UINT64_C(0xFD409DC9751EED77), UINT64_C(0x21E1B1EB2B94036A),
|
||||
UINT64_C(0x35847605B1238A3B), UINT64_C(0xE9255A27EFA96426),
|
||||
UINT64_C(0x8DC72F410D375700), UINT64_C(0x5166036353BDB91D),
|
||||
UINT64_C(0xA50DA19C385844A3), UINT64_C(0x79AC8DBE66D2AABE),
|
||||
UINT64_C(0x1D4EF8D8844C9998), UINT64_C(0xC1EFD4FADAC67785),
|
||||
UINT64_C(0xD58A13144071FED4), UINT64_C(0x092B3F361EFB10C9),
|
||||
UINT64_C(0x6DC94A50FC6523EF), UINT64_C(0xB1686672A2EFCDF2),
|
||||
UINT64_C(0x8A06881B93156098), UINT64_C(0x56A7A439CD9F8E85),
|
||||
UINT64_C(0x3245D15F2F01BDA3), UINT64_C(0xEEE4FD7D718B53BE),
|
||||
UINT64_C(0xFA813A93EB3CDAEF), UINT64_C(0x262016B1B5B634F2),
|
||||
UINT64_C(0x42C263D7572807D4), UINT64_C(0x9E634FF509A2E9C9),
|
||||
UINT64_C(0x6A08ED0A62471477), UINT64_C(0xB6A9C1283CCDFA6A),
|
||||
UINT64_C(0xD24BB44EDE53C94C), UINT64_C(0x0EEA986C80D92751),
|
||||
UINT64_C(0x1A8F5F821A6EAE00), UINT64_C(0xC62E73A044E4401D),
|
||||
UINT64_C(0xA2CC06C6A67A733B), UINT64_C(0x7E6D2AE4F8F09D26),
|
||||
UINT64_C(0xCF054C965A1F50D4), UINT64_C(0x13A460B40495BEC9),
|
||||
UINT64_C(0x774615D2E60B8DEF), UINT64_C(0xABE739F0B88163F2),
|
||||
UINT64_C(0xBF82FE1E2236EAA3), UINT64_C(0x6323D23C7CBC04BE),
|
||||
UINT64_C(0x07C1A75A9E223798), UINT64_C(0xDB608B78C0A8D985),
|
||||
UINT64_C(0x2F0B2987AB4D243B), UINT64_C(0xF3AA05A5F5C7CA26),
|
||||
UINT64_C(0x974870C31759F900), UINT64_C(0x4BE95CE149D3171D),
|
||||
UINT64_C(0x5F8C9B0FD3649E4C), UINT64_C(0x832DB72D8DEE7051),
|
||||
UINT64_C(0xE7CFC24B6F704377), UINT64_C(0x3B6EEE6931FAAD6A),
|
||||
UINT64_C(0x91131E980D8418A2), UINT64_C(0x4DB232BA530EF6BF),
|
||||
UINT64_C(0x295047DCB190C599), UINT64_C(0xF5F16BFEEF1A2B84),
|
||||
UINT64_C(0xE194AC1075ADA2D5), UINT64_C(0x3D3580322B274CC8),
|
||||
UINT64_C(0x59D7F554C9B97FEE), UINT64_C(0x8576D976973391F3),
|
||||
UINT64_C(0x711D7B89FCD66C4D), UINT64_C(0xADBC57ABA25C8250),
|
||||
UINT64_C(0xC95E22CD40C2B176), UINT64_C(0x15FF0EEF1E485F6B),
|
||||
UINT64_C(0x019AC90184FFD63A), UINT64_C(0xDD3BE523DA753827),
|
||||
UINT64_C(0xB9D9904538EB0B01), UINT64_C(0x6578BC676661E51C),
|
||||
UINT64_C(0xD410DA15C48E28EE), UINT64_C(0x08B1F6379A04C6F3),
|
||||
UINT64_C(0x6C538351789AF5D5), UINT64_C(0xB0F2AF7326101BC8),
|
||||
UINT64_C(0xA497689DBCA79299), UINT64_C(0x783644BFE22D7C84),
|
||||
UINT64_C(0x1CD431D900B34FA2), UINT64_C(0xC0751DFB5E39A1BF),
|
||||
UINT64_C(0x341EBF0435DC5C01), UINT64_C(0xE8BF93266B56B21C),
|
||||
UINT64_C(0x8C5DE64089C8813A), UINT64_C(0x50FCCA62D7426F27),
|
||||
UINT64_C(0x44990D8C4DF5E676), UINT64_C(0x983821AE137F086B),
|
||||
UINT64_C(0xFCDA54C8F1E13B4D), UINT64_C(0x207B78EAAF6BD550),
|
||||
UINT64_C(0x1B1596839E91783A), UINT64_C(0xC7B4BAA1C01B9627),
|
||||
UINT64_C(0xA356CFC72285A501), UINT64_C(0x7FF7E3E57C0F4B1C),
|
||||
UINT64_C(0x6B92240BE6B8C24D), UINT64_C(0xB7330829B8322C50),
|
||||
UINT64_C(0xD3D17D4F5AAC1F76), UINT64_C(0x0F70516D0426F16B),
|
||||
UINT64_C(0xFB1BF3926FC30CD5), UINT64_C(0x27BADFB03149E2C8),
|
||||
UINT64_C(0x4358AAD6D3D7D1EE), UINT64_C(0x9FF986F48D5D3FF3),
|
||||
UINT64_C(0x8B9C411A17EAB6A2), UINT64_C(0x573D6D38496058BF),
|
||||
UINT64_C(0x33DF185EABFE6B99), UINT64_C(0xEF7E347CF5748584),
|
||||
UINT64_C(0x5E16520E579B4876), UINT64_C(0x82B77E2C0911A66B),
|
||||
UINT64_C(0xE6550B4AEB8F954D), UINT64_C(0x3AF42768B5057B50),
|
||||
UINT64_C(0x2E91E0862FB2F201), UINT64_C(0xF230CCA471381C1C),
|
||||
UINT64_C(0x96D2B9C293A62F3A), UINT64_C(0x4A7395E0CD2CC127),
|
||||
UINT64_C(0xBE18371FA6C93C99), UINT64_C(0x62B91B3DF843D284),
|
||||
UINT64_C(0x065B6E5B1ADDE1A2), UINT64_C(0xDAFA427944570FBF),
|
||||
UINT64_C(0xCE9F8597DEE086EE), UINT64_C(0x123EA9B5806A68F3),
|
||||
UINT64_C(0x76DCDCD362F45BD5), UINT64_C(0xAA7DF0F13C7EB5C8),
|
||||
UINT64_C(0xA739329F30A7E9D6), UINT64_C(0x7B981EBD6E2D07CB),
|
||||
UINT64_C(0x1F7A6BDB8CB334ED), UINT64_C(0xC3DB47F9D239DAF0),
|
||||
UINT64_C(0xD7BE8017488E53A1), UINT64_C(0x0B1FAC351604BDBC),
|
||||
UINT64_C(0x6FFDD953F49A8E9A), UINT64_C(0xB35CF571AA106087),
|
||||
UINT64_C(0x4737578EC1F59D39), UINT64_C(0x9B967BAC9F7F7324),
|
||||
UINT64_C(0xFF740ECA7DE14002), UINT64_C(0x23D522E8236BAE1F),
|
||||
UINT64_C(0x37B0E506B9DC274E), UINT64_C(0xEB11C924E756C953),
|
||||
UINT64_C(0x8FF3BC4205C8FA75), UINT64_C(0x535290605B421468),
|
||||
UINT64_C(0xE23AF612F9ADD99A), UINT64_C(0x3E9BDA30A7273787),
|
||||
UINT64_C(0x5A79AF5645B904A1), UINT64_C(0x86D883741B33EABC),
|
||||
UINT64_C(0x92BD449A818463ED), UINT64_C(0x4E1C68B8DF0E8DF0),
|
||||
UINT64_C(0x2AFE1DDE3D90BED6), UINT64_C(0xF65F31FC631A50CB),
|
||||
UINT64_C(0x0234930308FFAD75), UINT64_C(0xDE95BF2156754368),
|
||||
UINT64_C(0xBA77CA47B4EB704E), UINT64_C(0x66D6E665EA619E53),
|
||||
UINT64_C(0x72B3218B70D61702), UINT64_C(0xAE120DA92E5CF91F),
|
||||
UINT64_C(0xCAF078CFCCC2CA39), UINT64_C(0x165154ED92482424),
|
||||
UINT64_C(0x2D3FBA84A3B2894E), UINT64_C(0xF19E96A6FD386753),
|
||||
UINT64_C(0x957CE3C01FA65475), UINT64_C(0x49DDCFE2412CBA68),
|
||||
UINT64_C(0x5DB8080CDB9B3339), UINT64_C(0x8119242E8511DD24),
|
||||
UINT64_C(0xE5FB5148678FEE02), UINT64_C(0x395A7D6A3905001F),
|
||||
UINT64_C(0xCD31DF9552E0FDA1), UINT64_C(0x1190F3B70C6A13BC),
|
||||
UINT64_C(0x757286D1EEF4209A), UINT64_C(0xA9D3AAF3B07ECE87),
|
||||
UINT64_C(0xBDB66D1D2AC947D6), UINT64_C(0x6117413F7443A9CB),
|
||||
UINT64_C(0x05F5345996DD9AED), UINT64_C(0xD954187BC85774F0),
|
||||
UINT64_C(0x683C7E096AB8B902), UINT64_C(0xB49D522B3432571F),
|
||||
UINT64_C(0xD07F274DD6AC6439), UINT64_C(0x0CDE0B6F88268A24),
|
||||
UINT64_C(0x18BBCC8112910375), UINT64_C(0xC41AE0A34C1BED68),
|
||||
UINT64_C(0xA0F895C5AE85DE4E), UINT64_C(0x7C59B9E7F00F3053),
|
||||
UINT64_C(0x88321B189BEACDED), UINT64_C(0x5493373AC56023F0),
|
||||
UINT64_C(0x3071425C27FE10D6), UINT64_C(0xECD06E7E7974FECB),
|
||||
UINT64_C(0xF8B5A990E3C3779A), UINT64_C(0x241485B2BD499987),
|
||||
UINT64_C(0x40F6F0D45FD7AAA1), UINT64_C(0x9C57DCF6015D44BC),
|
||||
UINT64_C(0x362A2C073D23F174), UINT64_C(0xEA8B002563A91F69),
|
||||
UINT64_C(0x8E69754381372C4F), UINT64_C(0x52C85961DFBDC252),
|
||||
UINT64_C(0x46AD9E8F450A4B03), UINT64_C(0x9A0CB2AD1B80A51E),
|
||||
UINT64_C(0xFEEEC7CBF91E9638), UINT64_C(0x224FEBE9A7947825),
|
||||
UINT64_C(0xD6244916CC71859B), UINT64_C(0x0A85653492FB6B86),
|
||||
UINT64_C(0x6E671052706558A0), UINT64_C(0xB2C63C702EEFB6BD),
|
||||
UINT64_C(0xA6A3FB9EB4583FEC), UINT64_C(0x7A02D7BCEAD2D1F1),
|
||||
UINT64_C(0x1EE0A2DA084CE2D7), UINT64_C(0xC2418EF856C60CCA),
|
||||
UINT64_C(0x7329E88AF429C138), UINT64_C(0xAF88C4A8AAA32F25),
|
||||
UINT64_C(0xCB6AB1CE483D1C03), UINT64_C(0x17CB9DEC16B7F21E),
|
||||
UINT64_C(0x03AE5A028C007B4F), UINT64_C(0xDF0F7620D28A9552),
|
||||
UINT64_C(0xBBED03463014A674), UINT64_C(0x674C2F646E9E4869),
|
||||
UINT64_C(0x93278D9B057BB5D7), UINT64_C(0x4F86A1B95BF15BCA),
|
||||
UINT64_C(0x2B64D4DFB96F68EC), UINT64_C(0xF7C5F8FDE7E586F1),
|
||||
UINT64_C(0xE3A03F137D520FA0), UINT64_C(0x3F01133123D8E1BD),
|
||||
UINT64_C(0x5BE36657C146D29B), UINT64_C(0x87424A759FCC3C86),
|
||||
UINT64_C(0xBC2CA41CAE3691EC), UINT64_C(0x608D883EF0BC7FF1),
|
||||
UINT64_C(0x046FFD5812224CD7), UINT64_C(0xD8CED17A4CA8A2CA),
|
||||
UINT64_C(0xCCAB1694D61F2B9B), UINT64_C(0x100A3AB68895C586),
|
||||
UINT64_C(0x74E84FD06A0BF6A0), UINT64_C(0xA84963F2348118BD),
|
||||
UINT64_C(0x5C22C10D5F64E503), UINT64_C(0x8083ED2F01EE0B1E),
|
||||
UINT64_C(0xE4619849E3703838), UINT64_C(0x38C0B46BBDFAD625),
|
||||
UINT64_C(0x2CA57385274D5F74), UINT64_C(0xF0045FA779C7B169),
|
||||
UINT64_C(0x94E62AC19B59824F), UINT64_C(0x484706E3C5D36C52),
|
||||
UINT64_C(0xF92F6091673CA1A0), UINT64_C(0x258E4CB339B64FBD),
|
||||
UINT64_C(0x416C39D5DB287C9B), UINT64_C(0x9DCD15F785A29286),
|
||||
UINT64_C(0x89A8D2191F151BD7), UINT64_C(0x5509FE3B419FF5CA),
|
||||
UINT64_C(0x31EB8B5DA301C6EC), UINT64_C(0xED4AA77FFD8B28F1),
|
||||
UINT64_C(0x19210580966ED54F), UINT64_C(0xC58029A2C8E43B52),
|
||||
UINT64_C(0xA1625CC42A7A0874), UINT64_C(0x7DC370E674F0E669),
|
||||
UINT64_C(0x69A6B708EE476F38), UINT64_C(0xB5079B2AB0CD8125),
|
||||
UINT64_C(0xD1E5EE4C5253B203), UINT64_C(0x0D44C26E0CD95C1E)
|
||||
}
|
||||
};
|
|
@ -0,0 +1,523 @@
|
|||
/* This file has been automatically generated by crc64_tablegen.c. */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
const uint64_t lzma_crc64_table[4][256] = {
|
||||
{
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0xB32E4CBE03A75F6F),
|
||||
UINT64_C(0xF4843657A840A05B), UINT64_C(0x47AA7AE9ABE7FF34),
|
||||
UINT64_C(0x7BD0C384FF8F5E33), UINT64_C(0xC8FE8F3AFC28015C),
|
||||
UINT64_C(0x8F54F5D357CFFE68), UINT64_C(0x3C7AB96D5468A107),
|
||||
UINT64_C(0xF7A18709FF1EBC66), UINT64_C(0x448FCBB7FCB9E309),
|
||||
UINT64_C(0x0325B15E575E1C3D), UINT64_C(0xB00BFDE054F94352),
|
||||
UINT64_C(0x8C71448D0091E255), UINT64_C(0x3F5F08330336BD3A),
|
||||
UINT64_C(0x78F572DAA8D1420E), UINT64_C(0xCBDB3E64AB761D61),
|
||||
UINT64_C(0x7D9BA13851336649), UINT64_C(0xCEB5ED8652943926),
|
||||
UINT64_C(0x891F976FF973C612), UINT64_C(0x3A31DBD1FAD4997D),
|
||||
UINT64_C(0x064B62BCAEBC387A), UINT64_C(0xB5652E02AD1B6715),
|
||||
UINT64_C(0xF2CF54EB06FC9821), UINT64_C(0x41E11855055BC74E),
|
||||
UINT64_C(0x8A3A2631AE2DDA2F), UINT64_C(0x39146A8FAD8A8540),
|
||||
UINT64_C(0x7EBE1066066D7A74), UINT64_C(0xCD905CD805CA251B),
|
||||
UINT64_C(0xF1EAE5B551A2841C), UINT64_C(0x42C4A90B5205DB73),
|
||||
UINT64_C(0x056ED3E2F9E22447), UINT64_C(0xB6409F5CFA457B28),
|
||||
UINT64_C(0xFB374270A266CC92), UINT64_C(0x48190ECEA1C193FD),
|
||||
UINT64_C(0x0FB374270A266CC9), UINT64_C(0xBC9D3899098133A6),
|
||||
UINT64_C(0x80E781F45DE992A1), UINT64_C(0x33C9CD4A5E4ECDCE),
|
||||
UINT64_C(0x7463B7A3F5A932FA), UINT64_C(0xC74DFB1DF60E6D95),
|
||||
UINT64_C(0x0C96C5795D7870F4), UINT64_C(0xBFB889C75EDF2F9B),
|
||||
UINT64_C(0xF812F32EF538D0AF), UINT64_C(0x4B3CBF90F69F8FC0),
|
||||
UINT64_C(0x774606FDA2F72EC7), UINT64_C(0xC4684A43A15071A8),
|
||||
UINT64_C(0x83C230AA0AB78E9C), UINT64_C(0x30EC7C140910D1F3),
|
||||
UINT64_C(0x86ACE348F355AADB), UINT64_C(0x3582AFF6F0F2F5B4),
|
||||
UINT64_C(0x7228D51F5B150A80), UINT64_C(0xC10699A158B255EF),
|
||||
UINT64_C(0xFD7C20CC0CDAF4E8), UINT64_C(0x4E526C720F7DAB87),
|
||||
UINT64_C(0x09F8169BA49A54B3), UINT64_C(0xBAD65A25A73D0BDC),
|
||||
UINT64_C(0x710D64410C4B16BD), UINT64_C(0xC22328FF0FEC49D2),
|
||||
UINT64_C(0x85895216A40BB6E6), UINT64_C(0x36A71EA8A7ACE989),
|
||||
UINT64_C(0x0ADDA7C5F3C4488E), UINT64_C(0xB9F3EB7BF06317E1),
|
||||
UINT64_C(0xFE5991925B84E8D5), UINT64_C(0x4D77DD2C5823B7BA),
|
||||
UINT64_C(0x64B62BCAEBC387A1), UINT64_C(0xD7986774E864D8CE),
|
||||
UINT64_C(0x90321D9D438327FA), UINT64_C(0x231C512340247895),
|
||||
UINT64_C(0x1F66E84E144CD992), UINT64_C(0xAC48A4F017EB86FD),
|
||||
UINT64_C(0xEBE2DE19BC0C79C9), UINT64_C(0x58CC92A7BFAB26A6),
|
||||
UINT64_C(0x9317ACC314DD3BC7), UINT64_C(0x2039E07D177A64A8),
|
||||
UINT64_C(0x67939A94BC9D9B9C), UINT64_C(0xD4BDD62ABF3AC4F3),
|
||||
UINT64_C(0xE8C76F47EB5265F4), UINT64_C(0x5BE923F9E8F53A9B),
|
||||
UINT64_C(0x1C4359104312C5AF), UINT64_C(0xAF6D15AE40B59AC0),
|
||||
UINT64_C(0x192D8AF2BAF0E1E8), UINT64_C(0xAA03C64CB957BE87),
|
||||
UINT64_C(0xEDA9BCA512B041B3), UINT64_C(0x5E87F01B11171EDC),
|
||||
UINT64_C(0x62FD4976457FBFDB), UINT64_C(0xD1D305C846D8E0B4),
|
||||
UINT64_C(0x96797F21ED3F1F80), UINT64_C(0x2557339FEE9840EF),
|
||||
UINT64_C(0xEE8C0DFB45EE5D8E), UINT64_C(0x5DA24145464902E1),
|
||||
UINT64_C(0x1A083BACEDAEFDD5), UINT64_C(0xA9267712EE09A2BA),
|
||||
UINT64_C(0x955CCE7FBA6103BD), UINT64_C(0x267282C1B9C65CD2),
|
||||
UINT64_C(0x61D8F8281221A3E6), UINT64_C(0xD2F6B4961186FC89),
|
||||
UINT64_C(0x9F8169BA49A54B33), UINT64_C(0x2CAF25044A02145C),
|
||||
UINT64_C(0x6B055FEDE1E5EB68), UINT64_C(0xD82B1353E242B407),
|
||||
UINT64_C(0xE451AA3EB62A1500), UINT64_C(0x577FE680B58D4A6F),
|
||||
UINT64_C(0x10D59C691E6AB55B), UINT64_C(0xA3FBD0D71DCDEA34),
|
||||
UINT64_C(0x6820EEB3B6BBF755), UINT64_C(0xDB0EA20DB51CA83A),
|
||||
UINT64_C(0x9CA4D8E41EFB570E), UINT64_C(0x2F8A945A1D5C0861),
|
||||
UINT64_C(0x13F02D374934A966), UINT64_C(0xA0DE61894A93F609),
|
||||
UINT64_C(0xE7741B60E174093D), UINT64_C(0x545A57DEE2D35652),
|
||||
UINT64_C(0xE21AC88218962D7A), UINT64_C(0x5134843C1B317215),
|
||||
UINT64_C(0x169EFED5B0D68D21), UINT64_C(0xA5B0B26BB371D24E),
|
||||
UINT64_C(0x99CA0B06E7197349), UINT64_C(0x2AE447B8E4BE2C26),
|
||||
UINT64_C(0x6D4E3D514F59D312), UINT64_C(0xDE6071EF4CFE8C7D),
|
||||
UINT64_C(0x15BB4F8BE788911C), UINT64_C(0xA6950335E42FCE73),
|
||||
UINT64_C(0xE13F79DC4FC83147), UINT64_C(0x521135624C6F6E28),
|
||||
UINT64_C(0x6E6B8C0F1807CF2F), UINT64_C(0xDD45C0B11BA09040),
|
||||
UINT64_C(0x9AEFBA58B0476F74), UINT64_C(0x29C1F6E6B3E0301B),
|
||||
UINT64_C(0xC96C5795D7870F42), UINT64_C(0x7A421B2BD420502D),
|
||||
UINT64_C(0x3DE861C27FC7AF19), UINT64_C(0x8EC62D7C7C60F076),
|
||||
UINT64_C(0xB2BC941128085171), UINT64_C(0x0192D8AF2BAF0E1E),
|
||||
UINT64_C(0x4638A2468048F12A), UINT64_C(0xF516EEF883EFAE45),
|
||||
UINT64_C(0x3ECDD09C2899B324), UINT64_C(0x8DE39C222B3EEC4B),
|
||||
UINT64_C(0xCA49E6CB80D9137F), UINT64_C(0x7967AA75837E4C10),
|
||||
UINT64_C(0x451D1318D716ED17), UINT64_C(0xF6335FA6D4B1B278),
|
||||
UINT64_C(0xB199254F7F564D4C), UINT64_C(0x02B769F17CF11223),
|
||||
UINT64_C(0xB4F7F6AD86B4690B), UINT64_C(0x07D9BA1385133664),
|
||||
UINT64_C(0x4073C0FA2EF4C950), UINT64_C(0xF35D8C442D53963F),
|
||||
UINT64_C(0xCF273529793B3738), UINT64_C(0x7C0979977A9C6857),
|
||||
UINT64_C(0x3BA3037ED17B9763), UINT64_C(0x888D4FC0D2DCC80C),
|
||||
UINT64_C(0x435671A479AAD56D), UINT64_C(0xF0783D1A7A0D8A02),
|
||||
UINT64_C(0xB7D247F3D1EA7536), UINT64_C(0x04FC0B4DD24D2A59),
|
||||
UINT64_C(0x3886B22086258B5E), UINT64_C(0x8BA8FE9E8582D431),
|
||||
UINT64_C(0xCC0284772E652B05), UINT64_C(0x7F2CC8C92DC2746A),
|
||||
UINT64_C(0x325B15E575E1C3D0), UINT64_C(0x8175595B76469CBF),
|
||||
UINT64_C(0xC6DF23B2DDA1638B), UINT64_C(0x75F16F0CDE063CE4),
|
||||
UINT64_C(0x498BD6618A6E9DE3), UINT64_C(0xFAA59ADF89C9C28C),
|
||||
UINT64_C(0xBD0FE036222E3DB8), UINT64_C(0x0E21AC88218962D7),
|
||||
UINT64_C(0xC5FA92EC8AFF7FB6), UINT64_C(0x76D4DE52895820D9),
|
||||
UINT64_C(0x317EA4BB22BFDFED), UINT64_C(0x8250E80521188082),
|
||||
UINT64_C(0xBE2A516875702185), UINT64_C(0x0D041DD676D77EEA),
|
||||
UINT64_C(0x4AAE673FDD3081DE), UINT64_C(0xF9802B81DE97DEB1),
|
||||
UINT64_C(0x4FC0B4DD24D2A599), UINT64_C(0xFCEEF8632775FAF6),
|
||||
UINT64_C(0xBB44828A8C9205C2), UINT64_C(0x086ACE348F355AAD),
|
||||
UINT64_C(0x34107759DB5DFBAA), UINT64_C(0x873E3BE7D8FAA4C5),
|
||||
UINT64_C(0xC094410E731D5BF1), UINT64_C(0x73BA0DB070BA049E),
|
||||
UINT64_C(0xB86133D4DBCC19FF), UINT64_C(0x0B4F7F6AD86B4690),
|
||||
UINT64_C(0x4CE50583738CB9A4), UINT64_C(0xFFCB493D702BE6CB),
|
||||
UINT64_C(0xC3B1F050244347CC), UINT64_C(0x709FBCEE27E418A3),
|
||||
UINT64_C(0x3735C6078C03E797), UINT64_C(0x841B8AB98FA4B8F8),
|
||||
UINT64_C(0xADDA7C5F3C4488E3), UINT64_C(0x1EF430E13FE3D78C),
|
||||
UINT64_C(0x595E4A08940428B8), UINT64_C(0xEA7006B697A377D7),
|
||||
UINT64_C(0xD60ABFDBC3CBD6D0), UINT64_C(0x6524F365C06C89BF),
|
||||
UINT64_C(0x228E898C6B8B768B), UINT64_C(0x91A0C532682C29E4),
|
||||
UINT64_C(0x5A7BFB56C35A3485), UINT64_C(0xE955B7E8C0FD6BEA),
|
||||
UINT64_C(0xAEFFCD016B1A94DE), UINT64_C(0x1DD181BF68BDCBB1),
|
||||
UINT64_C(0x21AB38D23CD56AB6), UINT64_C(0x9285746C3F7235D9),
|
||||
UINT64_C(0xD52F0E859495CAED), UINT64_C(0x6601423B97329582),
|
||||
UINT64_C(0xD041DD676D77EEAA), UINT64_C(0x636F91D96ED0B1C5),
|
||||
UINT64_C(0x24C5EB30C5374EF1), UINT64_C(0x97EBA78EC690119E),
|
||||
UINT64_C(0xAB911EE392F8B099), UINT64_C(0x18BF525D915FEFF6),
|
||||
UINT64_C(0x5F1528B43AB810C2), UINT64_C(0xEC3B640A391F4FAD),
|
||||
UINT64_C(0x27E05A6E926952CC), UINT64_C(0x94CE16D091CE0DA3),
|
||||
UINT64_C(0xD3646C393A29F297), UINT64_C(0x604A2087398EADF8),
|
||||
UINT64_C(0x5C3099EA6DE60CFF), UINT64_C(0xEF1ED5546E415390),
|
||||
UINT64_C(0xA8B4AFBDC5A6ACA4), UINT64_C(0x1B9AE303C601F3CB),
|
||||
UINT64_C(0x56ED3E2F9E224471), UINT64_C(0xE5C372919D851B1E),
|
||||
UINT64_C(0xA26908783662E42A), UINT64_C(0x114744C635C5BB45),
|
||||
UINT64_C(0x2D3DFDAB61AD1A42), UINT64_C(0x9E13B115620A452D),
|
||||
UINT64_C(0xD9B9CBFCC9EDBA19), UINT64_C(0x6A978742CA4AE576),
|
||||
UINT64_C(0xA14CB926613CF817), UINT64_C(0x1262F598629BA778),
|
||||
UINT64_C(0x55C88F71C97C584C), UINT64_C(0xE6E6C3CFCADB0723),
|
||||
UINT64_C(0xDA9C7AA29EB3A624), UINT64_C(0x69B2361C9D14F94B),
|
||||
UINT64_C(0x2E184CF536F3067F), UINT64_C(0x9D36004B35545910),
|
||||
UINT64_C(0x2B769F17CF112238), UINT64_C(0x9858D3A9CCB67D57),
|
||||
UINT64_C(0xDFF2A94067518263), UINT64_C(0x6CDCE5FE64F6DD0C),
|
||||
UINT64_C(0x50A65C93309E7C0B), UINT64_C(0xE388102D33392364),
|
||||
UINT64_C(0xA4226AC498DEDC50), UINT64_C(0x170C267A9B79833F),
|
||||
UINT64_C(0xDCD7181E300F9E5E), UINT64_C(0x6FF954A033A8C131),
|
||||
UINT64_C(0x28532E49984F3E05), UINT64_C(0x9B7D62F79BE8616A),
|
||||
UINT64_C(0xA707DB9ACF80C06D), UINT64_C(0x14299724CC279F02),
|
||||
UINT64_C(0x5383EDCD67C06036), UINT64_C(0xE0ADA17364673F59)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0x54E979925CD0F10D),
|
||||
UINT64_C(0xA9D2F324B9A1E21A), UINT64_C(0xFD3B8AB6E5711317),
|
||||
UINT64_C(0xC17D4962DC4DDAB1), UINT64_C(0x959430F0809D2BBC),
|
||||
UINT64_C(0x68AFBA4665EC38AB), UINT64_C(0x3C46C3D4393CC9A6),
|
||||
UINT64_C(0x10223DEE1795ABE7), UINT64_C(0x44CB447C4B455AEA),
|
||||
UINT64_C(0xB9F0CECAAE3449FD), UINT64_C(0xED19B758F2E4B8F0),
|
||||
UINT64_C(0xD15F748CCBD87156), UINT64_C(0x85B60D1E9708805B),
|
||||
UINT64_C(0x788D87A87279934C), UINT64_C(0x2C64FE3A2EA96241),
|
||||
UINT64_C(0x20447BDC2F2B57CE), UINT64_C(0x74AD024E73FBA6C3),
|
||||
UINT64_C(0x899688F8968AB5D4), UINT64_C(0xDD7FF16ACA5A44D9),
|
||||
UINT64_C(0xE13932BEF3668D7F), UINT64_C(0xB5D04B2CAFB67C72),
|
||||
UINT64_C(0x48EBC19A4AC76F65), UINT64_C(0x1C02B80816179E68),
|
||||
UINT64_C(0x3066463238BEFC29), UINT64_C(0x648F3FA0646E0D24),
|
||||
UINT64_C(0x99B4B516811F1E33), UINT64_C(0xCD5DCC84DDCFEF3E),
|
||||
UINT64_C(0xF11B0F50E4F32698), UINT64_C(0xA5F276C2B823D795),
|
||||
UINT64_C(0x58C9FC745D52C482), UINT64_C(0x0C2085E60182358F),
|
||||
UINT64_C(0x4088F7B85E56AF9C), UINT64_C(0x14618E2A02865E91),
|
||||
UINT64_C(0xE95A049CE7F74D86), UINT64_C(0xBDB37D0EBB27BC8B),
|
||||
UINT64_C(0x81F5BEDA821B752D), UINT64_C(0xD51CC748DECB8420),
|
||||
UINT64_C(0x28274DFE3BBA9737), UINT64_C(0x7CCE346C676A663A),
|
||||
UINT64_C(0x50AACA5649C3047B), UINT64_C(0x0443B3C41513F576),
|
||||
UINT64_C(0xF9783972F062E661), UINT64_C(0xAD9140E0ACB2176C),
|
||||
UINT64_C(0x91D78334958EDECA), UINT64_C(0xC53EFAA6C95E2FC7),
|
||||
UINT64_C(0x380570102C2F3CD0), UINT64_C(0x6CEC098270FFCDDD),
|
||||
UINT64_C(0x60CC8C64717DF852), UINT64_C(0x3425F5F62DAD095F),
|
||||
UINT64_C(0xC91E7F40C8DC1A48), UINT64_C(0x9DF706D2940CEB45),
|
||||
UINT64_C(0xA1B1C506AD3022E3), UINT64_C(0xF558BC94F1E0D3EE),
|
||||
UINT64_C(0x086336221491C0F9), UINT64_C(0x5C8A4FB0484131F4),
|
||||
UINT64_C(0x70EEB18A66E853B5), UINT64_C(0x2407C8183A38A2B8),
|
||||
UINT64_C(0xD93C42AEDF49B1AF), UINT64_C(0x8DD53B3C839940A2),
|
||||
UINT64_C(0xB193F8E8BAA58904), UINT64_C(0xE57A817AE6757809),
|
||||
UINT64_C(0x18410BCC03046B1E), UINT64_C(0x4CA8725E5FD49A13),
|
||||
UINT64_C(0x8111EF70BCAD5F38), UINT64_C(0xD5F896E2E07DAE35),
|
||||
UINT64_C(0x28C31C54050CBD22), UINT64_C(0x7C2A65C659DC4C2F),
|
||||
UINT64_C(0x406CA61260E08589), UINT64_C(0x1485DF803C307484),
|
||||
UINT64_C(0xE9BE5536D9416793), UINT64_C(0xBD572CA48591969E),
|
||||
UINT64_C(0x9133D29EAB38F4DF), UINT64_C(0xC5DAAB0CF7E805D2),
|
||||
UINT64_C(0x38E121BA129916C5), UINT64_C(0x6C0858284E49E7C8),
|
||||
UINT64_C(0x504E9BFC77752E6E), UINT64_C(0x04A7E26E2BA5DF63),
|
||||
UINT64_C(0xF99C68D8CED4CC74), UINT64_C(0xAD75114A92043D79),
|
||||
UINT64_C(0xA15594AC938608F6), UINT64_C(0xF5BCED3ECF56F9FB),
|
||||
UINT64_C(0x088767882A27EAEC), UINT64_C(0x5C6E1E1A76F71BE1),
|
||||
UINT64_C(0x6028DDCE4FCBD247), UINT64_C(0x34C1A45C131B234A),
|
||||
UINT64_C(0xC9FA2EEAF66A305D), UINT64_C(0x9D135778AABAC150),
|
||||
UINT64_C(0xB177A9428413A311), UINT64_C(0xE59ED0D0D8C3521C),
|
||||
UINT64_C(0x18A55A663DB2410B), UINT64_C(0x4C4C23F46162B006),
|
||||
UINT64_C(0x700AE020585E79A0), UINT64_C(0x24E399B2048E88AD),
|
||||
UINT64_C(0xD9D81304E1FF9BBA), UINT64_C(0x8D316A96BD2F6AB7),
|
||||
UINT64_C(0xC19918C8E2FBF0A4), UINT64_C(0x9570615ABE2B01A9),
|
||||
UINT64_C(0x684BEBEC5B5A12BE), UINT64_C(0x3CA2927E078AE3B3),
|
||||
UINT64_C(0x00E451AA3EB62A15), UINT64_C(0x540D28386266DB18),
|
||||
UINT64_C(0xA936A28E8717C80F), UINT64_C(0xFDDFDB1CDBC73902),
|
||||
UINT64_C(0xD1BB2526F56E5B43), UINT64_C(0x85525CB4A9BEAA4E),
|
||||
UINT64_C(0x7869D6024CCFB959), UINT64_C(0x2C80AF90101F4854),
|
||||
UINT64_C(0x10C66C44292381F2), UINT64_C(0x442F15D675F370FF),
|
||||
UINT64_C(0xB9149F60908263E8), UINT64_C(0xEDFDE6F2CC5292E5),
|
||||
UINT64_C(0xE1DD6314CDD0A76A), UINT64_C(0xB5341A8691005667),
|
||||
UINT64_C(0x480F903074714570), UINT64_C(0x1CE6E9A228A1B47D),
|
||||
UINT64_C(0x20A02A76119D7DDB), UINT64_C(0x744953E44D4D8CD6),
|
||||
UINT64_C(0x8972D952A83C9FC1), UINT64_C(0xDD9BA0C0F4EC6ECC),
|
||||
UINT64_C(0xF1FF5EFADA450C8D), UINT64_C(0xA51627688695FD80),
|
||||
UINT64_C(0x582DADDE63E4EE97), UINT64_C(0x0CC4D44C3F341F9A),
|
||||
UINT64_C(0x308217980608D63C), UINT64_C(0x646B6E0A5AD82731),
|
||||
UINT64_C(0x9950E4BCBFA93426), UINT64_C(0xCDB99D2EE379C52B),
|
||||
UINT64_C(0x90FB71CAD654A0F5), UINT64_C(0xC41208588A8451F8),
|
||||
UINT64_C(0x392982EE6FF542EF), UINT64_C(0x6DC0FB7C3325B3E2),
|
||||
UINT64_C(0x518638A80A197A44), UINT64_C(0x056F413A56C98B49),
|
||||
UINT64_C(0xF854CB8CB3B8985E), UINT64_C(0xACBDB21EEF686953),
|
||||
UINT64_C(0x80D94C24C1C10B12), UINT64_C(0xD43035B69D11FA1F),
|
||||
UINT64_C(0x290BBF007860E908), UINT64_C(0x7DE2C69224B01805),
|
||||
UINT64_C(0x41A405461D8CD1A3), UINT64_C(0x154D7CD4415C20AE),
|
||||
UINT64_C(0xE876F662A42D33B9), UINT64_C(0xBC9F8FF0F8FDC2B4),
|
||||
UINT64_C(0xB0BF0A16F97FF73B), UINT64_C(0xE4567384A5AF0636),
|
||||
UINT64_C(0x196DF93240DE1521), UINT64_C(0x4D8480A01C0EE42C),
|
||||
UINT64_C(0x71C2437425322D8A), UINT64_C(0x252B3AE679E2DC87),
|
||||
UINT64_C(0xD810B0509C93CF90), UINT64_C(0x8CF9C9C2C0433E9D),
|
||||
UINT64_C(0xA09D37F8EEEA5CDC), UINT64_C(0xF4744E6AB23AADD1),
|
||||
UINT64_C(0x094FC4DC574BBEC6), UINT64_C(0x5DA6BD4E0B9B4FCB),
|
||||
UINT64_C(0x61E07E9A32A7866D), UINT64_C(0x350907086E777760),
|
||||
UINT64_C(0xC8328DBE8B066477), UINT64_C(0x9CDBF42CD7D6957A),
|
||||
UINT64_C(0xD073867288020F69), UINT64_C(0x849AFFE0D4D2FE64),
|
||||
UINT64_C(0x79A1755631A3ED73), UINT64_C(0x2D480CC46D731C7E),
|
||||
UINT64_C(0x110ECF10544FD5D8), UINT64_C(0x45E7B682089F24D5),
|
||||
UINT64_C(0xB8DC3C34EDEE37C2), UINT64_C(0xEC3545A6B13EC6CF),
|
||||
UINT64_C(0xC051BB9C9F97A48E), UINT64_C(0x94B8C20EC3475583),
|
||||
UINT64_C(0x698348B826364694), UINT64_C(0x3D6A312A7AE6B799),
|
||||
UINT64_C(0x012CF2FE43DA7E3F), UINT64_C(0x55C58B6C1F0A8F32),
|
||||
UINT64_C(0xA8FE01DAFA7B9C25), UINT64_C(0xFC177848A6AB6D28),
|
||||
UINT64_C(0xF037FDAEA72958A7), UINT64_C(0xA4DE843CFBF9A9AA),
|
||||
UINT64_C(0x59E50E8A1E88BABD), UINT64_C(0x0D0C771842584BB0),
|
||||
UINT64_C(0x314AB4CC7B648216), UINT64_C(0x65A3CD5E27B4731B),
|
||||
UINT64_C(0x989847E8C2C5600C), UINT64_C(0xCC713E7A9E159101),
|
||||
UINT64_C(0xE015C040B0BCF340), UINT64_C(0xB4FCB9D2EC6C024D),
|
||||
UINT64_C(0x49C73364091D115A), UINT64_C(0x1D2E4AF655CDE057),
|
||||
UINT64_C(0x216889226CF129F1), UINT64_C(0x7581F0B03021D8FC),
|
||||
UINT64_C(0x88BA7A06D550CBEB), UINT64_C(0xDC53039489803AE6),
|
||||
UINT64_C(0x11EA9EBA6AF9FFCD), UINT64_C(0x4503E72836290EC0),
|
||||
UINT64_C(0xB8386D9ED3581DD7), UINT64_C(0xECD1140C8F88ECDA),
|
||||
UINT64_C(0xD097D7D8B6B4257C), UINT64_C(0x847EAE4AEA64D471),
|
||||
UINT64_C(0x794524FC0F15C766), UINT64_C(0x2DAC5D6E53C5366B),
|
||||
UINT64_C(0x01C8A3547D6C542A), UINT64_C(0x5521DAC621BCA527),
|
||||
UINT64_C(0xA81A5070C4CDB630), UINT64_C(0xFCF329E2981D473D),
|
||||
UINT64_C(0xC0B5EA36A1218E9B), UINT64_C(0x945C93A4FDF17F96),
|
||||
UINT64_C(0x6967191218806C81), UINT64_C(0x3D8E608044509D8C),
|
||||
UINT64_C(0x31AEE56645D2A803), UINT64_C(0x65479CF41902590E),
|
||||
UINT64_C(0x987C1642FC734A19), UINT64_C(0xCC956FD0A0A3BB14),
|
||||
UINT64_C(0xF0D3AC04999F72B2), UINT64_C(0xA43AD596C54F83BF),
|
||||
UINT64_C(0x59015F20203E90A8), UINT64_C(0x0DE826B27CEE61A5),
|
||||
UINT64_C(0x218CD888524703E4), UINT64_C(0x7565A11A0E97F2E9),
|
||||
UINT64_C(0x885E2BACEBE6E1FE), UINT64_C(0xDCB7523EB73610F3),
|
||||
UINT64_C(0xE0F191EA8E0AD955), UINT64_C(0xB418E878D2DA2858),
|
||||
UINT64_C(0x492362CE37AB3B4F), UINT64_C(0x1DCA1B5C6B7BCA42),
|
||||
UINT64_C(0x5162690234AF5051), UINT64_C(0x058B1090687FA15C),
|
||||
UINT64_C(0xF8B09A268D0EB24B), UINT64_C(0xAC59E3B4D1DE4346),
|
||||
UINT64_C(0x901F2060E8E28AE0), UINT64_C(0xC4F659F2B4327BED),
|
||||
UINT64_C(0x39CDD344514368FA), UINT64_C(0x6D24AAD60D9399F7),
|
||||
UINT64_C(0x414054EC233AFBB6), UINT64_C(0x15A92D7E7FEA0ABB),
|
||||
UINT64_C(0xE892A7C89A9B19AC), UINT64_C(0xBC7BDE5AC64BE8A1),
|
||||
UINT64_C(0x803D1D8EFF772107), UINT64_C(0xD4D4641CA3A7D00A),
|
||||
UINT64_C(0x29EFEEAA46D6C31D), UINT64_C(0x7D0697381A063210),
|
||||
UINT64_C(0x712612DE1B84079F), UINT64_C(0x25CF6B4C4754F692),
|
||||
UINT64_C(0xD8F4E1FAA225E585), UINT64_C(0x8C1D9868FEF51488),
|
||||
UINT64_C(0xB05B5BBCC7C9DD2E), UINT64_C(0xE4B2222E9B192C23),
|
||||
UINT64_C(0x1989A8987E683F34), UINT64_C(0x4D60D10A22B8CE39),
|
||||
UINT64_C(0x61042F300C11AC78), UINT64_C(0x35ED56A250C15D75),
|
||||
UINT64_C(0xC8D6DC14B5B04E62), UINT64_C(0x9C3FA586E960BF6F),
|
||||
UINT64_C(0xA0796652D05C76C9), UINT64_C(0xF4901FC08C8C87C4),
|
||||
UINT64_C(0x09AB957669FD94D3), UINT64_C(0x5D42ECE4352D65DE)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0x3F0BE14A916A6DCB),
|
||||
UINT64_C(0x7E17C29522D4DB96), UINT64_C(0x411C23DFB3BEB65D),
|
||||
UINT64_C(0xFC2F852A45A9B72C), UINT64_C(0xC3246460D4C3DAE7),
|
||||
UINT64_C(0x823847BF677D6CBA), UINT64_C(0xBD33A6F5F6170171),
|
||||
UINT64_C(0x6A87A57F245D70DD), UINT64_C(0x558C4435B5371D16),
|
||||
UINT64_C(0x149067EA0689AB4B), UINT64_C(0x2B9B86A097E3C680),
|
||||
UINT64_C(0x96A8205561F4C7F1), UINT64_C(0xA9A3C11FF09EAA3A),
|
||||
UINT64_C(0xE8BFE2C043201C67), UINT64_C(0xD7B4038AD24A71AC),
|
||||
UINT64_C(0xD50F4AFE48BAE1BA), UINT64_C(0xEA04ABB4D9D08C71),
|
||||
UINT64_C(0xAB18886B6A6E3A2C), UINT64_C(0x94136921FB0457E7),
|
||||
UINT64_C(0x2920CFD40D135696), UINT64_C(0x162B2E9E9C793B5D),
|
||||
UINT64_C(0x57370D412FC78D00), UINT64_C(0x683CEC0BBEADE0CB),
|
||||
UINT64_C(0xBF88EF816CE79167), UINT64_C(0x80830ECBFD8DFCAC),
|
||||
UINT64_C(0xC19F2D144E334AF1), UINT64_C(0xFE94CC5EDF59273A),
|
||||
UINT64_C(0x43A76AAB294E264B), UINT64_C(0x7CAC8BE1B8244B80),
|
||||
UINT64_C(0x3DB0A83E0B9AFDDD), UINT64_C(0x02BB49749AF09016),
|
||||
UINT64_C(0x38C63AD73E7BDDF1), UINT64_C(0x07CDDB9DAF11B03A),
|
||||
UINT64_C(0x46D1F8421CAF0667), UINT64_C(0x79DA19088DC56BAC),
|
||||
UINT64_C(0xC4E9BFFD7BD26ADD), UINT64_C(0xFBE25EB7EAB80716),
|
||||
UINT64_C(0xBAFE7D685906B14B), UINT64_C(0x85F59C22C86CDC80),
|
||||
UINT64_C(0x52419FA81A26AD2C), UINT64_C(0x6D4A7EE28B4CC0E7),
|
||||
UINT64_C(0x2C565D3D38F276BA), UINT64_C(0x135DBC77A9981B71),
|
||||
UINT64_C(0xAE6E1A825F8F1A00), UINT64_C(0x9165FBC8CEE577CB),
|
||||
UINT64_C(0xD079D8177D5BC196), UINT64_C(0xEF72395DEC31AC5D),
|
||||
UINT64_C(0xEDC9702976C13C4B), UINT64_C(0xD2C29163E7AB5180),
|
||||
UINT64_C(0x93DEB2BC5415E7DD), UINT64_C(0xACD553F6C57F8A16),
|
||||
UINT64_C(0x11E6F50333688B67), UINT64_C(0x2EED1449A202E6AC),
|
||||
UINT64_C(0x6FF1379611BC50F1), UINT64_C(0x50FAD6DC80D63D3A),
|
||||
UINT64_C(0x874ED556529C4C96), UINT64_C(0xB845341CC3F6215D),
|
||||
UINT64_C(0xF95917C370489700), UINT64_C(0xC652F689E122FACB),
|
||||
UINT64_C(0x7B61507C1735FBBA), UINT64_C(0x446AB136865F9671),
|
||||
UINT64_C(0x057692E935E1202C), UINT64_C(0x3A7D73A3A48B4DE7),
|
||||
UINT64_C(0x718C75AE7CF7BBE2), UINT64_C(0x4E8794E4ED9DD629),
|
||||
UINT64_C(0x0F9BB73B5E236074), UINT64_C(0x30905671CF490DBF),
|
||||
UINT64_C(0x8DA3F084395E0CCE), UINT64_C(0xB2A811CEA8346105),
|
||||
UINT64_C(0xF3B432111B8AD758), UINT64_C(0xCCBFD35B8AE0BA93),
|
||||
UINT64_C(0x1B0BD0D158AACB3F), UINT64_C(0x2400319BC9C0A6F4),
|
||||
UINT64_C(0x651C12447A7E10A9), UINT64_C(0x5A17F30EEB147D62),
|
||||
UINT64_C(0xE72455FB1D037C13), UINT64_C(0xD82FB4B18C6911D8),
|
||||
UINT64_C(0x9933976E3FD7A785), UINT64_C(0xA6387624AEBDCA4E),
|
||||
UINT64_C(0xA4833F50344D5A58), UINT64_C(0x9B88DE1AA5273793),
|
||||
UINT64_C(0xDA94FDC5169981CE), UINT64_C(0xE59F1C8F87F3EC05),
|
||||
UINT64_C(0x58ACBA7A71E4ED74), UINT64_C(0x67A75B30E08E80BF),
|
||||
UINT64_C(0x26BB78EF533036E2), UINT64_C(0x19B099A5C25A5B29),
|
||||
UINT64_C(0xCE049A2F10102A85), UINT64_C(0xF10F7B65817A474E),
|
||||
UINT64_C(0xB01358BA32C4F113), UINT64_C(0x8F18B9F0A3AE9CD8),
|
||||
UINT64_C(0x322B1F0555B99DA9), UINT64_C(0x0D20FE4FC4D3F062),
|
||||
UINT64_C(0x4C3CDD90776D463F), UINT64_C(0x73373CDAE6072BF4),
|
||||
UINT64_C(0x494A4F79428C6613), UINT64_C(0x7641AE33D3E60BD8),
|
||||
UINT64_C(0x375D8DEC6058BD85), UINT64_C(0x08566CA6F132D04E),
|
||||
UINT64_C(0xB565CA530725D13F), UINT64_C(0x8A6E2B19964FBCF4),
|
||||
UINT64_C(0xCB7208C625F10AA9), UINT64_C(0xF479E98CB49B6762),
|
||||
UINT64_C(0x23CDEA0666D116CE), UINT64_C(0x1CC60B4CF7BB7B05),
|
||||
UINT64_C(0x5DDA28934405CD58), UINT64_C(0x62D1C9D9D56FA093),
|
||||
UINT64_C(0xDFE26F2C2378A1E2), UINT64_C(0xE0E98E66B212CC29),
|
||||
UINT64_C(0xA1F5ADB901AC7A74), UINT64_C(0x9EFE4CF390C617BF),
|
||||
UINT64_C(0x9C4505870A3687A9), UINT64_C(0xA34EE4CD9B5CEA62),
|
||||
UINT64_C(0xE252C71228E25C3F), UINT64_C(0xDD592658B98831F4),
|
||||
UINT64_C(0x606A80AD4F9F3085), UINT64_C(0x5F6161E7DEF55D4E),
|
||||
UINT64_C(0x1E7D42386D4BEB13), UINT64_C(0x2176A372FC2186D8),
|
||||
UINT64_C(0xF6C2A0F82E6BF774), UINT64_C(0xC9C941B2BF019ABF),
|
||||
UINT64_C(0x88D5626D0CBF2CE2), UINT64_C(0xB7DE83279DD54129),
|
||||
UINT64_C(0x0AED25D26BC24058), UINT64_C(0x35E6C498FAA82D93),
|
||||
UINT64_C(0x74FAE74749169BCE), UINT64_C(0x4BF1060DD87CF605),
|
||||
UINT64_C(0xE318EB5CF9EF77C4), UINT64_C(0xDC130A1668851A0F),
|
||||
UINT64_C(0x9D0F29C9DB3BAC52), UINT64_C(0xA204C8834A51C199),
|
||||
UINT64_C(0x1F376E76BC46C0E8), UINT64_C(0x203C8F3C2D2CAD23),
|
||||
UINT64_C(0x6120ACE39E921B7E), UINT64_C(0x5E2B4DA90FF876B5),
|
||||
UINT64_C(0x899F4E23DDB20719), UINT64_C(0xB694AF694CD86AD2),
|
||||
UINT64_C(0xF7888CB6FF66DC8F), UINT64_C(0xC8836DFC6E0CB144),
|
||||
UINT64_C(0x75B0CB09981BB035), UINT64_C(0x4ABB2A430971DDFE),
|
||||
UINT64_C(0x0BA7099CBACF6BA3), UINT64_C(0x34ACE8D62BA50668),
|
||||
UINT64_C(0x3617A1A2B155967E), UINT64_C(0x091C40E8203FFBB5),
|
||||
UINT64_C(0x4800633793814DE8), UINT64_C(0x770B827D02EB2023),
|
||||
UINT64_C(0xCA382488F4FC2152), UINT64_C(0xF533C5C265964C99),
|
||||
UINT64_C(0xB42FE61DD628FAC4), UINT64_C(0x8B2407574742970F),
|
||||
UINT64_C(0x5C9004DD9508E6A3), UINT64_C(0x639BE59704628B68),
|
||||
UINT64_C(0x2287C648B7DC3D35), UINT64_C(0x1D8C270226B650FE),
|
||||
UINT64_C(0xA0BF81F7D0A1518F), UINT64_C(0x9FB460BD41CB3C44),
|
||||
UINT64_C(0xDEA84362F2758A19), UINT64_C(0xE1A3A228631FE7D2),
|
||||
UINT64_C(0xDBDED18BC794AA35), UINT64_C(0xE4D530C156FEC7FE),
|
||||
UINT64_C(0xA5C9131EE54071A3), UINT64_C(0x9AC2F254742A1C68),
|
||||
UINT64_C(0x27F154A1823D1D19), UINT64_C(0x18FAB5EB135770D2),
|
||||
UINT64_C(0x59E69634A0E9C68F), UINT64_C(0x66ED777E3183AB44),
|
||||
UINT64_C(0xB15974F4E3C9DAE8), UINT64_C(0x8E5295BE72A3B723),
|
||||
UINT64_C(0xCF4EB661C11D017E), UINT64_C(0xF045572B50776CB5),
|
||||
UINT64_C(0x4D76F1DEA6606DC4), UINT64_C(0x727D1094370A000F),
|
||||
UINT64_C(0x3361334B84B4B652), UINT64_C(0x0C6AD20115DEDB99),
|
||||
UINT64_C(0x0ED19B758F2E4B8F), UINT64_C(0x31DA7A3F1E442644),
|
||||
UINT64_C(0x70C659E0ADFA9019), UINT64_C(0x4FCDB8AA3C90FDD2),
|
||||
UINT64_C(0xF2FE1E5FCA87FCA3), UINT64_C(0xCDF5FF155BED9168),
|
||||
UINT64_C(0x8CE9DCCAE8532735), UINT64_C(0xB3E23D8079394AFE),
|
||||
UINT64_C(0x64563E0AAB733B52), UINT64_C(0x5B5DDF403A195699),
|
||||
UINT64_C(0x1A41FC9F89A7E0C4), UINT64_C(0x254A1DD518CD8D0F),
|
||||
UINT64_C(0x9879BB20EEDA8C7E), UINT64_C(0xA7725A6A7FB0E1B5),
|
||||
UINT64_C(0xE66E79B5CC0E57E8), UINT64_C(0xD96598FF5D643A23),
|
||||
UINT64_C(0x92949EF28518CC26), UINT64_C(0xAD9F7FB81472A1ED),
|
||||
UINT64_C(0xEC835C67A7CC17B0), UINT64_C(0xD388BD2D36A67A7B),
|
||||
UINT64_C(0x6EBB1BD8C0B17B0A), UINT64_C(0x51B0FA9251DB16C1),
|
||||
UINT64_C(0x10ACD94DE265A09C), UINT64_C(0x2FA73807730FCD57),
|
||||
UINT64_C(0xF8133B8DA145BCFB), UINT64_C(0xC718DAC7302FD130),
|
||||
UINT64_C(0x8604F9188391676D), UINT64_C(0xB90F185212FB0AA6),
|
||||
UINT64_C(0x043CBEA7E4EC0BD7), UINT64_C(0x3B375FED7586661C),
|
||||
UINT64_C(0x7A2B7C32C638D041), UINT64_C(0x45209D785752BD8A),
|
||||
UINT64_C(0x479BD40CCDA22D9C), UINT64_C(0x789035465CC84057),
|
||||
UINT64_C(0x398C1699EF76F60A), UINT64_C(0x0687F7D37E1C9BC1),
|
||||
UINT64_C(0xBBB45126880B9AB0), UINT64_C(0x84BFB06C1961F77B),
|
||||
UINT64_C(0xC5A393B3AADF4126), UINT64_C(0xFAA872F93BB52CED),
|
||||
UINT64_C(0x2D1C7173E9FF5D41), UINT64_C(0x121790397895308A),
|
||||
UINT64_C(0x530BB3E6CB2B86D7), UINT64_C(0x6C0052AC5A41EB1C),
|
||||
UINT64_C(0xD133F459AC56EA6D), UINT64_C(0xEE3815133D3C87A6),
|
||||
UINT64_C(0xAF2436CC8E8231FB), UINT64_C(0x902FD7861FE85C30),
|
||||
UINT64_C(0xAA52A425BB6311D7), UINT64_C(0x9559456F2A097C1C),
|
||||
UINT64_C(0xD44566B099B7CA41), UINT64_C(0xEB4E87FA08DDA78A),
|
||||
UINT64_C(0x567D210FFECAA6FB), UINT64_C(0x6976C0456FA0CB30),
|
||||
UINT64_C(0x286AE39ADC1E7D6D), UINT64_C(0x176102D04D7410A6),
|
||||
UINT64_C(0xC0D5015A9F3E610A), UINT64_C(0xFFDEE0100E540CC1),
|
||||
UINT64_C(0xBEC2C3CFBDEABA9C), UINT64_C(0x81C922852C80D757),
|
||||
UINT64_C(0x3CFA8470DA97D626), UINT64_C(0x03F1653A4BFDBBED),
|
||||
UINT64_C(0x42ED46E5F8430DB0), UINT64_C(0x7DE6A7AF6929607B),
|
||||
UINT64_C(0x7F5DEEDBF3D9F06D), UINT64_C(0x40560F9162B39DA6),
|
||||
UINT64_C(0x014A2C4ED10D2BFB), UINT64_C(0x3E41CD0440674630),
|
||||
UINT64_C(0x83726BF1B6704741), UINT64_C(0xBC798ABB271A2A8A),
|
||||
UINT64_C(0xFD65A96494A49CD7), UINT64_C(0xC26E482E05CEF11C),
|
||||
UINT64_C(0x15DA4BA4D78480B0), UINT64_C(0x2AD1AAEE46EEED7B),
|
||||
UINT64_C(0x6BCD8931F5505B26), UINT64_C(0x54C6687B643A36ED),
|
||||
UINT64_C(0xE9F5CE8E922D379C), UINT64_C(0xD6FE2FC403475A57),
|
||||
UINT64_C(0x97E20C1BB0F9EC0A), UINT64_C(0xA8E9ED51219381C1)
|
||||
}, {
|
||||
UINT64_C(0x0000000000000000), UINT64_C(0x1DEE8A5E222CA1DC),
|
||||
UINT64_C(0x3BDD14BC445943B8), UINT64_C(0x26339EE26675E264),
|
||||
UINT64_C(0x77BA297888B28770), UINT64_C(0x6A54A326AA9E26AC),
|
||||
UINT64_C(0x4C673DC4CCEBC4C8), UINT64_C(0x5189B79AEEC76514),
|
||||
UINT64_C(0xEF7452F111650EE0), UINT64_C(0xF29AD8AF3349AF3C),
|
||||
UINT64_C(0xD4A9464D553C4D58), UINT64_C(0xC947CC137710EC84),
|
||||
UINT64_C(0x98CE7B8999D78990), UINT64_C(0x8520F1D7BBFB284C),
|
||||
UINT64_C(0xA3136F35DD8ECA28), UINT64_C(0xBEFDE56BFFA26BF4),
|
||||
UINT64_C(0x4C300AC98DC40345), UINT64_C(0x51DE8097AFE8A299),
|
||||
UINT64_C(0x77ED1E75C99D40FD), UINT64_C(0x6A03942BEBB1E121),
|
||||
UINT64_C(0x3B8A23B105768435), UINT64_C(0x2664A9EF275A25E9),
|
||||
UINT64_C(0x0057370D412FC78D), UINT64_C(0x1DB9BD5363036651),
|
||||
UINT64_C(0xA34458389CA10DA5), UINT64_C(0xBEAAD266BE8DAC79),
|
||||
UINT64_C(0x98994C84D8F84E1D), UINT64_C(0x8577C6DAFAD4EFC1),
|
||||
UINT64_C(0xD4FE714014138AD5), UINT64_C(0xC910FB1E363F2B09),
|
||||
UINT64_C(0xEF2365FC504AC96D), UINT64_C(0xF2CDEFA2726668B1),
|
||||
UINT64_C(0x986015931B88068A), UINT64_C(0x858E9FCD39A4A756),
|
||||
UINT64_C(0xA3BD012F5FD14532), UINT64_C(0xBE538B717DFDE4EE),
|
||||
UINT64_C(0xEFDA3CEB933A81FA), UINT64_C(0xF234B6B5B1162026),
|
||||
UINT64_C(0xD4072857D763C242), UINT64_C(0xC9E9A209F54F639E),
|
||||
UINT64_C(0x771447620AED086A), UINT64_C(0x6AFACD3C28C1A9B6),
|
||||
UINT64_C(0x4CC953DE4EB44BD2), UINT64_C(0x5127D9806C98EA0E),
|
||||
UINT64_C(0x00AE6E1A825F8F1A), UINT64_C(0x1D40E444A0732EC6),
|
||||
UINT64_C(0x3B737AA6C606CCA2), UINT64_C(0x269DF0F8E42A6D7E),
|
||||
UINT64_C(0xD4501F5A964C05CF), UINT64_C(0xC9BE9504B460A413),
|
||||
UINT64_C(0xEF8D0BE6D2154677), UINT64_C(0xF26381B8F039E7AB),
|
||||
UINT64_C(0xA3EA36221EFE82BF), UINT64_C(0xBE04BC7C3CD22363),
|
||||
UINT64_C(0x9837229E5AA7C107), UINT64_C(0x85D9A8C0788B60DB),
|
||||
UINT64_C(0x3B244DAB87290B2F), UINT64_C(0x26CAC7F5A505AAF3),
|
||||
UINT64_C(0x00F95917C3704897), UINT64_C(0x1D17D349E15CE94B),
|
||||
UINT64_C(0x4C9E64D30F9B8C5F), UINT64_C(0x5170EE8D2DB72D83),
|
||||
UINT64_C(0x7743706F4BC2CFE7), UINT64_C(0x6AADFA3169EE6E3B),
|
||||
UINT64_C(0xA218840D981E1391), UINT64_C(0xBFF60E53BA32B24D),
|
||||
UINT64_C(0x99C590B1DC475029), UINT64_C(0x842B1AEFFE6BF1F5),
|
||||
UINT64_C(0xD5A2AD7510AC94E1), UINT64_C(0xC84C272B3280353D),
|
||||
UINT64_C(0xEE7FB9C954F5D759), UINT64_C(0xF391339776D97685),
|
||||
UINT64_C(0x4D6CD6FC897B1D71), UINT64_C(0x50825CA2AB57BCAD),
|
||||
UINT64_C(0x76B1C240CD225EC9), UINT64_C(0x6B5F481EEF0EFF15),
|
||||
UINT64_C(0x3AD6FF8401C99A01), UINT64_C(0x273875DA23E53BDD),
|
||||
UINT64_C(0x010BEB384590D9B9), UINT64_C(0x1CE5616667BC7865),
|
||||
UINT64_C(0xEE288EC415DA10D4), UINT64_C(0xF3C6049A37F6B108),
|
||||
UINT64_C(0xD5F59A785183536C), UINT64_C(0xC81B102673AFF2B0),
|
||||
UINT64_C(0x9992A7BC9D6897A4), UINT64_C(0x847C2DE2BF443678),
|
||||
UINT64_C(0xA24FB300D931D41C), UINT64_C(0xBFA1395EFB1D75C0),
|
||||
UINT64_C(0x015CDC3504BF1E34), UINT64_C(0x1CB2566B2693BFE8),
|
||||
UINT64_C(0x3A81C88940E65D8C), UINT64_C(0x276F42D762CAFC50),
|
||||
UINT64_C(0x76E6F54D8C0D9944), UINT64_C(0x6B087F13AE213898),
|
||||
UINT64_C(0x4D3BE1F1C854DAFC), UINT64_C(0x50D56BAFEA787B20),
|
||||
UINT64_C(0x3A78919E8396151B), UINT64_C(0x27961BC0A1BAB4C7),
|
||||
UINT64_C(0x01A58522C7CF56A3), UINT64_C(0x1C4B0F7CE5E3F77F),
|
||||
UINT64_C(0x4DC2B8E60B24926B), UINT64_C(0x502C32B8290833B7),
|
||||
UINT64_C(0x761FAC5A4F7DD1D3), UINT64_C(0x6BF126046D51700F),
|
||||
UINT64_C(0xD50CC36F92F31BFB), UINT64_C(0xC8E24931B0DFBA27),
|
||||
UINT64_C(0xEED1D7D3D6AA5843), UINT64_C(0xF33F5D8DF486F99F),
|
||||
UINT64_C(0xA2B6EA171A419C8B), UINT64_C(0xBF586049386D3D57),
|
||||
UINT64_C(0x996BFEAB5E18DF33), UINT64_C(0x848574F57C347EEF),
|
||||
UINT64_C(0x76489B570E52165E), UINT64_C(0x6BA611092C7EB782),
|
||||
UINT64_C(0x4D958FEB4A0B55E6), UINT64_C(0x507B05B56827F43A),
|
||||
UINT64_C(0x01F2B22F86E0912E), UINT64_C(0x1C1C3871A4CC30F2),
|
||||
UINT64_C(0x3A2FA693C2B9D296), UINT64_C(0x27C12CCDE095734A),
|
||||
UINT64_C(0x993CC9A61F3718BE), UINT64_C(0x84D243F83D1BB962),
|
||||
UINT64_C(0xA2E1DD1A5B6E5B06), UINT64_C(0xBF0F57447942FADA),
|
||||
UINT64_C(0xEE86E0DE97859FCE), UINT64_C(0xF3686A80B5A93E12),
|
||||
UINT64_C(0xD55BF462D3DCDC76), UINT64_C(0xC8B57E3CF1F07DAA),
|
||||
UINT64_C(0xD6E9A7309F3239A7), UINT64_C(0xCB072D6EBD1E987B),
|
||||
UINT64_C(0xED34B38CDB6B7A1F), UINT64_C(0xF0DA39D2F947DBC3),
|
||||
UINT64_C(0xA1538E481780BED7), UINT64_C(0xBCBD041635AC1F0B),
|
||||
UINT64_C(0x9A8E9AF453D9FD6F), UINT64_C(0x876010AA71F55CB3),
|
||||
UINT64_C(0x399DF5C18E573747), UINT64_C(0x24737F9FAC7B969B),
|
||||
UINT64_C(0x0240E17DCA0E74FF), UINT64_C(0x1FAE6B23E822D523),
|
||||
UINT64_C(0x4E27DCB906E5B037), UINT64_C(0x53C956E724C911EB),
|
||||
UINT64_C(0x75FAC80542BCF38F), UINT64_C(0x6814425B60905253),
|
||||
UINT64_C(0x9AD9ADF912F63AE2), UINT64_C(0x873727A730DA9B3E),
|
||||
UINT64_C(0xA104B94556AF795A), UINT64_C(0xBCEA331B7483D886),
|
||||
UINT64_C(0xED6384819A44BD92), UINT64_C(0xF08D0EDFB8681C4E),
|
||||
UINT64_C(0xD6BE903DDE1DFE2A), UINT64_C(0xCB501A63FC315FF6),
|
||||
UINT64_C(0x75ADFF0803933402), UINT64_C(0x6843755621BF95DE),
|
||||
UINT64_C(0x4E70EBB447CA77BA), UINT64_C(0x539E61EA65E6D666),
|
||||
UINT64_C(0x0217D6708B21B372), UINT64_C(0x1FF95C2EA90D12AE),
|
||||
UINT64_C(0x39CAC2CCCF78F0CA), UINT64_C(0x24244892ED545116),
|
||||
UINT64_C(0x4E89B2A384BA3F2D), UINT64_C(0x536738FDA6969EF1),
|
||||
UINT64_C(0x7554A61FC0E37C95), UINT64_C(0x68BA2C41E2CFDD49),
|
||||
UINT64_C(0x39339BDB0C08B85D), UINT64_C(0x24DD11852E241981),
|
||||
UINT64_C(0x02EE8F674851FBE5), UINT64_C(0x1F0005396A7D5A39),
|
||||
UINT64_C(0xA1FDE05295DF31CD), UINT64_C(0xBC136A0CB7F39011),
|
||||
UINT64_C(0x9A20F4EED1867275), UINT64_C(0x87CE7EB0F3AAD3A9),
|
||||
UINT64_C(0xD647C92A1D6DB6BD), UINT64_C(0xCBA943743F411761),
|
||||
UINT64_C(0xED9ADD965934F505), UINT64_C(0xF07457C87B1854D9),
|
||||
UINT64_C(0x02B9B86A097E3C68), UINT64_C(0x1F5732342B529DB4),
|
||||
UINT64_C(0x3964ACD64D277FD0), UINT64_C(0x248A26886F0BDE0C),
|
||||
UINT64_C(0x7503911281CCBB18), UINT64_C(0x68ED1B4CA3E01AC4),
|
||||
UINT64_C(0x4EDE85AEC595F8A0), UINT64_C(0x53300FF0E7B9597C),
|
||||
UINT64_C(0xEDCDEA9B181B3288), UINT64_C(0xF02360C53A379354),
|
||||
UINT64_C(0xD610FE275C427130), UINT64_C(0xCBFE74797E6ED0EC),
|
||||
UINT64_C(0x9A77C3E390A9B5F8), UINT64_C(0x879949BDB2851424),
|
||||
UINT64_C(0xA1AAD75FD4F0F640), UINT64_C(0xBC445D01F6DC579C),
|
||||
UINT64_C(0x74F1233D072C2A36), UINT64_C(0x691FA96325008BEA),
|
||||
UINT64_C(0x4F2C37814375698E), UINT64_C(0x52C2BDDF6159C852),
|
||||
UINT64_C(0x034B0A458F9EAD46), UINT64_C(0x1EA5801BADB20C9A),
|
||||
UINT64_C(0x38961EF9CBC7EEFE), UINT64_C(0x257894A7E9EB4F22),
|
||||
UINT64_C(0x9B8571CC164924D6), UINT64_C(0x866BFB923465850A),
|
||||
UINT64_C(0xA05865705210676E), UINT64_C(0xBDB6EF2E703CC6B2),
|
||||
UINT64_C(0xEC3F58B49EFBA3A6), UINT64_C(0xF1D1D2EABCD7027A),
|
||||
UINT64_C(0xD7E24C08DAA2E01E), UINT64_C(0xCA0CC656F88E41C2),
|
||||
UINT64_C(0x38C129F48AE82973), UINT64_C(0x252FA3AAA8C488AF),
|
||||
UINT64_C(0x031C3D48CEB16ACB), UINT64_C(0x1EF2B716EC9DCB17),
|
||||
UINT64_C(0x4F7B008C025AAE03), UINT64_C(0x52958AD220760FDF),
|
||||
UINT64_C(0x74A614304603EDBB), UINT64_C(0x69489E6E642F4C67),
|
||||
UINT64_C(0xD7B57B059B8D2793), UINT64_C(0xCA5BF15BB9A1864F),
|
||||
UINT64_C(0xEC686FB9DFD4642B), UINT64_C(0xF186E5E7FDF8C5F7),
|
||||
UINT64_C(0xA00F527D133FA0E3), UINT64_C(0xBDE1D8233113013F),
|
||||
UINT64_C(0x9BD246C15766E35B), UINT64_C(0x863CCC9F754A4287),
|
||||
UINT64_C(0xEC9136AE1CA42CBC), UINT64_C(0xF17FBCF03E888D60),
|
||||
UINT64_C(0xD74C221258FD6F04), UINT64_C(0xCAA2A84C7AD1CED8),
|
||||
UINT64_C(0x9B2B1FD69416ABCC), UINT64_C(0x86C59588B63A0A10),
|
||||
UINT64_C(0xA0F60B6AD04FE874), UINT64_C(0xBD188134F26349A8),
|
||||
UINT64_C(0x03E5645F0DC1225C), UINT64_C(0x1E0BEE012FED8380),
|
||||
UINT64_C(0x383870E3499861E4), UINT64_C(0x25D6FABD6BB4C038),
|
||||
UINT64_C(0x745F4D278573A52C), UINT64_C(0x69B1C779A75F04F0),
|
||||
UINT64_C(0x4F82599BC12AE694), UINT64_C(0x526CD3C5E3064748),
|
||||
UINT64_C(0xA0A13C6791602FF9), UINT64_C(0xBD4FB639B34C8E25),
|
||||
UINT64_C(0x9B7C28DBD5396C41), UINT64_C(0x8692A285F715CD9D),
|
||||
UINT64_C(0xD71B151F19D2A889), UINT64_C(0xCAF59F413BFE0955),
|
||||
UINT64_C(0xECC601A35D8BEB31), UINT64_C(0xF1288BFD7FA74AED),
|
||||
UINT64_C(0x4FD56E9680052119), UINT64_C(0x523BE4C8A22980C5),
|
||||
UINT64_C(0x74087A2AC45C62A1), UINT64_C(0x69E6F074E670C37D),
|
||||
UINT64_C(0x386F47EE08B7A669), UINT64_C(0x2581CDB02A9B07B5),
|
||||
UINT64_C(0x03B253524CEEE5D1), UINT64_C(0x1E5CD90C6EC2440D)
|
||||
}
|
||||
};
|
|
@ -0,0 +1,56 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc64_tablegen.c
|
||||
/// \brief Generates CRC64 crc64_table.c
|
||||
///
|
||||
/// Compiling: gcc -std=c99 -o crc64_tablegen crc64_tablegen.c crc64_init.c
|
||||
/// Add -DWORDS_BIGENDIAN to generate big endian table.
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
extern void lzma_crc64_init(void);
|
||||
|
||||
extern uint64_t lzma_crc64_table[4][256];
|
||||
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
lzma_crc64_init();
|
||||
|
||||
printf("/* This file has been automatically generated by "
|
||||
"crc64_tablegen.c. */\n\n"
|
||||
"#include <inttypes.h>\n\n"
|
||||
"const uint64_t lzma_crc64_table[4][256] = {\n\t{");
|
||||
|
||||
for (size_t s = 0; s < 4; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
if ((b % 2) == 0)
|
||||
printf("\n\t\t");
|
||||
|
||||
printf("UINT64_C(0x%016" PRIX64 ")",
|
||||
lzma_crc64_table[s][b]);
|
||||
|
||||
if (b != 255)
|
||||
printf(", ");
|
||||
}
|
||||
|
||||
if (s == 3)
|
||||
printf("\n\t}\n};\n");
|
||||
else
|
||||
printf("\n\t}, {");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
/*
|
||||
* Speed-optimized CRC64 using slicing-by-four algorithm
|
||||
* Instruction set: i386
|
||||
* Optimized for: i686
|
||||
*
|
||||
* This code has been put into the public domain by its authors:
|
||||
* Igor Pavlov <http://7-zip.org/>
|
||||
* Lasse Collin <lasse.collin@tukaani.org>
|
||||
*
|
||||
* This code needs lzma_crc64_table, which can be created using the
|
||||
* following C code:
|
||||
|
||||
uint64_t lzma_crc64_table[4][256];
|
||||
|
||||
void
|
||||
init_table(void)
|
||||
{
|
||||
static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42);
|
||||
|
||||
for (size_t s = 0; s < 4; ++s) {
|
||||
for (size_t b = 0; b < 256; ++b) {
|
||||
uint64_t r = s == 0 ? b : lzma_crc64_table[s - 1][b];
|
||||
|
||||
for (size_t i = 0; i < 8; ++i) {
|
||||
if (r & 1)
|
||||
r = (r >> 1) ^ poly64;
|
||||
else
|
||||
r >>= 1;
|
||||
}
|
||||
|
||||
lzma_crc64_table[s][b] = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
* The prototype of the CRC64 function:
|
||||
* extern uint64_t lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc);
|
||||
*/
|
||||
|
||||
.text
|
||||
.global lzma_crc64
|
||||
.type lzma_crc64, @function
|
||||
|
||||
.align 16
|
||||
lzma_crc64:
|
||||
/*
|
||||
* Register usage:
|
||||
* %eax crc LSB
|
||||
* %edx crc MSB
|
||||
* %esi buf
|
||||
* %edi size or buf + size
|
||||
* %ebx lzma_crc64_table
|
||||
* %ebp Table index
|
||||
* %ecx Temporary
|
||||
*/
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
pushl %ebp
|
||||
movl 0x14(%esp), %esi /* buf */
|
||||
movl 0x18(%esp), %edi /* size */
|
||||
movl 0x1C(%esp), %eax /* crc LSB */
|
||||
movl 0x20(%esp), %edx /* crc MSB */
|
||||
|
||||
/*
|
||||
* Store the address of lzma_crc64_table to %ebx. This is needed to
|
||||
* get position-independent code (PIC).
|
||||
*/
|
||||
call .L_PIC
|
||||
.L_PIC:
|
||||
popl %ebx
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-.L_PIC], %ebx
|
||||
movl lzma_crc64_table@GOT(%ebx), %ebx
|
||||
|
||||
/* Complement the initial value. */
|
||||
notl %eax
|
||||
notl %edx
|
||||
|
||||
.L_align:
|
||||
/*
|
||||
* Check if there is enough input to use slicing-by-four.
|
||||
* We need eight bytes, because the loop pre-reads four bytes.
|
||||
*/
|
||||
cmpl $8, %edi
|
||||
jl .L_rest
|
||||
|
||||
/* Check if we have reached alignment of four bytes. */
|
||||
testl $3, %esi
|
||||
jz .L_slice
|
||||
|
||||
/* Calculate CRC of the next input byte. */
|
||||
movzbl (%esi), %ebp
|
||||
incl %esi
|
||||
movzbl %al, %ecx
|
||||
xorl %ecx, %ebp
|
||||
shrdl $8, %edx, %eax
|
||||
xorl (%ebx, %ebp, 8), %eax
|
||||
shrl $8, %edx
|
||||
xorl 4(%ebx, %ebp, 8), %edx
|
||||
decl %edi
|
||||
jmp .L_align
|
||||
|
||||
.L_slice:
|
||||
/*
|
||||
* If we get here, there's at least eight bytes of aligned input
|
||||
* available. Make %edi multiple of four bytes. Store the possible
|
||||
* remainder over the "size" variable in the argument stack.
|
||||
*/
|
||||
movl %edi, 0x18(%esp)
|
||||
andl $-4, %edi
|
||||
subl %edi, 0x18(%esp)
|
||||
|
||||
/*
|
||||
* Let %edi be buf + size - 4 while running the main loop. This way
|
||||
* we can compare for equality to determine when exit the loop.
|
||||
*/
|
||||
addl %esi, %edi
|
||||
subl $4, %edi
|
||||
|
||||
/* Read in the first four aligned bytes. */
|
||||
movl (%esi), %ecx
|
||||
|
||||
.L_loop:
|
||||
xorl %eax, %ecx
|
||||
movzbl %cl, %ebp
|
||||
movl 0x1800(%ebx, %ebp, 8), %eax
|
||||
xorl %edx, %eax
|
||||
movl 0x1804(%ebx, %ebp, 8), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl 0x1000(%ebx, %ebp, 8), %eax
|
||||
xorl 0x1004(%ebx, %ebp, 8), %edx
|
||||
shrl $16, %ecx
|
||||
movzbl %cl, %ebp
|
||||
xorl 0x0800(%ebx, %ebp, 8), %eax
|
||||
xorl 0x0804(%ebx, %ebp, 8), %edx
|
||||
movzbl %ch, %ebp
|
||||
addl $4, %esi
|
||||
xorl (%ebx, %ebp, 8), %eax
|
||||
xorl 4(%ebx, %ebp, 8), %edx
|
||||
|
||||
/* Check for end of aligned input. */
|
||||
cmpl %edi, %esi
|
||||
|
||||
/*
|
||||
* Copy the next input byte to %ecx. It is slightly faster to
|
||||
* read it here than at the top of the loop.
|
||||
*/
|
||||
movl (%esi), %ecx
|
||||
jl .L_loop
|
||||
|
||||
/*
|
||||
* Process the remaining four bytes, which we have already
|
||||
* copied to %ecx.
|
||||
*/
|
||||
xorl %eax, %ecx
|
||||
movzbl %cl, %ebp
|
||||
movl 0x1800(%ebx, %ebp, 8), %eax
|
||||
xorl %edx, %eax
|
||||
movl 0x1804(%ebx, %ebp, 8), %edx
|
||||
movzbl %ch, %ebp
|
||||
xorl 0x1000(%ebx, %ebp, 8), %eax
|
||||
xorl 0x1004(%ebx, %ebp, 8), %edx
|
||||
shrl $16, %ecx
|
||||
movzbl %cl, %ebp
|
||||
xorl 0x0800(%ebx, %ebp, 8), %eax
|
||||
xorl 0x0804(%ebx, %ebp, 8), %edx
|
||||
movzbl %ch, %ebp
|
||||
addl $4, %esi
|
||||
xorl (%ebx, %ebp, 8), %eax
|
||||
xorl 4(%ebx, %ebp, 8), %edx
|
||||
|
||||
/* Copy the number of remaining bytes to %edi. */
|
||||
movl 0x18(%esp), %edi
|
||||
|
||||
.L_rest:
|
||||
/* Check for end of input. */
|
||||
testl %edi, %edi
|
||||
jz .L_return
|
||||
|
||||
/* Calculate CRC of the next input byte. */
|
||||
movzbl (%esi), %ebp
|
||||
incl %esi
|
||||
movzbl %al, %ecx
|
||||
xorl %ecx, %ebp
|
||||
shrdl $8, %edx, %eax
|
||||
xorl (%ebx, %ebp, 8), %eax
|
||||
shrl $8, %edx
|
||||
xorl 4(%ebx, %ebp, 8), %edx
|
||||
decl %edi
|
||||
jmp .L_rest
|
||||
|
||||
.L_return:
|
||||
/* Complement the final value. */
|
||||
notl %eax
|
||||
notl %edx
|
||||
|
||||
popl %ebp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
.size lzma_crc32, .-lzma_crc32
|
|
@ -0,0 +1,33 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file crc_macros
|
||||
/// \brief Some endian-dependent macros for CRC32 and CRC64
|
||||
//
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
# include "check_byteswap.h"
|
||||
|
||||
# define A(x) ((x) >> 24)
|
||||
# define B(x) (((x) >> 16) & 0xFF)
|
||||
# define C(x) (((x) >> 8) & 0xFF)
|
||||
# define D(x) ((x) & 0xFF)
|
||||
|
||||
# define S8(x) ((x) << 8)
|
||||
# define S32(x) ((x) << 32)
|
||||
|
||||
#else
|
||||
# define A(x) ((x) & 0xFF)
|
||||
# define B(x) (((x) >> 8) & 0xFF)
|
||||
# define C(x) (((x) >> 16) & 0xFF)
|
||||
# define D(x) ((x) >> 24)
|
||||
|
||||
# define S8(x) ((x) >> 8)
|
||||
# define S32(x) ((x) >> 32)
|
||||
#endif
|
|
@ -0,0 +1,203 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file sha256.c
|
||||
/// \brief SHA256
|
||||
//
|
||||
// Based on the public domain code found from Wei Dai's Crypto++ library
|
||||
// version 5.5.1: http://www.cryptopp.com/
|
||||
// This code has been put into the public domain.
|
||||
//
|
||||
/// \todo Crypto++ has x86 ASM optimizations. They use SSE so if they
|
||||
/// are imported to liblzma, SSE instructions need to be used
|
||||
/// conditionally to keep the code working on older boxes.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "check.h"
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
# include "check_byteswap.h"
|
||||
#endif
|
||||
|
||||
// At least on x86, GCC is able to optimize this to a rotate instruction.
|
||||
#define rotr_32(num, amount) ((num) >> (amount) | (num) << (32 - (amount)))
|
||||
|
||||
#define blk0(i) (W[i] = data[i])
|
||||
#define blk2(i) (W[i & 15] += s1(W[(i - 2) & 15]) + W[(i - 7) & 15] \
|
||||
+ s0(W[(i - 15) & 15]))
|
||||
|
||||
#define Ch(x, y, z) (z ^ (x & (y ^ z)))
|
||||
#define Maj(x, y, z) ((x & y) | (z & (x | y)))
|
||||
|
||||
#define a(i) T[(0 - i) & 7]
|
||||
#define b(i) T[(1 - i) & 7]
|
||||
#define c(i) T[(2 - i) & 7]
|
||||
#define d(i) T[(3 - i) & 7]
|
||||
#define e(i) T[(4 - i) & 7]
|
||||
#define f(i) T[(5 - i) & 7]
|
||||
#define g(i) T[(6 - i) & 7]
|
||||
#define h(i) T[(7 - i) & 7]
|
||||
|
||||
#define R(i) \
|
||||
h(i) += S1(e(i)) + Ch(e(i), f(i), g(i)) + SHA256_K[i + j] \
|
||||
+ (j ? blk2(i) : blk0(i)); \
|
||||
d(i) += h(i); \
|
||||
h(i) += S0(a(i)) + Maj(a(i), b(i), c(i))
|
||||
|
||||
#define S0(x) (rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22))
|
||||
#define S1(x) (rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25))
|
||||
#define s0(x) (rotr_32(x, 7) ^ rotr_32(x, 18) ^ (x >> 3))
|
||||
#define s1(x) (rotr_32(x, 17) ^ rotr_32(x, 19) ^ (x >> 10))
|
||||
|
||||
|
||||
static const uint32_t SHA256_K[64] = {
|
||||
0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
|
||||
0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
|
||||
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
|
||||
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
|
||||
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
|
||||
0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
|
||||
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
|
||||
0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
|
||||
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
|
||||
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
|
||||
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
|
||||
0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
|
||||
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
|
||||
0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
|
||||
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
|
||||
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
transform(uint32_t state[static 8], const uint32_t data[static 16])
|
||||
{
|
||||
uint32_t W[16];
|
||||
uint32_t T[8];
|
||||
|
||||
// Copy state[] to working vars.
|
||||
memcpy(T, state, sizeof(T));
|
||||
|
||||
// 64 operations, partially loop unrolled
|
||||
for (unsigned int j = 0; j < 64; j += 16) {
|
||||
R( 0); R( 1); R( 2); R( 3);
|
||||
R( 4); R( 5); R( 6); R( 7);
|
||||
R( 8); R( 9); R(10); R(11);
|
||||
R(12); R(13); R(14); R(15);
|
||||
}
|
||||
|
||||
// Add the working vars back into state[].
|
||||
state[0] += a(0);
|
||||
state[1] += b(0);
|
||||
state[2] += c(0);
|
||||
state[3] += d(0);
|
||||
state[4] += e(0);
|
||||
state[5] += f(0);
|
||||
state[6] += g(0);
|
||||
state[7] += h(0);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
process(lzma_sha256 *sha256)
|
||||
{
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
transform(sha256->state, (uint32_t *)(sha256->buffer));
|
||||
|
||||
#else
|
||||
uint32_t data[16];
|
||||
|
||||
for (size_t i = 0; i < 16; ++i)
|
||||
data[i] = bswap_32(*((uint32_t*)(sha256->buffer) + i));
|
||||
|
||||
transform(sha256->state, data);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_sha256_init(lzma_sha256 *sha256)
|
||||
{
|
||||
static const uint32_t s[8] = {
|
||||
0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
|
||||
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19,
|
||||
};
|
||||
|
||||
memcpy(sha256->state, s, sizeof(s));
|
||||
sha256->size = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_sha256_update(const uint8_t *buf, size_t size, lzma_sha256 *sha256)
|
||||
{
|
||||
// Copy the input data into a properly aligned temporary buffer.
|
||||
// This way we can be called with arbitrarily sized buffers
|
||||
// (no need to be multiple of 64 bytes), and the code works also
|
||||
// on architectures that don't allow unaligned memory access.
|
||||
while (size > 0) {
|
||||
const size_t copy_start = sha256->size & 0x3F;
|
||||
size_t copy_size = 64 - copy_start;
|
||||
if (copy_size > size)
|
||||
copy_size = size;
|
||||
|
||||
memcpy(sha256->buffer + copy_start, buf, copy_size);
|
||||
|
||||
buf += copy_size;
|
||||
size -= copy_size;
|
||||
sha256->size += copy_size;
|
||||
|
||||
if ((sha256->size & 0x3F) == 0)
|
||||
process(sha256);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_sha256_finish(lzma_sha256 *sha256)
|
||||
{
|
||||
// Add padding as described in RFC 3174 (it describes SHA-1 but
|
||||
// the same padding style is used for SHA-256 too).
|
||||
size_t pos = sha256->size & 0x3F;
|
||||
sha256->buffer[pos++] = 0x80;
|
||||
|
||||
while (pos != 64 - 8) {
|
||||
if (pos == 64) {
|
||||
process(sha256);
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
sha256->buffer[pos++] = 0x00;
|
||||
}
|
||||
|
||||
// Convert the message size from bytes to bits.
|
||||
sha256->size *= 8;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
*(uint64_t *)(sha256->buffer + 64 - 8) = sha256->size;
|
||||
#else
|
||||
*(uint64_t *)(sha256->buffer + 64 - 8) = bswap_64(sha256->size);
|
||||
#endif
|
||||
|
||||
process(sha256);
|
||||
|
||||
for (size_t i = 0; i < 8; ++i)
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
((uint32_t *)(sha256->buffer))[i] = sha256->state[i];
|
||||
#else
|
||||
((uint32_t *)(sha256->buffer))[i] = bswap_32(sha256->state[i]);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
##
|
||||
## Copyright (C) 2007 Lasse Collin
|
||||
##
|
||||
## 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.
|
||||
##
|
||||
|
||||
noinst_LTLIBRARIES = libcommon.la
|
||||
libcommon_la_CPPFLAGS = \
|
||||
-I@top_srcdir@/src/liblzma/api \
|
||||
-I@top_srcdir@/src/liblzma/check \
|
||||
-I@top_srcdir@/src/liblzma/lz \
|
||||
-I@top_srcdir@/src/liblzma/lzma \
|
||||
-I@top_srcdir@/src/liblzma/simple \
|
||||
-I@top_srcdir@/src/liblzma/subblock \
|
||||
-I@top_srcdir@/src/liblzma/rangecoder
|
||||
libcommon_la_SOURCES = \
|
||||
common.h \
|
||||
sysdefs.h \
|
||||
allocator.c \
|
||||
block_private.h \
|
||||
extra.c \
|
||||
features.c \
|
||||
index.c \
|
||||
info.c \
|
||||
init.c \
|
||||
memory_limitter.c \
|
||||
memory_usage.c \
|
||||
next_coder.c \
|
||||
raw_common.c \
|
||||
raw_common.h \
|
||||
code.c \
|
||||
version.c
|
||||
|
||||
if COND_FILTER_COPY
|
||||
libcommon_la_SOURCES += \
|
||||
copy_coder.c \
|
||||
copy_coder.h
|
||||
endif
|
||||
|
||||
if COND_FILTER_DELTA
|
||||
libcommon_la_SOURCES += \
|
||||
delta_coder.c \
|
||||
delta_coder.h
|
||||
endif
|
||||
|
||||
if COND_MAIN_ENCODER
|
||||
libcommon_la_SOURCES += \
|
||||
alignment.c \
|
||||
auto_decoder.c \
|
||||
alone_encoder.c \
|
||||
block_encoder.c \
|
||||
block_encoder.h \
|
||||
block_header_encoder.c \
|
||||
filter_flags_encoder.c \
|
||||
init_encoder.c \
|
||||
metadata_encoder.c \
|
||||
metadata_encoder.h \
|
||||
raw_encoder.c \
|
||||
raw_encoder.h \
|
||||
stream_common.c \
|
||||
stream_common.h \
|
||||
stream_encoder_single.c \
|
||||
stream_encoder_multi.c \
|
||||
stream_flags_encoder.c \
|
||||
vli_encoder.c
|
||||
endif
|
||||
|
||||
if COND_MAIN_DECODER
|
||||
libcommon_la_SOURCES += \
|
||||
alone_decoder.c \
|
||||
alone_decoder.h \
|
||||
block_decoder.c \
|
||||
block_decoder.h \
|
||||
block_header_decoder.c \
|
||||
filter_flags_decoder.c \
|
||||
init_decoder.c \
|
||||
metadata_decoder.c \
|
||||
metadata_decoder.h \
|
||||
raw_decoder.c \
|
||||
raw_decoder.h \
|
||||
stream_decoder.c \
|
||||
stream_flags_decoder.c \
|
||||
stream_flags_decoder.h \
|
||||
vli_decoder.c \
|
||||
vli_reverse_decoder.c
|
||||
endif
|
|
@ -0,0 +1,118 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file alignment.c
|
||||
/// \brief Calculates preferred alignments of different filters
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
extern LZMA_API uint32_t
|
||||
lzma_alignment_input(const lzma_options_filter *filters, uint32_t guess)
|
||||
{
|
||||
for (size_t i = 0; filters[i].id != LZMA_VLI_VALUE_UNKNOWN; ++i) {
|
||||
switch (filters[i].id) {
|
||||
case LZMA_FILTER_COPY:
|
||||
case LZMA_FILTER_DELTA:
|
||||
// The same as the input, check the next filter.
|
||||
continue;
|
||||
|
||||
case LZMA_FILTER_SUBBLOCK:
|
||||
if (filters[i].options == NULL)
|
||||
return LZMA_SUBBLOCK_ALIGNMENT_DEFAULT;
|
||||
else
|
||||
return ((const lzma_options_subblock *)(
|
||||
filters[i].options))->alignment;
|
||||
|
||||
case LZMA_FILTER_X86:
|
||||
return 1;
|
||||
|
||||
case LZMA_FILTER_ARMTHUMB:
|
||||
return 2;
|
||||
|
||||
case LZMA_FILTER_POWERPC:
|
||||
case LZMA_FILTER_ARM:
|
||||
case LZMA_FILTER_SPARC:
|
||||
return 4;
|
||||
|
||||
case LZMA_FILTER_IA64:
|
||||
return 16;
|
||||
|
||||
case LZMA_FILTER_LZMA: {
|
||||
const lzma_options_lzma *lzma = filters[i].options;
|
||||
return 1 << MAX(lzma->pos_bits,
|
||||
lzma->literal_pos_bits);
|
||||
}
|
||||
|
||||
default:
|
||||
return UINT32_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
return guess;
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API uint32_t
|
||||
lzma_alignment_output(const lzma_options_filter *filters, uint32_t guess)
|
||||
{
|
||||
// Check if there is only an implicit Copy filter.
|
||||
if (filters[0].id == LZMA_VLI_VALUE_UNKNOWN)
|
||||
return guess;
|
||||
|
||||
// Find the last filter in the chain.
|
||||
size_t i = 0;
|
||||
while (filters[i + 1].id != LZMA_VLI_VALUE_UNKNOWN)
|
||||
++i;
|
||||
|
||||
do {
|
||||
switch (filters[i].id) {
|
||||
case LZMA_FILTER_COPY:
|
||||
case LZMA_FILTER_DELTA:
|
||||
// It's the same as the input alignment, so
|
||||
// check the next filter.
|
||||
continue;
|
||||
|
||||
case LZMA_FILTER_SUBBLOCK:
|
||||
if (filters[i].options == NULL)
|
||||
return LZMA_SUBBLOCK_ALIGNMENT_DEFAULT;
|
||||
else
|
||||
return ((const lzma_options_subblock *)(
|
||||
filters[i].options))->alignment;
|
||||
|
||||
case LZMA_FILTER_X86:
|
||||
case LZMA_FILTER_LZMA:
|
||||
return 1;
|
||||
|
||||
case LZMA_FILTER_ARMTHUMB:
|
||||
return 2;
|
||||
|
||||
case LZMA_FILTER_POWERPC:
|
||||
case LZMA_FILTER_ARM:
|
||||
case LZMA_FILTER_SPARC:
|
||||
return 4;
|
||||
|
||||
case LZMA_FILTER_IA64:
|
||||
return 16;
|
||||
|
||||
default:
|
||||
return UINT32_MAX;
|
||||
}
|
||||
} while (i-- != 0);
|
||||
|
||||
// If we get here, we have the same alignment as the input data.
|
||||
return guess;
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file allocator.c
|
||||
/// \brief Allocating and freeing memory
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#undef lzma_free
|
||||
|
||||
extern void * lzma_attribute((malloc))
|
||||
lzma_alloc(size_t size, lzma_allocator *allocator)
|
||||
{
|
||||
// Some malloc() variants return NULL if called with size == 0.
|
||||
if (size == 0)
|
||||
size = 1;
|
||||
|
||||
void *ptr;
|
||||
|
||||
if (allocator != NULL && allocator->alloc != NULL)
|
||||
ptr = allocator->alloc(allocator->opaque, 1, size);
|
||||
else
|
||||
ptr = malloc(size);
|
||||
|
||||
#if !defined(NDEBUG) && defined(HAVE_MEMSET)
|
||||
// This helps to catch some stupid mistakes.
|
||||
if (ptr != NULL)
|
||||
memset(ptr, 0xFD, size);
|
||||
#endif
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
lzma_free(void *ptr, lzma_allocator *allocator)
|
||||
{
|
||||
if (allocator != NULL && allocator->free != NULL)
|
||||
allocator->free(allocator->opaque, ptr);
|
||||
else
|
||||
free(ptr);
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,197 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file alone_decoder.c
|
||||
/// \brief Decoder for LZMA_Alone files
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "alone_decoder.h"
|
||||
#include "lzma_decoder.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
lzma_next_coder next;
|
||||
|
||||
enum {
|
||||
SEQ_PROPERTIES,
|
||||
SEQ_DICTIONARY_SIZE,
|
||||
SEQ_UNCOMPRESSED_SIZE,
|
||||
SEQ_CODER_INIT,
|
||||
SEQ_CODE,
|
||||
} sequence;
|
||||
|
||||
size_t pos;
|
||||
|
||||
lzma_options_alone options;
|
||||
};
|
||||
|
||||
|
||||
static lzma_ret
|
||||
alone_decode(lzma_coder *coder,
|
||||
lzma_allocator *allocator lzma_attribute((unused)),
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out,
|
||||
size_t *restrict out_pos, size_t out_size,
|
||||
lzma_action action)
|
||||
{
|
||||
while (*out_pos < out_size
|
||||
&& (coder->sequence == SEQ_CODE || *in_pos < in_size))
|
||||
switch (coder->sequence) {
|
||||
case SEQ_PROPERTIES:
|
||||
if (lzma_lzma_decode_properties(
|
||||
&coder->options.lzma, in[*in_pos]))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->sequence = SEQ_DICTIONARY_SIZE;
|
||||
++*in_pos;
|
||||
break;
|
||||
|
||||
case SEQ_DICTIONARY_SIZE:
|
||||
coder->options.lzma.dictionary_size
|
||||
|= (size_t)(in[*in_pos]) << (coder->pos * 8);
|
||||
|
||||
if (++coder->pos == 4) {
|
||||
// A hack to ditch tons of false positives: We allow
|
||||
// only dictionary sizes that are a power of two.
|
||||
// LZMA_Alone didn't create other kinds of files,
|
||||
// although it's not impossible that files with
|
||||
// other dictionary sizes exist. Well, if someone
|
||||
// complains, this will be reconsidered.
|
||||
size_t count = 0;
|
||||
for (size_t i = 0; i < 32; ++i)
|
||||
if (coder->options.lzma.dictionary_size
|
||||
& (UINT32_C(1) << i))
|
||||
++count;
|
||||
|
||||
if (count > 1)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
}
|
||||
|
||||
++*in_pos;
|
||||
break;
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE:
|
||||
coder->options.uncompressed_size
|
||||
|= (lzma_vli)(in[*in_pos]) << (coder->pos * 8);
|
||||
|
||||
if (++coder->pos == 8) {
|
||||
// Another hack to ditch false positives: Assume that
|
||||
// if the uncompressed size is known, it must be less
|
||||
// than 256 GiB. Again, if someone complains, this
|
||||
// will be reconsidered.
|
||||
if (coder->options.uncompressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN
|
||||
&& coder->options.uncompressed_size
|
||||
>= (LZMA_VLI_C(1) << 38))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_CODER_INIT;
|
||||
}
|
||||
|
||||
++*in_pos;
|
||||
break;
|
||||
|
||||
case SEQ_CODER_INIT: {
|
||||
// Two is enough because there won't be implicit filters.
|
||||
lzma_filter_info filters[2] = {
|
||||
{
|
||||
.init = &lzma_lzma_decoder_init,
|
||||
.options = &coder->options.lzma,
|
||||
.uncompressed_size = coder->options
|
||||
.uncompressed_size,
|
||||
}, {
|
||||
.init = NULL,
|
||||
}
|
||||
};
|
||||
|
||||
const lzma_ret ret = lzma_next_filter_init(&coder->next,
|
||||
allocator, filters);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
coder->sequence = SEQ_CODE;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_CODE: {
|
||||
return coder->next.code(coder->next.coder,
|
||||
allocator, in, in_pos, in_size,
|
||||
out, out_pos, out_size, action);
|
||||
}
|
||||
|
||||
default:
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
alone_decoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->next, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static lzma_ret
|
||||
alone_decoder_init(lzma_next_coder *next, lzma_allocator *allocator)
|
||||
{
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &alone_decode;
|
||||
next->end = &alone_decoder_end;
|
||||
next->coder->next = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
next->coder->sequence = SEQ_PROPERTIES;
|
||||
next->coder->pos = 0;
|
||||
next->coder->options.lzma.dictionary_size = 0;
|
||||
next->coder->options.uncompressed_size = 0;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
extern lzma_ret
|
||||
lzma_alone_decoder_init(lzma_next_coder *next, lzma_allocator *allocator)
|
||||
{
|
||||
// We need to use _init2 because we don't pass any varadic args.
|
||||
lzma_next_coder_init2(next, allocator, alone_decoder_init,
|
||||
alone_decoder_init, allocator);
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_alone_decoder(lzma_stream *strm)
|
||||
{
|
||||
lzma_next_strm_init2(strm, alone_decoder_init,
|
||||
alone_decoder_init, strm->allocator);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file alone_decoder.h
|
||||
/// \brief Decoder for LZMA_Alone files
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
extern lzma_ret lzma_alone_decoder_init(
|
||||
lzma_next_coder *next, lzma_allocator *allocator);
|
|
@ -0,0 +1,167 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file alone_decoder.c
|
||||
/// \brief Decoder for LZMA_Alone files
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
#include "lzma_encoder.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
lzma_next_coder next;
|
||||
|
||||
enum {
|
||||
SEQ_PROPERTIES,
|
||||
SEQ_DICTIONARY_SIZE,
|
||||
SEQ_UNCOMPRESSED_SIZE,
|
||||
SEQ_CODE,
|
||||
} sequence;
|
||||
|
||||
size_t pos;
|
||||
|
||||
lzma_options_alone options;
|
||||
};
|
||||
|
||||
|
||||
static lzma_ret
|
||||
alone_encode(lzma_coder *coder,
|
||||
lzma_allocator *allocator lzma_attribute((unused)),
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out,
|
||||
size_t *restrict out_pos, size_t out_size,
|
||||
lzma_action action)
|
||||
{
|
||||
while (*out_pos < out_size)
|
||||
switch (coder->sequence) {
|
||||
case SEQ_PROPERTIES:
|
||||
if (lzma_lzma_encode_properties(
|
||||
&coder->options.lzma, out + *out_pos)) {
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
coder->sequence = SEQ_DICTIONARY_SIZE;
|
||||
++*out_pos;
|
||||
break;
|
||||
|
||||
case SEQ_DICTIONARY_SIZE:
|
||||
out[*out_pos] = coder->options.lzma.dictionary_size
|
||||
>> (coder->pos * 8);
|
||||
|
||||
if (++coder->pos == 4) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
}
|
||||
|
||||
++*out_pos;
|
||||
break;
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE:
|
||||
out[*out_pos] = coder->options.uncompressed_size
|
||||
>> (coder->pos * 8);
|
||||
|
||||
if (++coder->pos == 8) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_CODE;
|
||||
}
|
||||
|
||||
++*out_pos;
|
||||
break;
|
||||
|
||||
case SEQ_CODE: {
|
||||
return coder->next.code(coder->next.coder,
|
||||
allocator, in, in_pos, in_size,
|
||||
out, out_pos, out_size, action);
|
||||
}
|
||||
|
||||
default:
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
alone_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->next, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// At least for now, this is not used by any internal function.
|
||||
static lzma_ret
|
||||
alone_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
const lzma_options_alone *options)
|
||||
{
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &alone_encode;
|
||||
next->end = &alone_encoder_end;
|
||||
next->coder->next = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
// Initialize the LZMA_Alone coder variables.
|
||||
next->coder->sequence = SEQ_PROPERTIES;
|
||||
next->coder->pos = 0;
|
||||
next->coder->options = *options;
|
||||
|
||||
// Verify uncompressed_size since the other functions assume that
|
||||
// it is valid.
|
||||
if (!lzma_vli_is_valid(next->coder->options.uncompressed_size))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
// Initialize the LZMA encoder.
|
||||
const lzma_filter_info filters[2] = {
|
||||
{
|
||||
.init = &lzma_lzma_encoder_init,
|
||||
.options = &next->coder->options.lzma,
|
||||
.uncompressed_size = next->coder->options
|
||||
.uncompressed_size,
|
||||
}, {
|
||||
.init = NULL,
|
||||
}
|
||||
};
|
||||
|
||||
return lzma_next_filter_init(&next->coder->next, allocator, filters);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
extern lzma_ret
|
||||
lzma_alone_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
const lzma_options_alone *options)
|
||||
{
|
||||
lzma_next_coder_init(alone_encoder_init, next, allocator, options);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_alone_encoder(lzma_stream *strm, const lzma_options_alone *options)
|
||||
{
|
||||
lzma_next_strm_init(strm, alone_encoder_init, options);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
strm->internal->supported_actions[LZMA_FINISH] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file auto_decoder.c
|
||||
/// \brief Autodetect between .lzma Stream and LZMA_Alone formats
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
#include "alone_decoder.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
lzma_next_coder next;
|
||||
|
||||
lzma_extra **header;
|
||||
lzma_extra **footer;
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
static lzma_ret
|
||||
auto_decode(lzma_coder *coder, lzma_allocator *allocator,
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out,
|
||||
size_t *restrict out_pos, size_t out_size, lzma_action action)
|
||||
{
|
||||
if (!coder->initialized) {
|
||||
if (*in_pos >= in_size)
|
||||
return LZMA_OK;
|
||||
|
||||
lzma_ret ret;
|
||||
|
||||
if (in[*in_pos] == 0xFF)
|
||||
ret = lzma_stream_decoder_init(&coder->next, allocator,
|
||||
coder->header, coder->footer);
|
||||
else
|
||||
ret = lzma_alone_decoder_init(&coder->next, allocator);
|
||||
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
coder->initialized = true;
|
||||
}
|
||||
|
||||
return coder->next.code(coder->next.coder, allocator,
|
||||
in, in_pos, in_size, out, out_pos, out_size, action);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
auto_decoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->next, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static lzma_ret
|
||||
auto_decoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
lzma_extra **header, lzma_extra **footer)
|
||||
{
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &auto_decode;
|
||||
next->end = &auto_decoder_end;
|
||||
next->coder->next = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
next->coder->header = header;
|
||||
next->coder->footer = footer;
|
||||
next->coder->initialized = false;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
extern lzma_ret
|
||||
lzma_auto_decoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
lzma_extra **header, lzma_extra **footer)
|
||||
{
|
||||
lzma_next_coder_init(
|
||||
auto_decoder_init, next, allocator, header, footer);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_auto_decoder(lzma_stream *strm, lzma_extra **header, lzma_extra **footer)
|
||||
{
|
||||
lzma_next_strm_init(strm, auto_decoder_init, header, footer);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,405 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_decoder.c
|
||||
/// \brief Decodes .lzma Blocks
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "block_decoder.h"
|
||||
#include "block_private.h"
|
||||
#include "raw_decoder.h"
|
||||
#include "check.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
enum {
|
||||
SEQ_CODE,
|
||||
SEQ_CHECK,
|
||||
SEQ_UNCOMPRESSED_SIZE,
|
||||
SEQ_BACKWARD_SIZE,
|
||||
SEQ_PADDING,
|
||||
SEQ_END,
|
||||
} sequence;
|
||||
|
||||
/// The filters in the chain; initialized with lzma_raw_decoder_init().
|
||||
lzma_next_coder next;
|
||||
|
||||
/// Decoding options; we also write Total Size, Compressed Size, and
|
||||
/// Uncompressed Size back to this structure when the encoding has
|
||||
/// been finished.
|
||||
lzma_options_block *options;
|
||||
|
||||
/// Position in variable-length integers (and in some other places).
|
||||
size_t pos;
|
||||
|
||||
/// Check of the uncompressed data
|
||||
lzma_check check;
|
||||
|
||||
/// Total Size calculated while encoding
|
||||
lzma_vli total_size;
|
||||
|
||||
/// Compressed Size calculated while encoding
|
||||
lzma_vli compressed_size;
|
||||
|
||||
/// Uncompressed Size calculated while encoding
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/// Maximum allowed total_size
|
||||
lzma_vli total_limit;
|
||||
|
||||
/// Maximum allowed uncompressed_size
|
||||
lzma_vli uncompressed_limit;
|
||||
|
||||
/// Temporary location for the Uncompressed Size and Backward Size
|
||||
/// fields in Block Footer.
|
||||
lzma_vli tmp;
|
||||
|
||||
/// Size of the Backward Size field - This is needed so that we
|
||||
/// can verify the Backward Size and still keep updating total_size.
|
||||
size_t size_of_backward_size;
|
||||
};
|
||||
|
||||
|
||||
static lzma_ret
|
||||
update_sequence(lzma_coder *coder)
|
||||
{
|
||||
switch (coder->sequence) {
|
||||
case SEQ_CODE:
|
||||
if (coder->options->check != LZMA_CHECK_NONE) {
|
||||
lzma_check_finish(&coder->check,
|
||||
coder->options->check);
|
||||
coder->sequence = SEQ_CHECK;
|
||||
break;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_CHECK:
|
||||
if (coder->options->has_uncompressed_size_in_footer) {
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE:
|
||||
if (coder->options->has_backward_size) {
|
||||
coder->sequence = SEQ_BACKWARD_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_BACKWARD_SIZE:
|
||||
if (coder->options->handle_padding) {
|
||||
coder->sequence = SEQ_PADDING;
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_PADDING:
|
||||
if (!is_size_valid(coder->total_size,
|
||||
coder->options->total_size)
|
||||
|| !is_size_valid(coder->compressed_size,
|
||||
coder->options->compressed_size)
|
||||
|| !is_size_valid(coder->uncompressed_size,
|
||||
coder->options->uncompressed_size))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
// Copy the values into coder->options. The caller
|
||||
// may use this information to construct Index.
|
||||
coder->options->total_size = coder->total_size;
|
||||
coder->options->compressed_size = coder->compressed_size;
|
||||
coder->options->uncompressed_size = coder->uncompressed_size;
|
||||
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static lzma_ret
|
||||
block_decode(lzma_coder *coder, lzma_allocator *allocator,
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out,
|
||||
size_t *restrict out_pos, size_t out_size, lzma_action action)
|
||||
{
|
||||
// Special case when the Block has only Block Header.
|
||||
if (coder->sequence == SEQ_END)
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
// FIXME: Termination condition should work but could be cleaner.
|
||||
while (*out_pos < out_size && (*in_pos < in_size
|
||||
|| coder->sequence == SEQ_CODE))
|
||||
switch (coder->sequence) {
|
||||
case SEQ_CODE: {
|
||||
const size_t in_start = *in_pos;
|
||||
const size_t out_start = *out_pos;
|
||||
|
||||
lzma_ret ret = coder->next.code(coder->next.coder,
|
||||
allocator, in, in_pos, in_size,
|
||||
out, out_pos, out_size, action);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
const size_t out_used = *out_pos - out_start;
|
||||
|
||||
if (update_size(&coder->total_size, in_used,
|
||||
coder->total_limit)
|
||||
|| update_size(&coder->compressed_size,
|
||||
in_used,
|
||||
coder->options->compressed_size)
|
||||
|| update_size(&coder->uncompressed_size,
|
||||
out_used, coder->uncompressed_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
lzma_check_update(&coder->check, coder->options->check,
|
||||
out + out_start, out_used);
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
ret = update_sequence(coder);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_CHECK:
|
||||
switch (coder->options->check) {
|
||||
case LZMA_CHECK_CRC32:
|
||||
if (((coder->check.crc32 >> (coder->pos * 8))
|
||||
& 0xFF) != in[*in_pos])
|
||||
return LZMA_DATA_ERROR;
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_CRC64:
|
||||
if (((coder->check.crc64 >> (coder->pos * 8))
|
||||
& 0xFF) != in[*in_pos])
|
||||
return LZMA_DATA_ERROR;
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_SHA256:
|
||||
if (coder->check.sha256.buffer[coder->pos]
|
||||
!= in[*in_pos])
|
||||
return LZMA_DATA_ERROR;
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(coder->options->check != LZMA_CHECK_NONE);
|
||||
assert(coder->options->check <= LZMA_CHECK_ID_MAX);
|
||||
break;
|
||||
}
|
||||
|
||||
if (update_size(&coder->total_size, 1, coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
++*in_pos;
|
||||
|
||||
if (++coder->pos == lzma_check_sizes[coder->options->check]) {
|
||||
const lzma_ret ret = update_sequence(coder);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
coder->pos = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE: {
|
||||
const size_t in_start = *in_pos;
|
||||
|
||||
lzma_ret ret = lzma_vli_decode(&coder->tmp,
|
||||
&coder->pos, in, in_pos, in_size);
|
||||
|
||||
if (update_size(&coder->total_size, *in_pos - in_start,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
if (coder->tmp != coder->uncompressed_size)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->pos = 0;
|
||||
coder->tmp = 0;
|
||||
|
||||
ret = update_sequence(coder);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_BACKWARD_SIZE: {
|
||||
const size_t in_start = *in_pos;
|
||||
|
||||
lzma_ret ret = lzma_vli_decode(&coder->tmp,
|
||||
&coder->pos, in, in_pos, in_size);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
|
||||
if (update_size(&coder->total_size, in_used,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->size_of_backward_size += in_used;
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
if (coder->tmp != coder->total_size
|
||||
- coder->size_of_backward_size)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
ret = update_sequence(coder);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_PADDING:
|
||||
if (in[*in_pos] == 0x00) {
|
||||
if (update_size(&coder->total_size, 1,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
++*in_pos;
|
||||
break;
|
||||
}
|
||||
|
||||
return update_sequence(coder);
|
||||
|
||||
default:
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
block_decoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->next, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern lzma_ret
|
||||
lzma_block_decoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
lzma_options_block *options)
|
||||
{
|
||||
// This is pretty similar to lzma_block_encoder_init().
|
||||
// See comments there.
|
||||
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &block_decode;
|
||||
next->end = &block_decoder_end;
|
||||
next->coder->next = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
if (!lzma_vli_is_valid(options->total_size)
|
||||
|| !lzma_vli_is_valid(options->compressed_size)
|
||||
|| !lzma_vli_is_valid(options->uncompressed_size)
|
||||
|| !lzma_vli_is_valid(options->total_size)
|
||||
|| !lzma_vli_is_valid(options->total_limit)
|
||||
|| !lzma_vli_is_valid(options->uncompressed_limit)
|
||||
|| (options->uncompressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN
|
||||
&& options->uncompressed_size
|
||||
> options->uncompressed_limit)
|
||||
|| (options->total_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
&& options->total_size
|
||||
> options->total_limit)
|
||||
|| (!options->has_eopm && options->uncompressed_size
|
||||
== LZMA_VLI_VALUE_UNKNOWN)
|
||||
|| options->header_size > options->total_size
|
||||
|| (options->handle_padding
|
||||
&& (options->has_uncompressed_size_in_footer
|
||||
|| options->has_backward_size)))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
{
|
||||
const lzma_ret ret = lzma_check_init(
|
||||
&next->coder->check, options->check);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!options->has_eopm && options->uncompressed_size == 0) {
|
||||
if (!is_size_valid(0, options->compressed_size))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
if (options->check != LZMA_CHECK_NONE) {
|
||||
lzma_check_finish(&next->coder->check, options->check);
|
||||
next->coder->sequence = SEQ_CHECK;
|
||||
} else if (options->handle_padding) {
|
||||
next->coder->sequence = SEQ_PADDING;
|
||||
} else {
|
||||
next->coder->sequence = SEQ_END;
|
||||
}
|
||||
} else {
|
||||
next->coder->sequence = SEQ_CODE;
|
||||
}
|
||||
|
||||
{
|
||||
const lzma_ret ret = lzma_raw_decoder_init(
|
||||
&next->coder->next, allocator,
|
||||
options->filters, options->has_eopm
|
||||
? LZMA_VLI_VALUE_UNKNOWN
|
||||
: options->uncompressed_size,
|
||||
true);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
}
|
||||
|
||||
next->coder->options = options;
|
||||
next->coder->pos = 0;
|
||||
next->coder->total_size = options->header_size;
|
||||
next->coder->compressed_size = 0;
|
||||
next->coder->uncompressed_size = 0;
|
||||
next->coder->total_limit
|
||||
= MIN(options->total_size, options->total_limit);
|
||||
next->coder->uncompressed_limit = MIN(options->uncompressed_size,
|
||||
options->uncompressed_limit);
|
||||
next->coder->tmp = 0;
|
||||
next->coder->size_of_backward_size = 0;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_block_decoder(lzma_stream *strm, lzma_options_block *options)
|
||||
{
|
||||
lzma_next_strm_init(strm, lzma_block_decoder_init, options);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_decoder.h
|
||||
/// \brief Decodes .lzma Blocks
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LZMA_BLOCK_DECODER_H
|
||||
#define LZMA_BLOCK_DECODER_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
extern lzma_ret lzma_block_decoder_init(lzma_next_coder *next,
|
||||
lzma_allocator *allocator, lzma_options_block *options);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,375 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_encoder.c
|
||||
/// \brief Encodes .lzma Blocks
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "block_encoder.h"
|
||||
#include "block_private.h"
|
||||
#include "raw_encoder.h"
|
||||
#include "check.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
/// The filters in the chain; initialized with lzma_raw_decoder_init().
|
||||
lzma_next_coder next;
|
||||
|
||||
/// Encoding options; we also write Total Size, Compressed Size, and
|
||||
/// Uncompressed Size back to this structure when the encoding has
|
||||
/// been finished.
|
||||
lzma_options_block *options;
|
||||
|
||||
enum {
|
||||
SEQ_CODE,
|
||||
SEQ_CHECK_FINISH,
|
||||
SEQ_CHECK_COPY,
|
||||
SEQ_UNCOMPRESSED_SIZE,
|
||||
SEQ_BACKWARD_SIZE,
|
||||
SEQ_PADDING,
|
||||
} sequence;
|
||||
|
||||
/// Position in .header and .check.
|
||||
size_t pos;
|
||||
|
||||
/// Check of the uncompressed data
|
||||
lzma_check check;
|
||||
|
||||
/// Total Size calculated while encoding
|
||||
lzma_vli total_size;
|
||||
|
||||
/// Compressed Size calculated while encoding
|
||||
lzma_vli compressed_size;
|
||||
|
||||
/// Uncompressed Size calculated while encoding
|
||||
lzma_vli uncompressed_size;
|
||||
|
||||
/// Maximum allowed total_size
|
||||
lzma_vli total_limit;
|
||||
|
||||
/// Maximum allowed uncompressed_size
|
||||
lzma_vli uncompressed_limit;
|
||||
|
||||
/// Backward Size - This is a copy of total_size right before
|
||||
/// the Backward Size field.
|
||||
lzma_vli backward_size;
|
||||
};
|
||||
|
||||
|
||||
static lzma_ret
|
||||
block_encode(lzma_coder *coder, lzma_allocator *allocator,
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out,
|
||||
size_t *restrict out_pos, size_t out_size, lzma_action action)
|
||||
{
|
||||
// Check that our amount of input stays in proper limits.
|
||||
if (coder->options->uncompressed_size != LZMA_VLI_VALUE_UNKNOWN) {
|
||||
if (action == LZMA_FINISH) {
|
||||
if (coder->options->uncompressed_size
|
||||
- coder->uncompressed_size
|
||||
!= (lzma_vli)(in_size - *in_pos))
|
||||
return LZMA_DATA_ERROR;
|
||||
} else {
|
||||
if (coder->options->uncompressed_size
|
||||
- coder->uncompressed_size
|
||||
< (lzma_vli)(in_size - *in_pos))
|
||||
return LZMA_DATA_ERROR;
|
||||
}
|
||||
} else if (LZMA_VLI_VALUE_MAX - coder->uncompressed_size
|
||||
< (lzma_vli)(in_size - *in_pos)) {
|
||||
return LZMA_DATA_ERROR;
|
||||
}
|
||||
|
||||
// Main loop
|
||||
while (*out_pos < out_size
|
||||
&& (*in_pos < in_size || action == LZMA_FINISH))
|
||||
switch (coder->sequence) {
|
||||
case SEQ_CODE: {
|
||||
const size_t in_start = *in_pos;
|
||||
const size_t out_start = *out_pos;
|
||||
|
||||
const lzma_ret ret = coder->next.code(coder->next.coder,
|
||||
allocator, in, in_pos, in_size,
|
||||
out, out_pos, out_size, action);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
const size_t out_used = *out_pos - out_start;
|
||||
|
||||
if (update_size(&coder->total_size, out_used,
|
||||
coder->total_limit)
|
||||
|| update_size(&coder->compressed_size,
|
||||
out_used,
|
||||
coder->options->compressed_size))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
// No need to check for overflow because we have already
|
||||
// checked it at the beginning of this function.
|
||||
coder->uncompressed_size += in_used;
|
||||
|
||||
lzma_check_update(&coder->check, coder->options->check,
|
||||
in + in_start, in_used);
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
assert(*in_pos == in_size);
|
||||
|
||||
// Compressed and Uncompressed Sizes are now at their final
|
||||
// values. Verify that they match the values give to us.
|
||||
if (!is_size_valid(coder->compressed_size,
|
||||
coder->options->compressed_size)
|
||||
|| !is_size_valid(coder->uncompressed_size,
|
||||
coder->options->uncompressed_size))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
coder->sequence = SEQ_CHECK_FINISH;
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_CHECK_FINISH:
|
||||
if (coder->options->check == LZMA_CHECK_NONE) {
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
lzma_check_finish(&coder->check, coder->options->check);
|
||||
coder->sequence = SEQ_CHECK_COPY;
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_CHECK_COPY:
|
||||
assert(lzma_check_sizes[coder->options->check] > 0);
|
||||
|
||||
switch (coder->options->check) {
|
||||
case LZMA_CHECK_CRC32:
|
||||
out[*out_pos] = coder->check.crc32 >> (coder->pos * 8);
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_CRC64:
|
||||
out[*out_pos] = coder->check.crc64 >> (coder->pos * 8);
|
||||
break;
|
||||
|
||||
case LZMA_CHECK_SHA256:
|
||||
out[*out_pos] = coder->check.sha256.buffer[coder->pos];
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
++*out_pos;
|
||||
|
||||
if (update_size(&coder->total_size, 1, coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
if (++coder->pos == lzma_check_sizes[coder->options->check]) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE:
|
||||
if (coder->options->has_uncompressed_size_in_footer) {
|
||||
const size_t out_start = *out_pos;
|
||||
|
||||
const lzma_ret ret = lzma_vli_encode(
|
||||
coder->uncompressed_size,
|
||||
&coder->pos, 1,
|
||||
out, out_pos, out_size);
|
||||
|
||||
// Updating the size this way instead of doing in a
|
||||
// single chunk using lzma_vli_size(), because this
|
||||
// way we detect when exactly we are going out of
|
||||
// our limits.
|
||||
if (update_size(&coder->total_size,
|
||||
*out_pos - out_start,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
coder->pos = 0;
|
||||
}
|
||||
|
||||
coder->backward_size = coder->total_size;
|
||||
coder->sequence = SEQ_BACKWARD_SIZE;
|
||||
break;
|
||||
|
||||
case SEQ_BACKWARD_SIZE:
|
||||
if (coder->options->has_backward_size) {
|
||||
const size_t out_start = *out_pos;
|
||||
|
||||
const lzma_ret ret = lzma_vli_encode(
|
||||
coder->backward_size, &coder->pos, 1,
|
||||
out, out_pos, out_size);
|
||||
|
||||
if (update_size(&coder->total_size,
|
||||
*out_pos - out_start,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
}
|
||||
|
||||
coder->sequence = SEQ_PADDING;
|
||||
break;
|
||||
|
||||
case SEQ_PADDING:
|
||||
if (coder->options->handle_padding) {
|
||||
assert(!coder->options
|
||||
->has_uncompressed_size_in_footer);
|
||||
assert(!coder->options->has_backward_size);
|
||||
assert(coder->options->total_size != LZMA_VLI_VALUE_UNKNOWN);
|
||||
|
||||
if (coder->total_size < coder->options->total_size) {
|
||||
out[*out_pos] = 0x00;
|
||||
++*out_pos;
|
||||
|
||||
if (update_size(&coder->total_size, 1,
|
||||
coder->total_limit))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Now also Total Size is known. Verify it.
|
||||
if (!is_size_valid(coder->total_size,
|
||||
coder->options->total_size))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
// Copy the values into coder->options. The caller
|
||||
// may use this information to construct Index.
|
||||
coder->options->total_size = coder->total_size;
|
||||
coder->options->compressed_size = coder->compressed_size;
|
||||
coder->options->uncompressed_size = coder->uncompressed_size;
|
||||
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
default:
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
block_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->next, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static lzma_ret
|
||||
block_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
lzma_options_block *options)
|
||||
{
|
||||
// Validate some options.
|
||||
if (options == NULL
|
||||
|| !lzma_vli_is_valid(options->total_size)
|
||||
|| !lzma_vli_is_valid(options->compressed_size)
|
||||
|| !lzma_vli_is_valid(options->uncompressed_size)
|
||||
|| !lzma_vli_is_valid(options->total_size)
|
||||
|| !lzma_vli_is_valid(options->total_limit)
|
||||
|| !lzma_vli_is_valid(options->uncompressed_limit)
|
||||
|| (options->uncompressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN
|
||||
&& options->uncompressed_size
|
||||
> options->uncompressed_limit)
|
||||
|| (options->total_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
&& options->total_size
|
||||
> options->total_limit)
|
||||
|| (!options->has_eopm && options->uncompressed_size
|
||||
== LZMA_VLI_VALUE_UNKNOWN)
|
||||
|| (options->handle_padding && (options->total_size
|
||||
== LZMA_VLI_VALUE_UNKNOWN
|
||||
|| options->has_uncompressed_size_in_footer
|
||||
|| options->has_backward_size))
|
||||
|| options->header_size > options->total_size)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
// Allocate and initialize *next->coder if needed.
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &block_encode;
|
||||
next->end = &block_encoder_end;
|
||||
next->coder->next = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
// Initialize the check.
|
||||
return_if_error(lzma_check_init(&next->coder->check, options->check));
|
||||
|
||||
// If End of Payload Marker is not used and Uncompressed Size is zero,
|
||||
// Compressed Data is empty. That is, we don't call the encoder at all.
|
||||
// We initialize it though; it allows detecting invalid options.
|
||||
if (!options->has_eopm && options->uncompressed_size == 0) {
|
||||
// Also Compressed Size must also be zero if it has been
|
||||
// given to us.
|
||||
if (!is_size_valid(options->compressed_size, 0))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
next->coder->sequence = SEQ_CHECK_FINISH;
|
||||
} else {
|
||||
next->coder->sequence = SEQ_CODE;
|
||||
}
|
||||
|
||||
// Other initializations
|
||||
next->coder->options = options;
|
||||
next->coder->pos = 0;
|
||||
next->coder->total_size = options->header_size;
|
||||
next->coder->compressed_size = 0;
|
||||
next->coder->uncompressed_size = 0;
|
||||
next->coder->total_limit
|
||||
= MIN(options->total_size, options->total_limit);
|
||||
next->coder->uncompressed_limit = MIN(options->uncompressed_size,
|
||||
options->uncompressed_limit);
|
||||
|
||||
// Initialize the requested filters.
|
||||
return lzma_raw_encoder_init(&next->coder->next, allocator,
|
||||
options->filters, options->has_eopm
|
||||
? LZMA_VLI_VALUE_UNKNOWN
|
||||
: options->uncompressed_size,
|
||||
true);
|
||||
}
|
||||
|
||||
|
||||
extern lzma_ret
|
||||
lzma_block_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
|
||||
lzma_options_block *options)
|
||||
{
|
||||
lzma_next_coder_init(block_encoder_init, next, allocator, options);
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_block_encoder(lzma_stream *strm, lzma_options_block *options)
|
||||
{
|
||||
lzma_next_strm_init(strm, block_encoder_init, options);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
strm->internal->supported_actions[LZMA_FINISH] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_encoder.h
|
||||
/// \brief Encodes .lzma Blocks
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LZMA_BLOCK_ENCODER_H
|
||||
#define LZMA_BLOCK_ENCODER_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
extern lzma_ret lzma_block_encoder_init(lzma_next_coder *next,
|
||||
lzma_allocator *allocator, lzma_options_block *options);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,373 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_header_decoder.c
|
||||
/// \brief Decodes Block Header from .lzma files
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
#include "check.h"
|
||||
|
||||
|
||||
struct lzma_coder_s {
|
||||
lzma_options_block *options;
|
||||
|
||||
enum {
|
||||
SEQ_FLAGS_1,
|
||||
SEQ_FLAGS_2,
|
||||
SEQ_COMPRESSED_SIZE,
|
||||
SEQ_UNCOMPRESSED_SIZE,
|
||||
SEQ_FILTER_FLAGS_INIT,
|
||||
SEQ_FILTER_FLAGS_DECODE,
|
||||
SEQ_CRC32,
|
||||
SEQ_PADDING
|
||||
} sequence;
|
||||
|
||||
/// Position in variable-length integers
|
||||
size_t pos;
|
||||
|
||||
/// CRC32 of the Block Header
|
||||
uint32_t crc32;
|
||||
|
||||
lzma_next_coder filter_flags_decoder;
|
||||
};
|
||||
|
||||
|
||||
static bool
|
||||
update_sequence(lzma_coder *coder)
|
||||
{
|
||||
switch (coder->sequence) {
|
||||
case SEQ_FLAGS_2:
|
||||
if (coder->options->compressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_COMPRESSED_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_COMPRESSED_SIZE:
|
||||
if (coder->options->uncompressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_UNCOMPRESSED_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE:
|
||||
coder->pos = 0;
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_FILTER_FLAGS_DECODE:
|
||||
if (coder->options->filters[coder->pos].id
|
||||
!= LZMA_VLI_VALUE_UNKNOWN) {
|
||||
coder->sequence = SEQ_FILTER_FLAGS_INIT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (coder->options->has_crc32) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_CRC32;
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_CRC32:
|
||||
if (coder->options->padding != 0) {
|
||||
coder->pos = 0;
|
||||
coder->sequence = SEQ_PADDING;
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static lzma_ret
|
||||
block_header_decode(lzma_coder *coder, lzma_allocator *allocator,
|
||||
const uint8_t *restrict in, size_t *restrict in_pos,
|
||||
size_t in_size, uint8_t *restrict out lzma_attribute((unused)),
|
||||
size_t *restrict out_pos lzma_attribute((unused)),
|
||||
size_t out_size lzma_attribute((unused)),
|
||||
lzma_action action lzma_attribute((unused)))
|
||||
{
|
||||
while (*in_pos < in_size)
|
||||
switch (coder->sequence) {
|
||||
case SEQ_FLAGS_1:
|
||||
// Check that the reserved bit is unset. Use HEADER_ERROR
|
||||
// because newer version of liblzma may support the reserved
|
||||
// bit, although it is likely that this is just a broken file.
|
||||
if (in[*in_pos] & 0x40)
|
||||
return LZMA_HEADER_ERROR;
|
||||
|
||||
// Number of filters: we prepare appropriate amount of
|
||||
// variables for variable-length integer parsing. The
|
||||
// initialization function has already reset the rest
|
||||
// of the values to LZMA_VLI_VALUE_UNKNOWN, which allows
|
||||
// us to later know how many filters there are.
|
||||
for (int i = (int)(in[*in_pos] & 0x07) - 1; i >= 0; --i)
|
||||
coder->options->filters[i].id = 0;
|
||||
|
||||
// End of Payload Marker flag
|
||||
coder->options->has_eopm = (in[*in_pos] & 0x08) != 0;
|
||||
|
||||
// Compressed Size: Prepare for variable-length integer
|
||||
// parsing if it is known.
|
||||
if (in[*in_pos] & 0x10)
|
||||
coder->options->compressed_size = 0;
|
||||
|
||||
// Uncompressed Size: the same.
|
||||
if (in[*in_pos] & 0x20)
|
||||
coder->options->uncompressed_size = 0;
|
||||
|
||||
// Is Metadata Block flag
|
||||
coder->options->is_metadata = (in[*in_pos] & 0x80) != 0;
|
||||
|
||||
// We need at least one: Uncompressed Size or EOPM.
|
||||
if (coder->options->uncompressed_size == LZMA_VLI_VALUE_UNKNOWN
|
||||
&& !coder->options->has_eopm)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
// Update header CRC32.
|
||||
coder->crc32 = lzma_crc32(in + *in_pos, 1, coder->crc32);
|
||||
|
||||
++*in_pos;
|
||||
coder->sequence = SEQ_FLAGS_2;
|
||||
break;
|
||||
|
||||
case SEQ_FLAGS_2:
|
||||
// Check that the reserved bits are unset.
|
||||
if (in[*in_pos] & 0xE0)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
// Get the size of Header Padding.
|
||||
coder->options->padding = in[*in_pos] & 0x1F;
|
||||
|
||||
coder->crc32 = lzma_crc32(in + *in_pos, 1, coder->crc32);
|
||||
|
||||
++*in_pos;
|
||||
|
||||
if (update_sequence(coder))
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
break;
|
||||
|
||||
case SEQ_COMPRESSED_SIZE: {
|
||||
// Store the old input position to be used when
|
||||
// updating coder->header_crc32.
|
||||
const size_t in_start = *in_pos;
|
||||
|
||||
const lzma_ret ret = lzma_vli_decode(
|
||||
&coder->options->compressed_size,
|
||||
&coder->pos, in, in_pos, in_size);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
|
||||
coder->options->compressed_reserve += in_used;
|
||||
assert(coder->options->compressed_reserve
|
||||
<= LZMA_VLI_BYTES_MAX);
|
||||
|
||||
coder->options->header_size += in_used;
|
||||
|
||||
coder->crc32 = lzma_crc32(in + in_start, in_used,
|
||||
coder->crc32);
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
if (update_sequence(coder))
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_UNCOMPRESSED_SIZE: {
|
||||
const size_t in_start = *in_pos;
|
||||
|
||||
const lzma_ret ret = lzma_vli_decode(
|
||||
&coder->options->uncompressed_size,
|
||||
&coder->pos, in, in_pos, in_size);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
|
||||
coder->options->uncompressed_reserve += in_used;
|
||||
assert(coder->options->uncompressed_reserve
|
||||
<= LZMA_VLI_BYTES_MAX);
|
||||
|
||||
coder->options->header_size += in_used;
|
||||
|
||||
coder->crc32 = lzma_crc32(in + in_start, in_used,
|
||||
coder->crc32);
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
if (update_sequence(coder))
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_FILTER_FLAGS_INIT: {
|
||||
assert(coder->options->filters[coder->pos].id
|
||||
!= LZMA_VLI_VALUE_UNKNOWN);
|
||||
|
||||
const lzma_ret ret = lzma_filter_flags_decoder_init(
|
||||
&coder->filter_flags_decoder, allocator,
|
||||
&coder->options->filters[coder->pos]);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
coder->sequence = SEQ_FILTER_FLAGS_DECODE;
|
||||
}
|
||||
|
||||
// Fall through
|
||||
|
||||
case SEQ_FILTER_FLAGS_DECODE: {
|
||||
const size_t in_start = *in_pos;
|
||||
|
||||
const lzma_ret ret = coder->filter_flags_decoder.code(
|
||||
coder->filter_flags_decoder.coder,
|
||||
allocator, in, in_pos, in_size,
|
||||
NULL, NULL, 0, LZMA_RUN);
|
||||
|
||||
const size_t in_used = *in_pos - in_start;
|
||||
coder->options->header_size += in_used;
|
||||
coder->crc32 = lzma_crc32(in + in_start,
|
||||
in_used, coder->crc32);
|
||||
|
||||
if (ret != LZMA_STREAM_END)
|
||||
return ret;
|
||||
|
||||
++coder->pos;
|
||||
|
||||
if (update_sequence(coder))
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SEQ_CRC32:
|
||||
assert(coder->options->has_crc32);
|
||||
|
||||
if (in[*in_pos] != ((coder->crc32 >> (coder->pos * 8)) & 0xFF))
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
++*in_pos;
|
||||
++coder->pos;
|
||||
|
||||
// Check if we reached end of the CRC32 field.
|
||||
if (coder->pos == 4) {
|
||||
coder->options->header_size += 4;
|
||||
|
||||
if (update_sequence(coder))
|
||||
return LZMA_STREAM_END;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SEQ_PADDING:
|
||||
if (in[*in_pos] != 0x00)
|
||||
return LZMA_DATA_ERROR;
|
||||
|
||||
++*in_pos;
|
||||
++coder->options->header_size;
|
||||
++coder->pos;
|
||||
|
||||
if (coder->pos < (size_t)(coder->options->padding))
|
||||
break;
|
||||
|
||||
return LZMA_STREAM_END;
|
||||
|
||||
default:
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
block_header_decoder_end(lzma_coder *coder, lzma_allocator *allocator)
|
||||
{
|
||||
lzma_next_coder_end(&coder->filter_flags_decoder, allocator);
|
||||
lzma_free(coder, allocator);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
extern lzma_ret
|
||||
lzma_block_header_decoder_init(lzma_next_coder *next,
|
||||
lzma_allocator *allocator, lzma_options_block *options)
|
||||
{
|
||||
if (next->coder == NULL) {
|
||||
next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
|
||||
if (next->coder == NULL)
|
||||
return LZMA_MEM_ERROR;
|
||||
|
||||
next->code = &block_header_decode;
|
||||
next->end = &block_header_decoder_end;
|
||||
next->coder->filter_flags_decoder = LZMA_NEXT_CODER_INIT;
|
||||
}
|
||||
|
||||
// Assume that Compressed Size and Uncompressed Size are unknown.
|
||||
options->compressed_size = LZMA_VLI_VALUE_UNKNOWN;
|
||||
options->uncompressed_size = LZMA_VLI_VALUE_UNKNOWN;
|
||||
|
||||
// We will calculate the sizes of these fields too so that the
|
||||
// application may rewrite the header if it wishes so.
|
||||
options->compressed_reserve = 0;
|
||||
options->uncompressed_reserve = 0;
|
||||
|
||||
// The Block Flags field is always present, so include its size here
|
||||
// and we don't need to worry about it in block_header_decode().
|
||||
options->header_size = 2;
|
||||
|
||||
// Reset filters[] to indicate empty list of filters.
|
||||
// See SEQ_FLAGS_1 in block_header_decode() for reasoning of this.
|
||||
for (size_t i = 0; i < 8; ++i) {
|
||||
options->filters[i].id = LZMA_VLI_VALUE_UNKNOWN;
|
||||
options->filters[i].options = NULL;
|
||||
}
|
||||
|
||||
next->coder->options = options;
|
||||
next->coder->sequence = SEQ_FLAGS_1;
|
||||
next->coder->pos = 0;
|
||||
next->coder->crc32 = 0;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_block_header_decoder(lzma_stream *strm,
|
||||
lzma_options_block *options)
|
||||
{
|
||||
lzma_next_strm_init(strm, lzma_block_header_decoder_init, options);
|
||||
|
||||
strm->internal->supported_actions[LZMA_RUN] = true;
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
|
@ -0,0 +1,211 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file block_header_encoder.c
|
||||
/// \brief Encodes Block Header for .lzma files
|
||||
//
|
||||
// Copyright (C) 2007 Lasse Collin
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "common.h"
|
||||
#include "check.h"
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_block_header_size(lzma_options_block *options)
|
||||
{
|
||||
// Block Flags take two bytes.
|
||||
size_t size = 2;
|
||||
|
||||
// Compressed Size
|
||||
if (!lzma_vli_is_valid(options->compressed_size)) {
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
} else if (options->compressed_reserve != 0) {
|
||||
// Make sure that the known Compressed Size fits into the
|
||||
// reserved space. Note that lzma_vli_size() will return zero
|
||||
// if options->compressed_size is LZMA_VLI_VALUE_UNKNOWN, so
|
||||
// we don't need to handle that special case separately.
|
||||
if (options->compressed_reserve > LZMA_VLI_BYTES_MAX
|
||||
|| lzma_vli_size(options->compressed_size)
|
||||
> (size_t)(options->compressed_reserve))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
size += options->compressed_reserve;
|
||||
|
||||
} else if (options->compressed_size != LZMA_VLI_VALUE_UNKNOWN) {
|
||||
// Compressed Size is known. We have already checked
|
||||
// that is is a valid VLI, and since it isn't
|
||||
// LZMA_VLI_VALUE_UNKNOWN, we can be sure that
|
||||
// lzma_vli_size() will succeed.
|
||||
size += lzma_vli_size(options->compressed_size);
|
||||
}
|
||||
|
||||
// Uncompressed Size
|
||||
if (!lzma_vli_is_valid(options->uncompressed_size)) {
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
} else if (options->uncompressed_reserve != 0) {
|
||||
if (options->uncompressed_reserve > LZMA_VLI_BYTES_MAX
|
||||
|| lzma_vli_size(options->uncompressed_size)
|
||||
> (size_t)(options->uncompressed_reserve))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
size += options->uncompressed_reserve;
|
||||
|
||||
} else if (options->uncompressed_size != LZMA_VLI_VALUE_UNKNOWN) {
|
||||
size += lzma_vli_size(options->uncompressed_size);
|
||||
}
|
||||
|
||||
// List of Filter Flags
|
||||
for (size_t i = 0; options->filters[i].id != LZMA_VLI_VALUE_UNKNOWN;
|
||||
++i) {
|
||||
// Don't allow too many filters.
|
||||
if (i == 7)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
uint32_t tmp;
|
||||
const lzma_ret ret = lzma_filter_flags_size(&tmp,
|
||||
options->filters + i);
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
|
||||
size += tmp;
|
||||
}
|
||||
|
||||
// CRC32
|
||||
if (options->has_crc32)
|
||||
size += 4;
|
||||
|
||||
// Padding
|
||||
int32_t padding;
|
||||
if (options->padding == LZMA_BLOCK_HEADER_PADDING_AUTO) {
|
||||
const uint32_t preferred = lzma_alignment_output(
|
||||
options->filters, 1);
|
||||
const uint32_t unaligned = size + options->alignment;
|
||||
padding = (int32_t)(unaligned % preferred);
|
||||
if (padding != 0)
|
||||
padding = preferred - padding;
|
||||
} else if (options->padding >= LZMA_BLOCK_HEADER_PADDING_MIN
|
||||
&& options->padding <= LZMA_BLOCK_HEADER_PADDING_MAX) {
|
||||
padding = options->padding;
|
||||
} else {
|
||||
return LZMA_PROG_ERROR;
|
||||
}
|
||||
|
||||
// All success. Copy the calculated values to the options structure.
|
||||
options->padding = padding;
|
||||
options->header_size = size + (size_t)(padding);
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
||||
|
||||
|
||||
extern LZMA_API lzma_ret
|
||||
lzma_block_header_encode(uint8_t *out, const lzma_options_block *options)
|
||||
{
|
||||
// We write the Block Flags later.
|
||||
if (options->header_size < 2)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
const size_t out_size = options->header_size;
|
||||
size_t out_pos = 2;
|
||||
|
||||
// Compressed Size
|
||||
if (options->compressed_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
|| options->compressed_reserve != 0) {
|
||||
const lzma_vli size = options->compressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN
|
||||
? options->compressed_size : 0;
|
||||
size_t vli_pos = 0;
|
||||
if (lzma_vli_encode(
|
||||
size, &vli_pos, options->compressed_reserve,
|
||||
out, &out_pos, out_size) != LZMA_STREAM_END)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
}
|
||||
|
||||
// Uncompressed Size
|
||||
if (options->uncompressed_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
|| options->uncompressed_reserve != 0) {
|
||||
const lzma_vli size = options->uncompressed_size
|
||||
!= LZMA_VLI_VALUE_UNKNOWN
|
||||
? options->uncompressed_size : 0;
|
||||
size_t vli_pos = 0;
|
||||
if (lzma_vli_encode(
|
||||
size, &vli_pos, options->uncompressed_reserve,
|
||||
out, &out_pos, out_size) != LZMA_STREAM_END)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
}
|
||||
|
||||
// Filter Flags
|
||||
size_t filter_count;
|
||||
for (filter_count = 0; options->filters[filter_count].id
|
||||
!= LZMA_VLI_VALUE_UNKNOWN; ++filter_count) {
|
||||
// There can be at maximum of seven filters.
|
||||
if (filter_count == 7)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
const lzma_ret ret = lzma_filter_flags_encode(out, &out_pos,
|
||||
out_size, options->filters + filter_count);
|
||||
// FIXME: Don't return LZMA_BUF_ERROR.
|
||||
if (ret != LZMA_OK)
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Block Flags 1
|
||||
out[0] = filter_count;
|
||||
|
||||
if (options->has_eopm)
|
||||
out[0] |= 0x08;
|
||||
else if (options->uncompressed_size == LZMA_VLI_VALUE_UNKNOWN)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
if (options->compressed_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
|| options->compressed_reserve != 0)
|
||||
out[0] |= 0x10;
|
||||
|
||||
if (options->uncompressed_size != LZMA_VLI_VALUE_UNKNOWN
|
||||
|| options->uncompressed_reserve != 0)
|
||||
out[0] |= 0x20;
|
||||
|
||||
if (options->is_metadata)
|
||||
out[0] |= 0x80;
|
||||
|
||||
// Block Flags 2
|
||||
if (options->padding < LZMA_BLOCK_HEADER_PADDING_MIN
|
||||
|| options->padding > LZMA_BLOCK_HEADER_PADDING_MAX)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
out[1] = (uint8_t)(options->padding);
|
||||
|
||||
// CRC32
|
||||
if (options->has_crc32) {
|
||||
if (out_size - out_pos < 4)
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
const uint32_t crc = lzma_crc32(out, out_pos, 0);
|
||||
for (size_t i = 0; i < 4; ++i)
|
||||
out[out_pos++] = crc >> (i * 8);
|
||||
}
|
||||
|
||||
// Padding - the amount of available space must now match with
|
||||
// the size of the Padding field.
|
||||
if (out_size - out_pos != (size_t)(options->padding))
|
||||
return LZMA_PROG_ERROR;
|
||||
|
||||
memzero(out + out_pos, (size_t)(options->padding));
|
||||
|
||||
return LZMA_OK;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue