First commit
This commit is contained in:
commit
b6175b9dbe
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Makefile
|
||||||
|
config.h
|
||||||
|
dep
|
||||||
|
objs
|
||||||
|
bin
|
||||||
|
autom4te.cache
|
339
LICENSE
Normal file
339
LICENSE
Normal file
@ -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.
|
48
Makefile.in
Normal file
48
Makefile.in
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
srcdir=@srcdir@
|
||||||
|
|
||||||
|
CFLAGS=@CFLAGS@
|
||||||
|
LDFLAGS=@LDFLAGS@
|
||||||
|
CPPFLAGS=@CPPFLAGS@
|
||||||
|
COMPILE_FLAGS=${CFLAGS} ${CPFLAGS} ${CPPFLAGS} ${DEFS} -Wall -Wextra -Werror -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC
|
||||||
|
|
||||||
|
EXTRA_LIBS=@LIBS@
|
||||||
|
LOCAL_LDFLAGS=-rdynamic -ggdb ${EXTRA_LIBS}
|
||||||
|
LINK_FLAGS=${LDFLAGS} ${LOCAL_LDFLAGS}
|
||||||
|
|
||||||
|
DEP=${srcdir}/dep
|
||||||
|
EXE=${srcdir}/bin
|
||||||
|
OBJ=${srcdir}/objs
|
||||||
|
DIR_LIST=${DEP} ${EXE} ${OBJ}
|
||||||
|
|
||||||
|
EXE_LIST=${EXE}/tl-parser
|
||||||
|
|
||||||
|
OBJECTS=${OBJ}/tl-parser.o ${OBJ}/tlc.o ${OBJ}/crc32.o
|
||||||
|
|
||||||
|
DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${OBJECTS}))
|
||||||
|
DEPENDENCE_LIST=${DEPENDENCE}
|
||||||
|
|
||||||
|
INCLUDE=-I. -I${srcdir}
|
||||||
|
CC=@CC@
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
.SUFFIXES: .c .h .o
|
||||||
|
|
||||||
|
all: ${EXE_LIST} ${DIR_LIST} ${LIB_LIST}
|
||||||
|
create_dirs_and_headers: ${DIR_LIST}
|
||||||
|
create_dirs: ${DIR_LIST}
|
||||||
|
|
||||||
|
${DIR_LIST}:
|
||||||
|
@test -d $@ || mkdir -p $@
|
||||||
|
|
||||||
|
-include ${DEPENDENCE_LIST}
|
||||||
|
|
||||||
|
${OBJECTS}: ${OBJ}/%.o: %.c | create_dirs_and_headers
|
||||||
|
${CC} ${INCLUDE} ${COMPILE_FLAGS} -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
|
||||||
|
|
||||||
|
${EXE}/tl-parser: ${OBJECTS}
|
||||||
|
${CC} $^ ${LINK_FLAGS} -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf ${DIR_LIST} config.log config.status > /dev/null || echo "all clean"
|
||||||
|
|
97
config.h
Normal file
97
config.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/* config.h. Generated from config.h.in by configure. */
|
||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `clock_gettime' function. */
|
||||||
|
#define HAVE_CLOCK_GETTIME 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#define HAVE_INTTYPES_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `m' library (-lm). */
|
||||||
|
#define HAVE_LIBM 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <mach/mach.h> header file. */
|
||||||
|
/* #undef HAVE_MACH_MACH_H */
|
||||||
|
|
||||||
|
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||||
|
to 0 otherwise. */
|
||||||
|
#define HAVE_MALLOC 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#define HAVE_MEMORY_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `memset' function. */
|
||||||
|
#define HAVE_MEMSET 1
|
||||||
|
|
||||||
|
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||||
|
and to 0 otherwise. */
|
||||||
|
#define HAVE_REALLOC 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#define HAVE_STDINT_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#define HAVE_STDLIB_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strdup' function. */
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#define HAVE_STRINGS_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#define HAVE_STRING_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||||
|
#define HAVE_SYS_TIME_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#define HAVE_SYS_TYPES_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the `__builtin_bswap32' built-in function */
|
||||||
|
#define HAVE___BUILTIN_BSWAP32 1
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#define PACKAGE_BUGREPORT ""
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#define PACKAGE_NAME "tl-parser"
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#define PACKAGE_STRING "tl-parser 1.0"
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#define PACKAGE_TARNAME "tl-parser"
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#define PACKAGE_URL ""
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#define PACKAGE_VERSION "1.0"
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
|
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||||
|
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
/* #undef inline */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to rpl_malloc if the replacement function should be used. */
|
||||||
|
/* #undef malloc */
|
||||||
|
|
||||||
|
/* Define to rpl_realloc if the replacement function should be used. */
|
||||||
|
/* #undef realloc */
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
/* #undef size_t */
|
96
config.h.in
Normal file
96
config.h.in
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `clock_gettime' function. */
|
||||||
|
#undef HAVE_CLOCK_GETTIME
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||||
|
#undef HAVE_FCNTL_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `m' library (-lm). */
|
||||||
|
#undef HAVE_LIBM
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <mach/mach.h> header file. */
|
||||||
|
#undef HAVE_MACH_MACH_H
|
||||||
|
|
||||||
|
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||||
|
to 0 otherwise. */
|
||||||
|
#undef HAVE_MALLOC
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `memset' function. */
|
||||||
|
#undef HAVE_MEMSET
|
||||||
|
|
||||||
|
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||||
|
and to 0 otherwise. */
|
||||||
|
#undef HAVE_REALLOC
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strdup' function. */
|
||||||
|
#undef HAVE_STRDUP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||||
|
#undef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the `__builtin_bswap32' built-in function */
|
||||||
|
#undef HAVE___BUILTIN_BSWAP32
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||||
|
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#undef inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to rpl_malloc if the replacement function should be used. */
|
||||||
|
#undef malloc
|
||||||
|
|
||||||
|
/* Define to rpl_realloc if the replacement function should be used. */
|
||||||
|
#undef realloc
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
32
configure.ac
Normal file
32
configure.ac
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# -*- Autoconf -*-
|
||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ([2.69])
|
||||||
|
AC_INIT([tl-parser], [1.0])
|
||||||
|
|
||||||
|
m4_include([m4-ax_gcc_builtin.m4])
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
|
||||||
|
# Checks for libraries.
|
||||||
|
AC_CHECK_LIB([m], [sqrt])
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_CHECK_HEADERS([fcntl.h mach/mach.h stdlib.h string.h sys/time.h unistd.h])
|
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_INLINE
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_FUNC_MALLOC
|
||||||
|
AC_FUNC_REALLOC
|
||||||
|
AC_CHECK_FUNCS([clock_gettime memset strdup])
|
||||||
|
|
||||||
|
AX_GCC_BUILTIN(__builtin_bswap32)
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_OUTPUT
|
668
crc32.c
Normal file
668
crc32.c
Normal file
@ -0,0 +1,668 @@
|
|||||||
|
/*
|
||||||
|
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Copyright 2009-2012 Vkontakte Ltd
|
||||||
|
2009-2012 Nikolai Durov
|
||||||
|
2009-2012 Andrei Lopatin
|
||||||
|
2012 Anton Maydell
|
||||||
|
*/
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "crc32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE___BUILTIN_BSWAP32
|
||||||
|
static inline unsigned __builtin_bswap32(unsigned x) {
|
||||||
|
return ((x << 24) & 0xff000000 ) |
|
||||||
|
((x << 8) & 0x00ff0000 ) |
|
||||||
|
((x >> 8) & 0x0000ff00 ) |
|
||||||
|
((x >> 24) & 0x000000ff );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned int crc32_table[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
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int crc32_table2[256] =
|
||||||
|
{
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int crc32_table1[256] =
|
||||||
|
{
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int crc32_table0[256] = {
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned crc32_partial_old (const void *data, int len, unsigned crc) {
|
||||||
|
const char *p = data;
|
||||||
|
for (; len > 0; len--) {
|
||||||
|
crc = crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
unsigned crc32_partial_fast (const void *data, int len, unsigned crc) {
|
||||||
|
const int *p = (const int *) data;
|
||||||
|
int x;
|
||||||
|
for (x = (len >> 2); x > 0; x--) {
|
||||||
|
crc ^= *p++;
|
||||||
|
crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||||
|
}
|
||||||
|
const char *q = (const char *) p;
|
||||||
|
switch (len & 3) {
|
||||||
|
case 3:
|
||||||
|
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||||
|
case 2:
|
||||||
|
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||||
|
case 1:
|
||||||
|
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned crc32_partial (const void *data, int len, unsigned crc) {
|
||||||
|
const int *p = (const int *) data;
|
||||||
|
int x;
|
||||||
|
#define DO_ONE(v) crc ^= v; crc = crc32_table0[crc & 0xff] ^ crc32_table1[(crc & 0xff00) >> 8] ^ crc32_table2[(crc & 0xff0000) >> 16] ^ crc32_table[crc >> 24];
|
||||||
|
#define DO_FOUR(p) DO_ONE((p)[0]); DO_ONE((p)[1]); DO_ONE((p)[2]); DO_ONE((p)[3]);
|
||||||
|
|
||||||
|
for (x = (len >> 5); x > 0; x--) {
|
||||||
|
DO_FOUR (p);
|
||||||
|
DO_FOUR (p + 4);
|
||||||
|
p += 8;
|
||||||
|
}
|
||||||
|
if (len & 16) {
|
||||||
|
DO_FOUR (p);
|
||||||
|
p += 4;
|
||||||
|
}
|
||||||
|
if (len & 8) {
|
||||||
|
DO_ONE (p[0]);
|
||||||
|
DO_ONE (p[1]);
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
if (len & 4) {
|
||||||
|
DO_ONE (*p++);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
for (x = (len >> 2) & 7; x > 0; x--) {
|
||||||
|
DO_ONE (*p++);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#undef DO_ONE
|
||||||
|
#undef DO_FOUR
|
||||||
|
const char *q = (const char *) p;
|
||||||
|
if (len & 2) {
|
||||||
|
crc = crc32_table[(crc ^ q[0]) & 0xff] ^ (crc >> 8);
|
||||||
|
crc = crc32_table[(crc ^ q[1]) & 0xff] ^ (crc >> 8);
|
||||||
|
q += 2;
|
||||||
|
}
|
||||||
|
if (len & 1) {
|
||||||
|
crc = crc32_table[(crc ^ *q++) & 0xff] ^ (crc >> 8);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned compute_crc32 (const void *data, int len) {
|
||||||
|
return crc32_partial (data, len, -1) ^ -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long crc64_table[256] = {
|
||||||
|
0x0000000000000000LL, 0xb32e4cbe03a75f6fLL, 0xf4843657a840a05bLL, 0x47aa7ae9abe7ff34LL,
|
||||||
|
0x7bd0c384ff8f5e33LL, 0xc8fe8f3afc28015cLL, 0x8f54f5d357cffe68LL, 0x3c7ab96d5468a107LL,
|
||||||
|
0xf7a18709ff1ebc66LL, 0x448fcbb7fcb9e309LL, 0x0325b15e575e1c3dLL, 0xb00bfde054f94352LL,
|
||||||
|
0x8c71448d0091e255LL, 0x3f5f08330336bd3aLL, 0x78f572daa8d1420eLL, 0xcbdb3e64ab761d61LL,
|
||||||
|
0x7d9ba13851336649LL, 0xceb5ed8652943926LL, 0x891f976ff973c612LL, 0x3a31dbd1fad4997dLL,
|
||||||
|
0x064b62bcaebc387aLL, 0xb5652e02ad1b6715LL, 0xf2cf54eb06fc9821LL, 0x41e11855055bc74eLL,
|
||||||
|
0x8a3a2631ae2dda2fLL, 0x39146a8fad8a8540LL, 0x7ebe1066066d7a74LL, 0xcd905cd805ca251bLL,
|
||||||
|
0xf1eae5b551a2841cLL, 0x42c4a90b5205db73LL, 0x056ed3e2f9e22447LL, 0xb6409f5cfa457b28LL,
|
||||||
|
0xfb374270a266cc92LL, 0x48190ecea1c193fdLL, 0x0fb374270a266cc9LL, 0xbc9d3899098133a6LL,
|
||||||
|
0x80e781f45de992a1LL, 0x33c9cd4a5e4ecdceLL, 0x7463b7a3f5a932faLL, 0xc74dfb1df60e6d95LL,
|
||||||
|
0x0c96c5795d7870f4LL, 0xbfb889c75edf2f9bLL, 0xf812f32ef538d0afLL, 0x4b3cbf90f69f8fc0LL,
|
||||||
|
0x774606fda2f72ec7LL, 0xc4684a43a15071a8LL, 0x83c230aa0ab78e9cLL, 0x30ec7c140910d1f3LL,
|
||||||
|
0x86ace348f355aadbLL, 0x3582aff6f0f2f5b4LL, 0x7228d51f5b150a80LL, 0xc10699a158b255efLL,
|
||||||
|
0xfd7c20cc0cdaf4e8LL, 0x4e526c720f7dab87LL, 0x09f8169ba49a54b3LL, 0xbad65a25a73d0bdcLL,
|
||||||
|
0x710d64410c4b16bdLL, 0xc22328ff0fec49d2LL, 0x85895216a40bb6e6LL, 0x36a71ea8a7ace989LL,
|
||||||
|
0x0adda7c5f3c4488eLL, 0xb9f3eb7bf06317e1LL, 0xfe5991925b84e8d5LL, 0x4d77dd2c5823b7baLL,
|
||||||
|
0x64b62bcaebc387a1LL, 0xd7986774e864d8ceLL, 0x90321d9d438327faLL, 0x231c512340247895LL,
|
||||||
|
0x1f66e84e144cd992LL, 0xac48a4f017eb86fdLL, 0xebe2de19bc0c79c9LL, 0x58cc92a7bfab26a6LL,
|
||||||
|
0x9317acc314dd3bc7LL, 0x2039e07d177a64a8LL, 0x67939a94bc9d9b9cLL, 0xd4bdd62abf3ac4f3LL,
|
||||||
|
0xe8c76f47eb5265f4LL, 0x5be923f9e8f53a9bLL, 0x1c4359104312c5afLL, 0xaf6d15ae40b59ac0LL,
|
||||||
|
0x192d8af2baf0e1e8LL, 0xaa03c64cb957be87LL, 0xeda9bca512b041b3LL, 0x5e87f01b11171edcLL,
|
||||||
|
0x62fd4976457fbfdbLL, 0xd1d305c846d8e0b4LL, 0x96797f21ed3f1f80LL, 0x2557339fee9840efLL,
|
||||||
|
0xee8c0dfb45ee5d8eLL, 0x5da24145464902e1LL, 0x1a083bacedaefdd5LL, 0xa9267712ee09a2baLL,
|
||||||
|
0x955cce7fba6103bdLL, 0x267282c1b9c65cd2LL, 0x61d8f8281221a3e6LL, 0xd2f6b4961186fc89LL,
|
||||||
|
0x9f8169ba49a54b33LL, 0x2caf25044a02145cLL, 0x6b055fede1e5eb68LL, 0xd82b1353e242b407LL,
|
||||||
|
0xe451aa3eb62a1500LL, 0x577fe680b58d4a6fLL, 0x10d59c691e6ab55bLL, 0xa3fbd0d71dcdea34LL,
|
||||||
|
0x6820eeb3b6bbf755LL, 0xdb0ea20db51ca83aLL, 0x9ca4d8e41efb570eLL, 0x2f8a945a1d5c0861LL,
|
||||||
|
0x13f02d374934a966LL, 0xa0de61894a93f609LL, 0xe7741b60e174093dLL, 0x545a57dee2d35652LL,
|
||||||
|
0xe21ac88218962d7aLL, 0x5134843c1b317215LL, 0x169efed5b0d68d21LL, 0xa5b0b26bb371d24eLL,
|
||||||
|
0x99ca0b06e7197349LL, 0x2ae447b8e4be2c26LL, 0x6d4e3d514f59d312LL, 0xde6071ef4cfe8c7dLL,
|
||||||
|
0x15bb4f8be788911cLL, 0xa6950335e42fce73LL, 0xe13f79dc4fc83147LL, 0x521135624c6f6e28LL,
|
||||||
|
0x6e6b8c0f1807cf2fLL, 0xdd45c0b11ba09040LL, 0x9aefba58b0476f74LL, 0x29c1f6e6b3e0301bLL,
|
||||||
|
0xc96c5795d7870f42LL, 0x7a421b2bd420502dLL, 0x3de861c27fc7af19LL, 0x8ec62d7c7c60f076LL,
|
||||||
|
0xb2bc941128085171LL, 0x0192d8af2baf0e1eLL, 0x4638a2468048f12aLL, 0xf516eef883efae45LL,
|
||||||
|
0x3ecdd09c2899b324LL, 0x8de39c222b3eec4bLL, 0xca49e6cb80d9137fLL, 0x7967aa75837e4c10LL,
|
||||||
|
0x451d1318d716ed17LL, 0xf6335fa6d4b1b278LL, 0xb199254f7f564d4cLL, 0x02b769f17cf11223LL,
|
||||||
|
0xb4f7f6ad86b4690bLL, 0x07d9ba1385133664LL, 0x4073c0fa2ef4c950LL, 0xf35d8c442d53963fLL,
|
||||||
|
0xcf273529793b3738LL, 0x7c0979977a9c6857LL, 0x3ba3037ed17b9763LL, 0x888d4fc0d2dcc80cLL,
|
||||||
|
0x435671a479aad56dLL, 0xf0783d1a7a0d8a02LL, 0xb7d247f3d1ea7536LL, 0x04fc0b4dd24d2a59LL,
|
||||||
|
0x3886b22086258b5eLL, 0x8ba8fe9e8582d431LL, 0xcc0284772e652b05LL, 0x7f2cc8c92dc2746aLL,
|
||||||
|
0x325b15e575e1c3d0LL, 0x8175595b76469cbfLL, 0xc6df23b2dda1638bLL, 0x75f16f0cde063ce4LL,
|
||||||
|
0x498bd6618a6e9de3LL, 0xfaa59adf89c9c28cLL, 0xbd0fe036222e3db8LL, 0x0e21ac88218962d7LL,
|
||||||
|
0xc5fa92ec8aff7fb6LL, 0x76d4de52895820d9LL, 0x317ea4bb22bfdfedLL, 0x8250e80521188082LL,
|
||||||
|
0xbe2a516875702185LL, 0x0d041dd676d77eeaLL, 0x4aae673fdd3081deLL, 0xf9802b81de97deb1LL,
|
||||||
|
0x4fc0b4dd24d2a599LL, 0xfceef8632775faf6LL, 0xbb44828a8c9205c2LL, 0x086ace348f355aadLL,
|
||||||
|
0x34107759db5dfbaaLL, 0x873e3be7d8faa4c5LL, 0xc094410e731d5bf1LL, 0x73ba0db070ba049eLL,
|
||||||
|
0xb86133d4dbcc19ffLL, 0x0b4f7f6ad86b4690LL, 0x4ce50583738cb9a4LL, 0xffcb493d702be6cbLL,
|
||||||
|
0xc3b1f050244347ccLL, 0x709fbcee27e418a3LL, 0x3735c6078c03e797LL, 0x841b8ab98fa4b8f8LL,
|
||||||
|
0xadda7c5f3c4488e3LL, 0x1ef430e13fe3d78cLL, 0x595e4a08940428b8LL, 0xea7006b697a377d7LL,
|
||||||
|
0xd60abfdbc3cbd6d0LL, 0x6524f365c06c89bfLL, 0x228e898c6b8b768bLL, 0x91a0c532682c29e4LL,
|
||||||
|
0x5a7bfb56c35a3485LL, 0xe955b7e8c0fd6beaLL, 0xaeffcd016b1a94deLL, 0x1dd181bf68bdcbb1LL,
|
||||||
|
0x21ab38d23cd56ab6LL, 0x9285746c3f7235d9LL, 0xd52f0e859495caedLL, 0x6601423b97329582LL,
|
||||||
|
0xd041dd676d77eeaaLL, 0x636f91d96ed0b1c5LL, 0x24c5eb30c5374ef1LL, 0x97eba78ec690119eLL,
|
||||||
|
0xab911ee392f8b099LL, 0x18bf525d915feff6LL, 0x5f1528b43ab810c2LL, 0xec3b640a391f4fadLL,
|
||||||
|
0x27e05a6e926952ccLL, 0x94ce16d091ce0da3LL, 0xd3646c393a29f297LL, 0x604a2087398eadf8LL,
|
||||||
|
0x5c3099ea6de60cffLL, 0xef1ed5546e415390LL, 0xa8b4afbdc5a6aca4LL, 0x1b9ae303c601f3cbLL,
|
||||||
|
0x56ed3e2f9e224471LL, 0xe5c372919d851b1eLL, 0xa26908783662e42aLL, 0x114744c635c5bb45LL,
|
||||||
|
0x2d3dfdab61ad1a42LL, 0x9e13b115620a452dLL, 0xd9b9cbfcc9edba19LL, 0x6a978742ca4ae576LL,
|
||||||
|
0xa14cb926613cf817LL, 0x1262f598629ba778LL, 0x55c88f71c97c584cLL, 0xe6e6c3cfcadb0723LL,
|
||||||
|
0xda9c7aa29eb3a624LL, 0x69b2361c9d14f94bLL, 0x2e184cf536f3067fLL, 0x9d36004b35545910LL,
|
||||||
|
0x2b769f17cf112238LL, 0x9858d3a9ccb67d57LL, 0xdff2a94067518263LL, 0x6cdce5fe64f6dd0cLL,
|
||||||
|
0x50a65c93309e7c0bLL, 0xe388102d33392364LL, 0xa4226ac498dedc50LL, 0x170c267a9b79833fLL,
|
||||||
|
0xdcd7181e300f9e5eLL, 0x6ff954a033a8c131LL, 0x28532e49984f3e05LL, 0x9b7d62f79be8616aLL,
|
||||||
|
0xa707db9acf80c06dLL, 0x14299724cc279f02LL, 0x5383edcd67c06036LL, 0xe0ada17364673f59LL
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc) {
|
||||||
|
const char *p = data;
|
||||||
|
for (; len > 0; len--) {
|
||||||
|
crc = crc64_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long crc64 (const void *data, int len) {
|
||||||
|
return crc64_partial (data, len, -1LL) ^ -1LL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned gf32_matrix_times (unsigned *matrix, unsigned vector) {
|
||||||
|
unsigned sum = 0;
|
||||||
|
while (vector) {
|
||||||
|
if (vector & 1) {
|
||||||
|
sum ^= *matrix;
|
||||||
|
}
|
||||||
|
vector >>= 1;
|
||||||
|
matrix++;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gf32_matrix_square (unsigned *square, unsigned *matrix) {
|
||||||
|
int n = 0;
|
||||||
|
do {
|
||||||
|
square[n] = gf32_matrix_times (matrix, matrix[n]);
|
||||||
|
} while (++n < 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2) {
|
||||||
|
assert (len2 < (1 << 29));
|
||||||
|
static int power_buf_initialized = 0;
|
||||||
|
static unsigned power_buf[1024];
|
||||||
|
int n;
|
||||||
|
/* degenerate case (also disallow negative lengths) */
|
||||||
|
if (len2 <= 0) {
|
||||||
|
return crc1;
|
||||||
|
}
|
||||||
|
if (!power_buf_initialized) {
|
||||||
|
power_buf[0] = 0xedb88320UL;
|
||||||
|
for (n = 0; n < 31; n++) {
|
||||||
|
power_buf[n+1] = 1U << n;
|
||||||
|
}
|
||||||
|
for (n = 1; n < 32; n++) {
|
||||||
|
gf32_matrix_square (power_buf + (n << 5), power_buf + ((n - 1) << 5));
|
||||||
|
}
|
||||||
|
power_buf_initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int *p = power_buf + 64;
|
||||||
|
do {
|
||||||
|
p += 32;
|
||||||
|
if (len2 & 1) {
|
||||||
|
crc1 = gf32_matrix_times (p, crc1);
|
||||||
|
}
|
||||||
|
len2 >>= 1;
|
||||||
|
} while (len2);
|
||||||
|
return crc1 ^ crc2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************* crc32 repair ************************/
|
||||||
|
struct fcb_table_entry {
|
||||||
|
unsigned p; //zeta ^ k
|
||||||
|
int i;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline unsigned gf32_mod (unsigned long long r, int high_bit) {
|
||||||
|
int j = high_bit;
|
||||||
|
for (j = high_bit; j >= 32; j--) {
|
||||||
|
if ((1ULL << j) & r) {
|
||||||
|
r ^= 0x04C11DB7ULL << (j - 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (unsigned) r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned gf32_mult (unsigned a, unsigned b) {
|
||||||
|
int i;
|
||||||
|
const unsigned long long m = b;
|
||||||
|
unsigned long long r = 0;
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
if (a & (1U << i)) {
|
||||||
|
r ^= m << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gf32_mod (r, 62);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned gf32_shl (unsigned int a, int shift) {
|
||||||
|
unsigned long long r = a;
|
||||||
|
r <<= shift;
|
||||||
|
return gf32_mod (r, 31 + shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned gf32_pow (unsigned a, int k) {
|
||||||
|
if (!k) { return 1; }
|
||||||
|
unsigned x = gf32_pow (gf32_mult (a, a), k >> 1);
|
||||||
|
if (k & 1) {
|
||||||
|
x = gf32_mult (x, a);
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmp_fcb_table_entry (const void *a, const void *b) {
|
||||||
|
const struct fcb_table_entry *x = a;
|
||||||
|
const struct fcb_table_entry *y = b;
|
||||||
|
if (x->p < y->p) { return -1; }
|
||||||
|
if (x->p > y->p) { return 1; }
|
||||||
|
if (x->i < y->i) { return -1; }
|
||||||
|
if (x->i > y->i) { return 1; }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GROUP_SWAP(x,m,s) ((x & m) << s) | ((x & (~m)) >> s)
|
||||||
|
static unsigned revbin (unsigned x) {
|
||||||
|
x = GROUP_SWAP(x,0x55555555U,1);
|
||||||
|
x = GROUP_SWAP(x,0x33333333U,2);
|
||||||
|
x = GROUP_SWAP(x,0x0f0f0f0fU,4);
|
||||||
|
x = __builtin_bswap32 (x);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#undef GROUP_SWAP
|
||||||
|
|
||||||
|
static inline unsigned xmult (unsigned a) {
|
||||||
|
unsigned r = a << 1;
|
||||||
|
if (a & (1U<<31)) {
|
||||||
|
r ^= 0x04C11DB7U;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int find_corrupted_bit (int size, unsigned d) {
|
||||||
|
int i, j;
|
||||||
|
size += 4;
|
||||||
|
d = revbin (d);
|
||||||
|
int n = size << 3;
|
||||||
|
int r = (int) (sqrt (n) + 0.5);
|
||||||
|
struct fcb_table_entry *T = calloc (r, sizeof (struct fcb_table_entry));
|
||||||
|
assert (T != NULL);
|
||||||
|
T[0].i = 0;
|
||||||
|
T[0].p = 1;
|
||||||
|
for (i = 1; i < r; i++) {
|
||||||
|
T[i].i = i;
|
||||||
|
T[i].p = xmult (T[i-1].p);
|
||||||
|
}
|
||||||
|
assert (xmult (0x82608EDB) == 1);
|
||||||
|
qsort (T, r, sizeof (T[0]), cmp_fcb_table_entry);
|
||||||
|
unsigned q = gf32_pow (0x82608EDB, r);
|
||||||
|
|
||||||
|
unsigned A[32];
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
A[i] = gf32_shl (q, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned x = d;
|
||||||
|
int max_j = n / r, res = -1;
|
||||||
|
for (j = 0; j <= max_j; j++) {
|
||||||
|
int a = -1, b = r;
|
||||||
|
while (b - a > 1) {
|
||||||
|
int c = ((a + b) >> 1);
|
||||||
|
if (T[c].p <= x) { a = c; } else { b = c; }
|
||||||
|
}
|
||||||
|
if (a >= 0 && T[a].p == x) {
|
||||||
|
res = T[a].i + r * j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x = gf32_matrix_times (A, x);
|
||||||
|
}
|
||||||
|
free (T);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int repair_bit (unsigned char *input, int l, int k) {
|
||||||
|
if (k < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int idx = k >> 5, bit = k & 31, i = (l - 1) - (idx - 1) * 4;
|
||||||
|
while (bit >= 8) {
|
||||||
|
i--;
|
||||||
|
bit -= 8;
|
||||||
|
}
|
||||||
|
if (i < 0) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
if (i >= l) {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
int j = 7 - bit;
|
||||||
|
input[i] ^= 1 << j;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit) {
|
||||||
|
unsigned computed_crc32 = compute_crc32 (input, l);
|
||||||
|
const unsigned crc32_diff = computed_crc32 ^ (*input_crc32);
|
||||||
|
if (!crc32_diff) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int k = find_corrupted_bit (l, crc32_diff);
|
||||||
|
int r = repair_bit (input, l, k);
|
||||||
|
if (!r) {
|
||||||
|
assert (compute_crc32 (input, l) == *input_crc32);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!(crc32_diff & (crc32_diff - 1))) { /* crc32_diff is power of 2 */
|
||||||
|
*input_crc32 = computed_crc32;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
assert (!force_exit);
|
||||||
|
*input_crc32 = computed_crc32;
|
||||||
|
return -1;
|
||||||
|
}
|
59
crc32.h
Normal file
59
crc32.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
This file is part of VK/KittenPHP-DB-Engine Library.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine Library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Copyright 2009-2012 Vkontakte Ltd
|
||||||
|
2009-2012 Nikolai Durov
|
||||||
|
2009-2012 Andrei Lopatin
|
||||||
|
2012 Anton Maydell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CRC32_H__
|
||||||
|
#define __CRC32_H__
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern unsigned int crc32_table[256];
|
||||||
|
unsigned crc32_partial (const void *data, int len, unsigned crc);
|
||||||
|
//unsigned crc32_partial_fast (const void *data, int len, unsigned crc);
|
||||||
|
//unsigned crc32_partial_fastest (const void *data, int len, unsigned crc);
|
||||||
|
unsigned compute_crc32 (const void *data, int len);
|
||||||
|
unsigned compute_crc32_combine (unsigned crc1, unsigned crc2, int len2);
|
||||||
|
|
||||||
|
extern unsigned long long crc64_table[256];
|
||||||
|
unsigned long long crc64_partial (const void *data, int len, unsigned long long crc);
|
||||||
|
unsigned long long crc64 (const void *data, int len);
|
||||||
|
|
||||||
|
//unsigned gf32_matrix_times (unsigned *matrix, unsigned vector);
|
||||||
|
|
||||||
|
/* crc32_check_and_repair returns
|
||||||
|
0 : Cyclic redundancy check is ok
|
||||||
|
1 : Cyclic redundancy check fails, but we fix one bit in input
|
||||||
|
2 : Cyclic redundancy check fails, but we fix one bit in input_crc32
|
||||||
|
-1 : Cyclic redundancy check fails, no repair possible.
|
||||||
|
In this case *input_crc32 will be equal crc32 (input, l)
|
||||||
|
|
||||||
|
Case force_exit == 1 (case 1, 2: kprintf call, case -1: assert fail).
|
||||||
|
*/
|
||||||
|
int crc32_check_and_repair (void *input, int l, unsigned *input_crc32, int force_exit);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
168
m4-ax_gcc_builtin.m4
Normal file
168
m4-ax_gcc_builtin.m4
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# http://www.gnu.org/software/autoconf-archive/ax_gcc_builtin.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_GCC_BUILTIN(BUILTIN)
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro checks if the compiler supports one of GCC's built-in
|
||||||
|
# functions; many other compilers also provide those same built-ins.
|
||||||
|
#
|
||||||
|
# The BUILTIN parameter is the name of the built-in function.
|
||||||
|
#
|
||||||
|
# If BUILTIN is supported define HAVE_<BUILTIN>. Keep in mind that since
|
||||||
|
# builtins usually start with two underscores they will be copied over
|
||||||
|
# into the HAVE_<BUILTIN> definition (e.g. HAVE___BUILTIN_EXPECT for
|
||||||
|
# __builtin_expect()).
|
||||||
|
#
|
||||||
|
# The macro caches its result in the ax_cv_have_<BUILTIN> variable (e.g.
|
||||||
|
# ax_cv_have___builtin_expect).
|
||||||
|
#
|
||||||
|
# The macro currently supports the following built-in functions:
|
||||||
|
#
|
||||||
|
# __builtin_assume_aligned
|
||||||
|
# __builtin_bswap32
|
||||||
|
# __builtin_bswap64
|
||||||
|
# __builtin_choose_expr
|
||||||
|
# __builtin___clear_cache
|
||||||
|
# __builtin_clrsb
|
||||||
|
# __builtin_clrsbl
|
||||||
|
# __builtin_clrsbll
|
||||||
|
# __builtin_clz
|
||||||
|
# __builtin_clzl
|
||||||
|
# __builtin_clzll
|
||||||
|
# __builtin_complex
|
||||||
|
# __builtin_constant_p
|
||||||
|
# __builtin_ctz
|
||||||
|
# __builtin_ctzl
|
||||||
|
# __builtin_ctzll
|
||||||
|
# __builtin_expect
|
||||||
|
# __builtin_ffs
|
||||||
|
# __builtin_ffsl
|
||||||
|
# __builtin_ffsll
|
||||||
|
# __builtin_fpclassify
|
||||||
|
# __builtin_huge_val
|
||||||
|
# __builtin_huge_valf
|
||||||
|
# __builtin_huge_vall
|
||||||
|
# __builtin_inf
|
||||||
|
# __builtin_infd128
|
||||||
|
# __builtin_infd32
|
||||||
|
# __builtin_infd64
|
||||||
|
# __builtin_inff
|
||||||
|
# __builtin_infl
|
||||||
|
# __builtin_isinf_sign
|
||||||
|
# __builtin_nan
|
||||||
|
# __builtin_nand128
|
||||||
|
# __builtin_nand32
|
||||||
|
# __builtin_nand64
|
||||||
|
# __builtin_nanf
|
||||||
|
# __builtin_nanl
|
||||||
|
# __builtin_nans
|
||||||
|
# __builtin_nansf
|
||||||
|
# __builtin_nansl
|
||||||
|
# __builtin_object_size
|
||||||
|
# __builtin_parity
|
||||||
|
# __builtin_parityl
|
||||||
|
# __builtin_parityll
|
||||||
|
# __builtin_popcount
|
||||||
|
# __builtin_popcountl
|
||||||
|
# __builtin_popcountll
|
||||||
|
# __builtin_powi
|
||||||
|
# __builtin_powif
|
||||||
|
# __builtin_powil
|
||||||
|
# __builtin_prefetch
|
||||||
|
# __builtin_trap
|
||||||
|
# __builtin_types_compatible_p
|
||||||
|
# __builtin_unreachable
|
||||||
|
#
|
||||||
|
# Unsuppored built-ins will be tested with an empty parameter set and the
|
||||||
|
# result of the check might be wrong or meaningless so use with care.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
|
||||||
|
#
|
||||||
|
# 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. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 2
|
||||||
|
|
||||||
|
AC_DEFUN([AX_GCC_BUILTIN], [
|
||||||
|
AS_VAR_PUSHDEF([ac_var], [ax_cv_have_$1])
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([for $1], [ac_var], [
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [
|
||||||
|
m4_case([$1],
|
||||||
|
[__builtin_assume_aligned], [$1("", 0)],
|
||||||
|
[__builtin_bswap32], [$1(0)],
|
||||||
|
[__builtin_bswap64], [$1(0)],
|
||||||
|
[__builtin_choose_expr], [$1(0, 0, 0)],
|
||||||
|
[__builtin___clear_cache], [$1("", "")],
|
||||||
|
[__builtin_clrsb], [$1(0)],
|
||||||
|
[__builtin_clrsbl], [$1(0)],
|
||||||
|
[__builtin_clrsbll], [$1(0)],
|
||||||
|
[__builtin_clz], [$1(0)],
|
||||||
|
[__builtin_clzl], [$1(0)],
|
||||||
|
[__builtin_clzll], [$1(0)],
|
||||||
|
[__builtin_complex], [$1(0.0, 0.0)],
|
||||||
|
[__builtin_constant_p], [$1(0)],
|
||||||
|
[__builtin_ctz], [$1(0)],
|
||||||
|
[__builtin_ctzl], [$1(0)],
|
||||||
|
[__builtin_ctzll], [$1(0)],
|
||||||
|
[__builtin_expect], [$1(0, 0)],
|
||||||
|
[__builtin_ffs], [$1(0)],
|
||||||
|
[__builtin_ffsl], [$1(0)],
|
||||||
|
[__builtin_ffsll], [$1(0)],
|
||||||
|
[__builtin_fpclassify], [$1(0, 1, 2, 3, 4, 0.0)],
|
||||||
|
[__builtin_huge_val], [$1()],
|
||||||
|
[__builtin_huge_valf], [$1()],
|
||||||
|
[__builtin_huge_vall], [$1()],
|
||||||
|
[__builtin_inf], [$1()],
|
||||||
|
[__builtin_infd128], [$1()],
|
||||||
|
[__builtin_infd32], [$1()],
|
||||||
|
[__builtin_infd64], [$1()],
|
||||||
|
[__builtin_inff], [$1()],
|
||||||
|
[__builtin_infl], [$1()],
|
||||||
|
[__builtin_isinf_sign], [$1(0.0)],
|
||||||
|
[__builtin_nan], [$1("")],
|
||||||
|
[__builtin_nand128], [$1("")],
|
||||||
|
[__builtin_nand32], [$1("")],
|
||||||
|
[__builtin_nand64], [$1("")],
|
||||||
|
[__builtin_nanf], [$1("")],
|
||||||
|
[__builtin_nanl], [$1("")],
|
||||||
|
[__builtin_nans], [$1("")],
|
||||||
|
[__builtin_nansf], [$1("")],
|
||||||
|
[__builtin_nansl], [$1("")],
|
||||||
|
[__builtin_object_size], [$1("", 0)],
|
||||||
|
[__builtin_parity], [$1(0)],
|
||||||
|
[__builtin_parityl], [$1(0)],
|
||||||
|
[__builtin_parityll], [$1(0)],
|
||||||
|
[__builtin_popcount], [$1(0)],
|
||||||
|
[__builtin_popcountl], [$1(0)],
|
||||||
|
[__builtin_popcountll], [$1(0)],
|
||||||
|
[__builtin_powi], [$1(0, 0)],
|
||||||
|
[__builtin_powif], [$1(0, 0)],
|
||||||
|
[__builtin_powil], [$1(0, 0)],
|
||||||
|
[__builtin_prefetch], [$1("")],
|
||||||
|
[__builtin_trap], [$1()],
|
||||||
|
[__builtin_types_compatible_p], [$1(int, int)],
|
||||||
|
[__builtin_unreachable], [$1()],
|
||||||
|
[m4_warn([syntax], [Unsupported built-in $1, the test may fail])
|
||||||
|
$1()]
|
||||||
|
)
|
||||||
|
])],
|
||||||
|
[AS_VAR_SET([ac_var], [yes])],
|
||||||
|
[AS_VAR_SET([ac_var], [no])])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test yes = AS_VAR_GET([ac_var])],
|
||||||
|
[AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_$1), 1,
|
||||||
|
[Define to 1 if the system has the `$1' built-in function])], [])
|
||||||
|
|
||||||
|
AS_VAR_POPDEF([ac_var])
|
||||||
|
])
|
3083
tl-parser.c
Normal file
3083
tl-parser.c
Normal file
File diff suppressed because it is too large
Load Diff
206
tl-parser.h
Normal file
206
tl-parser.h
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
This file is part of tgl-libary/tlc
|
||||||
|
|
||||||
|
Tgl-library/tlc 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.
|
||||||
|
|
||||||
|
Tgl-library/tlc 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 tgl-library/tlc. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Copyright Vitaly Valtman 2014
|
||||||
|
|
||||||
|
It is derivative work of VK/KittenPHP-DB-Engine (https://github.com/vk-com/kphp-kdb/)
|
||||||
|
Copyright 2012-2013 Vkontakte Ltd
|
||||||
|
2012-2013 Vitaliy Valtman
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TL_PARSER_NEW_H__
|
||||||
|
#define __TL_PARSER_NEW_H__
|
||||||
|
enum lex_type {
|
||||||
|
lex_error,
|
||||||
|
lex_char,
|
||||||
|
lex_triple_minus,
|
||||||
|
lex_uc_ident,
|
||||||
|
lex_lc_ident,
|
||||||
|
lex_eof,
|
||||||
|
lex_final,
|
||||||
|
lex_new,
|
||||||
|
lex_none,
|
||||||
|
lex_num,
|
||||||
|
lex_empty
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct curlex {
|
||||||
|
char *ptr;
|
||||||
|
int len;
|
||||||
|
enum lex_type type;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct parse {
|
||||||
|
char *text;
|
||||||
|
int pos;
|
||||||
|
int len;
|
||||||
|
int line;
|
||||||
|
int line_pos;
|
||||||
|
struct curlex lex;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum tree_type {
|
||||||
|
type_tl_program,
|
||||||
|
type_fun_declarations,
|
||||||
|
type_constr_declarations,
|
||||||
|
type_declaration,
|
||||||
|
type_combinator_decl,
|
||||||
|
type_equals,
|
||||||
|
type_partial_app_decl,
|
||||||
|
type_final_decl,
|
||||||
|
type_full_combinator_id,
|
||||||
|
type_opt_args,
|
||||||
|
type_args,
|
||||||
|
type_args1,
|
||||||
|
type_args2,
|
||||||
|
type_args3,
|
||||||
|
type_args4,
|
||||||
|
type_boxed_type_ident,
|
||||||
|
type_subexpr,
|
||||||
|
type_partial_comb_app_decl,
|
||||||
|
type_partial_type_app_decl,
|
||||||
|
type_final_new,
|
||||||
|
type_final_final,
|
||||||
|
type_final_empty,
|
||||||
|
// type_type,
|
||||||
|
type_var_ident,
|
||||||
|
type_var_ident_opt,
|
||||||
|
type_multiplicity,
|
||||||
|
type_type_term,
|
||||||
|
type_term,
|
||||||
|
type_percent,
|
||||||
|
type_result_type,
|
||||||
|
type_expr,
|
||||||
|
type_nat_term,
|
||||||
|
type_combinator_id,
|
||||||
|
type_nat_const,
|
||||||
|
type_type_ident,
|
||||||
|
type_builtin_combinator_decl,
|
||||||
|
type_exclam,
|
||||||
|
type_optional_arg_def
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tree {
|
||||||
|
char *text;
|
||||||
|
int len;
|
||||||
|
enum tree_type type;
|
||||||
|
int lex_line;
|
||||||
|
int lex_line_pos;
|
||||||
|
int flags;
|
||||||
|
int size;
|
||||||
|
int nc;
|
||||||
|
struct tree **c;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define TL_ACT(x) (x == act_var ? "act_var" : x == act_field ? "act_field" : x == act_plus ? "act_plus" : x == act_type ? "act_type" : x == act_nat_const ? "act_nat_const" : x == act_array ? "act_array" : x == act_question_mark ? "act_question_mark" : \
|
||||||
|
x == act_union ? "act_union" : x == act_arg ? "act_arg" : x == act_opt_field ? "act_opt_field" : "act_unknown")
|
||||||
|
|
||||||
|
#define TL_TYPE(x) (x == type_num ? "type_num" : x == type_type ? "type_type" : x == type_list_item ? "type_list_item" : x == type_list ? "type_list" : x == type_num_value ? "type_num_value" : "type_unknown")
|
||||||
|
enum combinator_tree_action {
|
||||||
|
act_var,
|
||||||
|
act_field,
|
||||||
|
act_plus,
|
||||||
|
act_type,
|
||||||
|
act_nat_const,
|
||||||
|
act_array,
|
||||||
|
act_question_mark,
|
||||||
|
act_union,
|
||||||
|
act_arg,
|
||||||
|
act_opt_field
|
||||||
|
};
|
||||||
|
|
||||||
|
enum combinator_tree_type {
|
||||||
|
type_num,
|
||||||
|
type_num_value,
|
||||||
|
type_type,
|
||||||
|
type_list_item,
|
||||||
|
type_list
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tl_combinator_tree {
|
||||||
|
enum combinator_tree_action act;
|
||||||
|
struct tl_combinator_tree *left, *right;
|
||||||
|
char *name;
|
||||||
|
void *data;
|
||||||
|
long long flags;
|
||||||
|
enum combinator_tree_type type;
|
||||||
|
int type_len;
|
||||||
|
long long type_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct tl_program {
|
||||||
|
int types_num;
|
||||||
|
int functions_num;
|
||||||
|
int constructors_num;
|
||||||
|
struct tl_type **types;
|
||||||
|
struct tl_function **functions;
|
||||||
|
// struct tl_constuctor **constructors;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tl_type {
|
||||||
|
char *id;
|
||||||
|
char *print_id;
|
||||||
|
char *real_id;
|
||||||
|
unsigned name;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
int params_num;
|
||||||
|
long long params_types;
|
||||||
|
|
||||||
|
int constructors_num;
|
||||||
|
struct tl_constructor **constructors;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tl_constructor {
|
||||||
|
char *id;
|
||||||
|
char *print_id;
|
||||||
|
char *real_id;
|
||||||
|
unsigned name;
|
||||||
|
struct tl_type *type;
|
||||||
|
|
||||||
|
struct tl_combinator_tree *left;
|
||||||
|
struct tl_combinator_tree *right;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tl_var {
|
||||||
|
char *id;
|
||||||
|
struct tl_combinator_tree *ptr;
|
||||||
|
int type;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct parse *tl_init_parse_file (const char *fname);
|
||||||
|
struct tree *tl_parse_lex (struct parse *P);
|
||||||
|
void tl_print_parse_error (void);
|
||||||
|
struct tl_program *tl_parse (struct tree *T);
|
||||||
|
|
||||||
|
void write_types (int f);
|
||||||
|
|
||||||
|
#define FLAG_BARE 1
|
||||||
|
#define FLAG_OPT_VAR (1 << 17)
|
||||||
|
#define FLAG_EXCL (1 << 18)
|
||||||
|
#define FLAG_OPT_FIELD (1 << 20)
|
||||||
|
#define FLAG_IS_VAR (1 << 21)
|
||||||
|
#define FLAG_DEFAULT_CONSTRUCTOR (1 << 25)
|
||||||
|
#define FLAG_EMPTY (1 << 10)
|
||||||
|
|
||||||
|
#endif
|
52
tl-tl.h
Normal file
52
tl-tl.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
This file is part of VK/KittenPHP-DB-Engine.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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.
|
||||||
|
|
||||||
|
VK/KittenPHP-DB-Engine 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 VK/KittenPHP-DB-Engine. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
This program is released under the GPL with the additional exemption
|
||||||
|
that compiling, linking, and/or using OpenSSL is allowed.
|
||||||
|
You are free to remove this exemption from derived works.
|
||||||
|
|
||||||
|
Copyright 2012-2013 Vkontakte Ltd
|
||||||
|
2012-2013 Vitaliy Valtman
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TL_TL_H__
|
||||||
|
#define __TL_TL_H__
|
||||||
|
|
||||||
|
#define TLS_SCHEMA 0xf19d9e38
|
||||||
|
#define TLS_TYPE 0x12eb4386
|
||||||
|
#define TLS_COMBINATOR 0x5c0a1ed5
|
||||||
|
#define TLS_COMBINATOR_LEFT_BUILTIN 0xcd211f63
|
||||||
|
#define TLS_COMBINATOR_LEFT 0x4c12c6d9
|
||||||
|
#define TLS_COMBINATOR_RIGHT 0xd325b367
|
||||||
|
#define TLS_ARG 0x46afe232
|
||||||
|
#define TLS_TREE_NAT_CONST 0xc09f07d7
|
||||||
|
#define TLS_TREE_NAT_VAR 0x90ea6f58
|
||||||
|
#define TLS_TREE_TYPE_VAR 0x1caa237a
|
||||||
|
#define TLS_TREE_ARRAY 0x80479360
|
||||||
|
#define TLS_TREE_TYPE 0x10f32190
|
||||||
|
|
||||||
|
#define TLS_SCHEMA_V2 0x3a2f9be2
|
||||||
|
#define TLS_COMBINATOR_RIGHT_V2 0x2c064372
|
||||||
|
#define TLS_ARG_V2 0x29dfe61b
|
||||||
|
#define TLS_EXPR_TYPE 0xecc9da78
|
||||||
|
#define TLS_EXPR_NAT 0xdcb49bd8
|
||||||
|
|
||||||
|
#define TLS_NAT_CONST 0xdcb49bd8
|
||||||
|
#define TLS_NAT_VAR 0x4e8a14f0
|
||||||
|
#define TLS_TYPE_VAR 0x0142ceae
|
||||||
|
#define TLS_ARRAY 0xd9fb20de
|
||||||
|
#define TLS_TYPE_EXPR 0xc1863d08
|
||||||
|
#endif
|
167
tlc.c
Normal file
167
tlc.c
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
/*
|
||||||
|
This file is part of tl-parser
|
||||||
|
|
||||||
|
tl-parser 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.
|
||||||
|
|
||||||
|
tl-parser 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 tl-parser. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Copyright Vitaly Valtman 2014
|
||||||
|
|
||||||
|
It is derivative work of VK/KittenPHP-DB-Engine (https://github.com/vk-com/kphp-kdb/)
|
||||||
|
Copyright 2012-2013 Vkontakte Ltd
|
||||||
|
2012-2013 Vitaliy Valtman
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "tl-parser.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int verbosity;
|
||||||
|
int output_expressions;
|
||||||
|
int schema_version = 2;
|
||||||
|
void usage (void) {
|
||||||
|
printf ("usage: tl-parser [-v] [-h] <TL-schema-file>\n"
|
||||||
|
"\tTL compiler\n"
|
||||||
|
"\t-v\toutput statistical and debug information into stderr\n"
|
||||||
|
"\t-E\twhenever is possible output to stdout expressions\n"
|
||||||
|
"\t-e <file>\texport serialized schema to file\n"
|
||||||
|
"\t-w\t custom version of serialized schema (0 - very old, 1 - old, 2 - current (default))\n"
|
||||||
|
);
|
||||||
|
exit (2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int vkext_write (const char *filename) {
|
||||||
|
int f = open (filename, O_CREAT | O_WRONLY | O_TRUNC, 0640);
|
||||||
|
assert (f >= 0);
|
||||||
|
write_types (f);
|
||||||
|
close (f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
|
||||||
|
void logprintf (const char *format __attribute__ ((unused)), ...) {
|
||||||
|
va_list ap;
|
||||||
|
va_start (ap, format);
|
||||||
|
vfprintf (stderr, format, ap);
|
||||||
|
va_end (ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hexdump (int *in_ptr, int *in_end) {
|
||||||
|
int *ptr = in_ptr;
|
||||||
|
while (ptr < in_end) { printf (" %08x", *(ptr ++)); }
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_EXECINFO_H
|
||||||
|
void print_backtrace (void) {
|
||||||
|
void *buffer[255];
|
||||||
|
const int calls = backtrace (buffer, sizeof (buffer) / sizeof (void *));
|
||||||
|
backtrace_symbols_fd (buffer, calls, 1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void print_backtrace (void) {
|
||||||
|
if (write (1, "No libexec. Backtrace disabled\n", 32) < 0) {
|
||||||
|
// Sad thing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void sig_segv_handler (int signum __attribute__ ((unused))) {
|
||||||
|
if (write (1, "SIGSEGV received\n", 18) < 0) {
|
||||||
|
// Sad thing
|
||||||
|
}
|
||||||
|
print_backtrace ();
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sig_abrt_handler (int signum __attribute__ ((unused))) {
|
||||||
|
if (write (1, "SIGABRT received\n", 18) < 0) {
|
||||||
|
// Sad thing
|
||||||
|
}
|
||||||
|
print_backtrace ();
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv) {
|
||||||
|
signal (SIGSEGV, sig_segv_handler);
|
||||||
|
signal (SIGABRT, sig_abrt_handler);
|
||||||
|
int i;
|
||||||
|
char *vkext_file = 0;
|
||||||
|
while ((i = getopt (argc, argv, "Ehve:w:")) != -1) {
|
||||||
|
switch (i) {
|
||||||
|
case 'E':
|
||||||
|
output_expressions++;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage ();
|
||||||
|
return 2;
|
||||||
|
case 'e':
|
||||||
|
vkext_file = optarg;
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
schema_version = atoi (optarg);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbosity++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc != optind + 1) {
|
||||||
|
usage ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct parse *P = tl_init_parse_file (argv[optind]);
|
||||||
|
if (!P) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
struct tree *T;
|
||||||
|
if (!(T = tl_parse_lex (P))) {
|
||||||
|
fprintf (stderr, "Error in parse:\n");
|
||||||
|
tl_print_parse_error ();
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (verbosity) {
|
||||||
|
fprintf (stderr, "Parse ok\n");
|
||||||
|
}
|
||||||
|
if (!tl_parse (T)) {
|
||||||
|
if (verbosity) {
|
||||||
|
fprintf (stderr, "Fail\n");
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
if (verbosity) {
|
||||||
|
fprintf (stderr, "Ok\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vkext_file) {
|
||||||
|
vkext_write (vkext_file);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
178
tree.h
Normal file
178
tree.h
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
This file is part of tgl-library
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Copyright Vitaly Valtman 2013-2014
|
||||||
|
*/
|
||||||
|
#ifndef __TREE_H__
|
||||||
|
#define __TREE_H__
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#pragma pack(push,4)
|
||||||
|
#define DEFINE_TREE(X_NAME, X_TYPE, X_CMP, X_UNSET) \
|
||||||
|
struct tree_ ## X_NAME { \
|
||||||
|
struct tree_ ## X_NAME *left, *right;\
|
||||||
|
X_TYPE x;\
|
||||||
|
int y;\
|
||||||
|
};\
|
||||||
|
\
|
||||||
|
static struct tree_ ## X_NAME *new_tree_node_ ## X_NAME (X_TYPE x, int y) {\
|
||||||
|
struct tree_ ## X_NAME *T = malloc (sizeof (*T));\
|
||||||
|
T->x = x;\
|
||||||
|
T->y = y;\
|
||||||
|
T->left = T->right = 0;\
|
||||||
|
return T;\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static void delete_tree_node_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||||
|
free (T);\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static void tree_split_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, struct tree_ ## X_NAME **L, struct tree_ ## X_NAME **R) {\
|
||||||
|
if (!T) {\
|
||||||
|
*L = *R = 0;\
|
||||||
|
} else {\
|
||||||
|
int c = X_CMP (x, T->x);\
|
||||||
|
if (c < 0) {\
|
||||||
|
tree_split_ ## X_NAME (T->left, x, L, &T->left);\
|
||||||
|
*R = T;\
|
||||||
|
} else {\
|
||||||
|
tree_split_ ## X_NAME (T->right, x, &T->right, R);\
|
||||||
|
*L = T;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) __attribute__ ((warn_unused_result,unused));\
|
||||||
|
static struct tree_ ## X_NAME *tree_insert_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x, int y) {\
|
||||||
|
if (!T) {\
|
||||||
|
return new_tree_node_ ## X_NAME (x, y);\
|
||||||
|
} else {\
|
||||||
|
if (y > T->y) {\
|
||||||
|
struct tree_ ## X_NAME *N = new_tree_node_ ## X_NAME (x, y);\
|
||||||
|
tree_split_ ## X_NAME (T, x, &N->left, &N->right);\
|
||||||
|
return N;\
|
||||||
|
} else {\
|
||||||
|
int c = X_CMP (x, T->x);\
|
||||||
|
assert (c);\
|
||||||
|
if (c < 0) { \
|
||||||
|
T->left = tree_insert_ ## X_NAME (T->left, x, y);\
|
||||||
|
} else { \
|
||||||
|
T->right = tree_insert_ ## X_NAME (T->right, x, y);\
|
||||||
|
} \
|
||||||
|
return T; \
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static struct tree_ ## X_NAME *tree_merge_ ## X_NAME (struct tree_ ## X_NAME *L, struct tree_ ## X_NAME *R) {\
|
||||||
|
if (!L || !R) {\
|
||||||
|
return L ? L : R;\
|
||||||
|
} else {\
|
||||||
|
if (L->y > R->y) {\
|
||||||
|
L->right = tree_merge_ ## X_NAME (L->right, R);\
|
||||||
|
return L;\
|
||||||
|
} else {\
|
||||||
|
R->left = tree_merge_ ## X_NAME (L, R->left);\
|
||||||
|
return R;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((warn_unused_result,unused));\
|
||||||
|
static struct tree_ ## X_NAME *tree_delete_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||||
|
assert (T);\
|
||||||
|
int c = X_CMP (x, T->x);\
|
||||||
|
if (!c) {\
|
||||||
|
struct tree_ ## X_NAME *N = tree_merge_ ## X_NAME (T->left, T->right);\
|
||||||
|
delete_tree_node_ ## X_NAME (T);\
|
||||||
|
return N;\
|
||||||
|
} else {\
|
||||||
|
if (c < 0) { \
|
||||||
|
T->left = tree_delete_ ## X_NAME (T->left, x); \
|
||||||
|
} else { \
|
||||||
|
T->right = tree_delete_ ## X_NAME (T->right, x); \
|
||||||
|
} \
|
||||||
|
return T; \
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *t) __attribute__ ((unused));\
|
||||||
|
static X_TYPE tree_get_min_ ## X_NAME (struct tree_ ## X_NAME *T) {\
|
||||||
|
if (!T) { return X_UNSET; } \
|
||||||
|
while (T->left) { T = T->left; }\
|
||||||
|
return T->x; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) __attribute__ ((unused));\
|
||||||
|
static X_TYPE tree_lookup_ ## X_NAME (struct tree_ ## X_NAME *T, X_TYPE x) {\
|
||||||
|
int c;\
|
||||||
|
while (T && (c = X_CMP (x, T->x))) {\
|
||||||
|
T = (c < 0 ? T->left : T->right);\
|
||||||
|
}\
|
||||||
|
return T ? T->x : X_UNSET;\
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) __attribute__ ((unused));\
|
||||||
|
static void tree_act_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE)) {\
|
||||||
|
if (!T) { return; } \
|
||||||
|
tree_act_ ## X_NAME (T->left, act); \
|
||||||
|
act (T->x); \
|
||||||
|
tree_act_ ## X_NAME (T->right, act); \
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) __attribute__ ((unused));\
|
||||||
|
static void tree_act_ex_ ## X_NAME (struct tree_ ## X_NAME *T, void (*act)(X_TYPE, void *), void *extra) {\
|
||||||
|
if (!T) { return; } \
|
||||||
|
tree_act_ex_ ## X_NAME (T->left, act, extra); \
|
||||||
|
act (T->x, extra); \
|
||||||
|
tree_act_ex_ ## X_NAME (T->right, act, extra); \
|
||||||
|
}\
|
||||||
|
\
|
||||||
|
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||||
|
static int tree_count_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||||
|
if (!T) { return 0; }\
|
||||||
|
return 1 + tree_count_ ## X_NAME (T->left) + tree_count_ ## X_NAME (T->right); \
|
||||||
|
}\
|
||||||
|
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||||
|
static void tree_check_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||||
|
if (!T) { return; }\
|
||||||
|
if (T->left) { \
|
||||||
|
assert (T->left->y <= T->y);\
|
||||||
|
assert (X_CMP (T->left->x, T->x) < 0); \
|
||||||
|
}\
|
||||||
|
if (T->right) { \
|
||||||
|
assert (T->right->y <= T->y);\
|
||||||
|
assert (X_CMP (T->right->x, T->x) > 0); \
|
||||||
|
}\
|
||||||
|
tree_check_ ## X_NAME (T->left); \
|
||||||
|
tree_check_ ## X_NAME (T->right); \
|
||||||
|
}\
|
||||||
|
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) __attribute__ ((unused));\
|
||||||
|
static struct tree_ ## X_NAME *tree_clear_ ## X_NAME (struct tree_ ## X_NAME *T) { \
|
||||||
|
if (!T) { return 0; }\
|
||||||
|
tree_clear_ ## X_NAME (T->left); \
|
||||||
|
tree_clear_ ## X_NAME (T->right); \
|
||||||
|
delete_tree_node_ ## X_NAME (T); \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
|
||||||
|
#define int_cmp(a,b) ((a) - (b))
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user