From f4c9d753701c3cf1bab135ff5dc606e6fbd46fa3 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 12 Feb 2016 18:45:02 +0100 Subject: [PATCH] dictBuilder => zdict --- Makefile | 4 - dictBuilder/COPYING | 339 ------------------- dictBuilder/Makefile | 68 ---- dictBuilder/dibcli.c | 263 -------------- dictBuilder/dibio.c | 275 --------------- dictBuilder/dibio.h | 64 ---- dictBuilder/dictionary | Bin 112640 -> 0 bytes lib/Makefile | 5 +- lib/{dictBuilder.c => zdict.c} | 4 +- lib/{dictBuilder.h => zdict.h} | 0 lib/{dictBuilder_static.h => zdict_static.h} | 2 +- programs/Makefile | 4 +- programs/dibio.c | 14 +- programs/dibio.h | 2 +- 14 files changed, 12 insertions(+), 1032 deletions(-) delete mode 100644 dictBuilder/COPYING delete mode 100644 dictBuilder/Makefile delete mode 100644 dictBuilder/dibcli.c delete mode 100644 dictBuilder/dibio.c delete mode 100644 dictBuilder/dibio.h delete mode 100644 dictBuilder/dictionary rename lib/{dictBuilder.c => zdict.c} (99%) rename lib/{dictBuilder.h => zdict.h} (100%) rename lib/{dictBuilder_static.h => zdict_static.h} (99%) diff --git a/Makefile b/Makefile index c80b20f39..93d5e0528 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,6 @@ PRGDIR = programs ZSTDDIR = lib -DICTDIR = dictBuilder # Define nul output ifneq (,$(filter Windows%,$(OS))) @@ -51,7 +50,6 @@ default: zstdprogram all: $(MAKE) -C $(ZSTDDIR) $@ $(MAKE) -C $(PRGDIR) $@ - $(MAKE) -C $(DICTDIR) $@ zstdprogram: $(MAKE) -C $(PRGDIR) @@ -59,7 +57,6 @@ zstdprogram: clean: @$(MAKE) -C $(ZSTDDIR) $@ > $(VOID) @$(MAKE) -C $(PRGDIR) $@ > $(VOID) - @$(MAKE) -C $(DICTDIR) $@ > $(VOID) @echo Cleaning completed @@ -80,7 +77,6 @@ travis-install: test: $(MAKE) -C $(PRGDIR) $@ - $(MAKE) -C $(DICTDIR) $@ cmaketest: cd contrib/cmake ; cmake . ; $(MAKE) diff --git a/dictBuilder/COPYING b/dictBuilder/COPYING deleted file mode 100644 index d159169d1..000000000 --- a/dictBuilder/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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. - - - Copyright (C) - - 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. - - , 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. diff --git a/dictBuilder/Makefile b/dictBuilder/Makefile deleted file mode 100644 index 949995253..000000000 --- a/dictBuilder/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -# ########################################################################## -# Dict Builder - Makefile -# Copyright (C) Yann Collet 2016 -# -# GPL v2 License -# -# 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. -# -# You can contact the author at : -# - ZSTD homepage : http://www.zstd.net/ -# ########################################################################## - -CPPFLAGS= -I../lib -CFLAGS ?= -O3 -CFLAGS += -std=c99 -Wall -Wextra -Wshadow -Wcast-qual -Wcast-align -Wundef -Wstrict-prototypes -Wstrict-aliasing=1 -FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS) - -ZSTDDIR = ../lib - - -# Define *.exe as extension for Windows systems -ifneq (,$(filter Windows%,$(OS))) -EXT =.exe -VOID = nul -else -EXT = -VOID = /dev/null -endif - - -.PHONY: default all test - -default: dictBuilder - -all: dictBuilder - -dictBuilder: dibio.c dibcli.c $(ZSTDDIR)/dictBuilder.c $(ZSTDDIR)/huff0.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/divsufsort.c - $(CC) $(FLAGS) $^ -o $@$(EXT) - -clean: - @rm -f core *.o tmp* result* *.gcda \ - dictBuilder$(EXT) - @echo Cleaning completed - -test: dictBuilder - ./dictBuilder * - @rm dictionary - -clangtest: CC = clang -clangtest: CFLAGS += -Werror -clangtest: clean dictBuilder - -gpptest: CC = g++ -gpptest: CFLAGS=-O3 -Wall -Wextra -Wshadow -Wcast-align -Wcast-qual -Wundef -Werror -gpptest: clean dictBuilder - diff --git a/dictBuilder/dibcli.c b/dictBuilder/dibcli.c deleted file mode 100644 index a8009ae63..000000000 --- a/dictBuilder/dibcli.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - dibcli - Command Line Interface (cli) for Dictionary Builder - Copyright (C) Yann Collet 2016 - - GPL v2 License - - 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. - - You can contact the author at : - - zstd source repository : https://github.com/Cyan4973/zstd -*/ - -/* ************************************** -* Compiler Specifics -****************************************/ -/* Disable some Visual warning messages */ -#ifdef _MSC_VER -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -#endif - - -/*-************************************ -* Includes -**************************************/ -#include /* exit, calloc, free */ -#include /* strcmp, strlen */ -#include /* fprintf, getchar */ -#include "dibio.h" -#include "zstd.h" /* version numbers */ - - -/*-************************************ -* Constants -**************************************/ -#define PROGRAM_DESCRIPTION "Dictionary builder" -#ifndef PROGRAM_VERSION -# define QUOTE(str) #str -# define EXP_Q(str) QUOTE(str) -# define PROGRAM_VERSION "v" EXP_Q(ZSTD_VERSION_MAJOR) "." EXP_Q(ZSTD_VERSION_MINOR) "." EXP_Q(ZSTD_VERSION_RELEASE) -#endif -#define AUTHOR "Yann Collet" -#define WELCOME_MESSAGE "*** %s %s %i-bits, by %s ***\n", PROGRAM_DESCRIPTION, PROGRAM_VERSION, (int)(sizeof(void*)*8), AUTHOR - -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) - -static const unsigned compressionLevelDefault = 5; -static const unsigned selectionLevelDefault = 9; /* determined experimentally */ -static const unsigned maxDictSizeDefault = 110 KB; -static const char* dictFileNameDefault = "dictionary"; - - -/*-************************************ -* Display Macros -**************************************/ -#define DISPLAY(...) fprintf(g_displayOut, __VA_ARGS__) -#define DISPLAYLEVEL(l, ...) if (g_displayLevel>=l) { DISPLAY(__VA_ARGS__); } -static FILE* g_displayOut; -static unsigned g_displayLevel = 2; // 0 : no display // 1: errors // 2 : + result + interaction + warnings ; // 3 : + progression; // 4 : + information - - -/*-************************************ -* Exceptions -**************************************/ -#define DEBUG 0 -#define DEBUGOUTPUT(...) if (DEBUG) DISPLAY(__VA_ARGS__); -#define EXM_THROW(error, ...) \ -{ \ - DEBUGOUTPUT("Error defined at %s, line %i : \n", __FILE__, __LINE__); \ - DISPLAYLEVEL(1, "Error %i : ", error); \ - DISPLAYLEVEL(1, __VA_ARGS__); \ - DISPLAYLEVEL(1, "\n"); \ - exit(error); \ -} - - -/*-************************************ -* Command Line -**************************************/ -static int usage(const char* programName) -{ - DISPLAY( "Usage :\n"); - DISPLAY( " %s [arg] [filenames]\n", programName); - DISPLAY( "\n"); - DISPLAY( "Arguments :\n"); - DISPLAY( " -o : name of dictionary file (default: %s) \n", dictFileNameDefault); - DISPLAY( "--maxdict : limit dictionary to specified size (default : %u) \n", maxDictSizeDefault); - DISPLAY( " -h/-H : display help/long help and exit\n"); - return 0; -} - -static int usage_advanced(const char* programName) -{ - DISPLAY(WELCOME_MESSAGE); - usage(programName); - DISPLAY( "\n"); - DISPLAY( "Advanced arguments :\n"); - DISPLAY( " -V : display Version number and exit\n"); - DISPLAY( "--fast : fast sampling mode\n"); - DISPLAY( " -L# : target compression level (default: %u)\n", compressionLevelDefault); - DISPLAY( " -S# : dictionary selectivity level (default: %u)\n", selectionLevelDefault); - DISPLAY( " -v : verbose mode\n"); - DISPLAY( " -q : suppress notifications; specify twice to suppress errors too\n"); - return 0; -} - -static int badusage(const char* programName) -{ - DISPLAYLEVEL(1, "Incorrect parameters\n"); - if (g_displayLevel >= 1) usage(programName); - return 1; -} - - -static void waitEnter(void) -{ - int unused; - DISPLAY("Press enter to continue...\n"); - unused = getchar(); - (void)unused; -} - - -int main(int argCount, const char** argv) -{ - int i, - main_pause=0, - operationResult=0, - nextArgumentIsMaxDict=0, - nextArgumentIsDictFileName=0; - unsigned cLevel = compressionLevelDefault; - unsigned maxDictSize = maxDictSizeDefault; - unsigned selectionLevel = selectionLevelDefault; - const char** filenameTable = (const char**)malloc(argCount * sizeof(const char*)); /* argCount >= 1 */ - unsigned filenameIdx = 0; - const char* programName = argv[0]; - const char* dictFileName = dictFileNameDefault; - - /* init */ - g_displayOut = stderr; /* unfortunately, cannot be set at declaration */ - if (filenameTable==NULL) EXM_THROW(1, "not enough memory\n"); - /* Pick out program name from path. Don't rely on stdlib because of conflicting behavior */ - for (i = (int)strlen(programName); i > 0; i--) { if ((programName[i] == '/') || (programName[i] == '\\')) { i++; break; } } - programName += i; - - /* command switches */ - for(i=1; i='0') && (*argument<='9')) - maxDictSize = maxDictSize * 10 + (*argument - '0'), argument++; - if (*argument=='k' || *argument=='K') - maxDictSize <<= 10; - continue; - } - - /* long commands (--long-word) */ - if (!strcmp(argument, "--version")) { g_displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; } - if (!strcmp(argument, "--help")) { g_displayOut=stdout; return usage_advanced(programName); } - if (!strcmp(argument, "--verbose")) { g_displayLevel++; if (g_displayLevel<3) g_displayLevel=3; continue; } - if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; } - if (!strcmp(argument, "--maxdict")) { nextArgumentIsMaxDict=1; continue; } - if (!strcmp(argument, "--fast")) { selectionLevel=1; cLevel=1; continue; } - - /* Decode commands (note : aggregated commands are allowed) */ - if (argument[0]=='-') { - argument++; - - while (argument[0]!=0) { - switch(argument[0]) - { - /* Display help */ - case 'V': g_displayOut=stdout; DISPLAY(WELCOME_MESSAGE); return 0; /* Version Only */ - case 'H': - case 'h': g_displayOut=stdout; return usage_advanced(programName); - - /* Selection level */ - case 'S': argument++; - selectionLevel = 0; - while ((*argument >= '0') && (*argument <= '9')) - selectionLevel *= 10, selectionLevel += *argument++ - '0'; - break; - - /* Selection level */ - case 'L': argument++; - cLevel = 0; - while ((*argument >= '0') && (*argument <= '9')) - cLevel *= 10, cLevel += *argument++ - '0'; - break; - - /* Verbose mode */ - case 'v': g_displayLevel++; if (g_displayLevel<3) g_displayLevel=3; argument++; break; - - /* Quiet mode */ - case 'q': g_displayLevel--; argument++; break; - - /* dictionary name */ - case 'o': nextArgumentIsDictFileName=1; argument++; break; - - /* Pause at the end (hidden option) */ - case 'p': main_pause=1; argument++; break; - - /* unknown command */ - default : return badusage(programName); - } } - continue; - } - - /* add filename to list */ - filenameTable[filenameIdx++] = argument; - } - - /* Welcome message (if verbose) */ - DISPLAYLEVEL(3, WELCOME_MESSAGE); - - /* check nb files */ - if (filenameIdx==0) return badusage(programName); - if (filenameIdx < 100) - { - DISPLAYLEVEL(2, "Warning : set contains only %u files ... \n", filenameIdx); - DISPLAYLEVEL(3, "!! For better results, consider providing > 1.000 samples !!\n"); - DISPLAYLEVEL(3, "!! Each sample should preferably be stored as a separate file !!\n"); - } - - /* building ... */ - { - ZDICT_params_t param; - param.selectivityLevel = selectionLevel; - param.compressionLevel = cLevel; - DiB_setNotificationLevel(g_displayLevel); - operationResult = DiB_trainFromFiles(dictFileName, maxDictSize, - filenameTable, filenameIdx, - param); - } - - if (main_pause) waitEnter(); - free((void*)filenameTable); - return operationResult; -} diff --git a/dictBuilder/dibio.c b/dictBuilder/dibio.c deleted file mode 100644 index a471d5450..000000000 --- a/dictBuilder/dibio.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - dibio - I/O API for dictionary builder - Copyright (C) Yann Collet 2016 - - GPL v2 License - - 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. - - You can contact the author at : - - zstd homepage : http://www.zstd.net/ -*/ - -/*-************************************** -* Compiler Options -****************************************/ -/* Disable some Visual warning messages */ -#ifdef _MSC_VER -# define _CRT_SECURE_NO_WARNINGS /* fopen */ -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -#endif - -/* Unix Large Files support (>4GB) */ -#define _FILE_OFFSET_BITS 64 -#if (defined(__sun__) && (!defined(__LP64__))) /* Sun Solaris 32-bits requires specific definitions */ -# define _LARGEFILE_SOURCE -#elif ! defined(__LP64__) /* No point defining Large file for 64 bit */ -# define _LARGEFILE64_SOURCE -#endif - - -/*-************************************* -* Includes -***************************************/ -#include /* malloc, free */ -#include /* memset */ -#include /* fprintf, fopen, ftello64 */ -#include /* stat64 */ -#include /* stat64 */ -#include /* clock */ - -#include "mem.h" /* read */ -#include "error_private.h" -#include "dictBuilder_static.h" - -/*-************************************* -* Compiler specifics -***************************************/ -#if !defined(S_ISREG) -# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) -#endif - - -/*-************************************* -* Constants -***************************************/ -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) - -#define DICTLISTSIZE 10000 -#define MEMMULT 11 -static const size_t maxMemory = (sizeof(size_t) == 4) ? (2 GB - 64 MB) : ((size_t)(512 MB) << sizeof(size_t)); - -#define NOISELENGTH 32 -#define PRIME1 2654435761U -#define PRIME2 2246822519U - - -/*-************************************* -* Console display -***************************************/ -#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) -#define DISPLAYLEVEL(l, ...) if (g_displayLevel>=l) { DISPLAY(__VA_ARGS__); } -static unsigned g_displayLevel = 0; /* 0 : no display; 1: errors; 2: default; 4: full information */ -void DiB_setNotificationLevel(unsigned l) { g_displayLevel=l; ZDICT_setNotificationLevel(l); } - -void DiB_printHex(U32 dlevel, const void* ptr, size_t length) -{ - const BYTE* const b = (const BYTE*)ptr; - size_t u; - for (u=0; u126) c = '.'; /* non-printable char */ - DISPLAYLEVEL(dlevel, "%c", c); - } -} - - -/*-************************************* -* Exceptions -***************************************/ -#ifndef DEBUG -# define DEBUG 0 -#endif -#define DEBUGOUTPUT(...) if (DEBUG) DISPLAY(__VA_ARGS__); -#define EXM_THROW(error, ...) \ -{ \ - DEBUGOUTPUT("Error defined at %s, line %i : \n", __FILE__, __LINE__); \ - DISPLAYLEVEL(1, "Error %i : ", error); \ - DISPLAYLEVEL(1, __VA_ARGS__); \ - DISPLAYLEVEL(1, "\n"); \ - exit(error); \ -} - - -/* ******************************************************** -* Helper functions -**********************************************************/ -unsigned DiB_isError(size_t errorCode) { return ERR_isError(errorCode); } - -const char* DiB_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); } - - -/* ******************************************************** -* File related operations -**********************************************************/ -static unsigned long long DiB_getFileSize(const char* infilename) -{ - int r; -#if defined(_MSC_VER) - struct _stat64 statbuf; - r = _stat64(infilename, &statbuf); -#else - struct stat statbuf; - r = stat(infilename, &statbuf); -#endif - if (r || !S_ISREG(statbuf.st_mode)) return 0; /* No good... */ - return (unsigned long long)statbuf.st_size; -} - - -static unsigned long long DiB_getTotalFileSize(const char** fileNamesTable, unsigned nbFiles) -{ - unsigned long long total = 0; - unsigned n; - for (n=0; n bufferSize-pos) fileSize = 0; /* stop there, not enough memory to load all files */ - readSize = fread(buff+pos, 1, (size_t)fileSize, f); - if (readSize != (size_t)fileSize) EXM_THROW(11, "could not read %s", fileNamesTable[n]); - pos += readSize; - fileSizes[n] = (size_t)fileSize; - fclose(f); - } -} - - -/*-******************************************************** -* Dictionary training functions -**********************************************************/ -static size_t DiB_findMaxMem(unsigned long long requiredMem) -{ - size_t step = 8 MB; - void* testmem = NULL; - - requiredMem = (((requiredMem >> 23) + 1) << 23); - requiredMem += 2 * step; - if (requiredMem > maxMemory) requiredMem = maxMemory; - - while (!testmem) { - requiredMem -= step; - testmem = malloc((size_t)requiredMem); - } - - free(testmem); - return (size_t)(requiredMem - step); -} - - -static void DiB_fillNoise(void* buffer, size_t length) -{ - unsigned acc = PRIME1; - size_t p=0;; - - for (p=0; p> 21); - } -} - - -static void DiB_saveDict(const char* dictFileName, - const void* buff, size_t buffSize) -{ - FILE* f; - size_t n; - - f = fopen(dictFileName, "wb"); - if (f==NULL) EXM_THROW(3, "cannot open %s ", dictFileName); - - n = fwrite(buff, 1, buffSize, f); - if (n!=buffSize) EXM_THROW(4, "%s : write error", dictFileName) - - n = (size_t)fclose(f); - if (n!=0) EXM_THROW(5, "%s : flush error", dictFileName) -} - - -int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, - const char** fileNamesTable, unsigned nbFiles, - ZDICT_params_t params) -{ - void* srcBuffer; - size_t benchedSize; - size_t* fileSizes = (size_t*)malloc(nbFiles * sizeof(size_t)); - unsigned long long totalSizeToLoad = DiB_getTotalFileSize(fileNamesTable, nbFiles); - void* dictBuffer = malloc(maxDictSize); - size_t dictSize; - int result = 0; - - /* init */ - benchedSize = DiB_findMaxMem(totalSizeToLoad * MEMMULT) / MEMMULT; - if ((unsigned long long)benchedSize > totalSizeToLoad) benchedSize = (size_t)totalSizeToLoad; - if (benchedSize < totalSizeToLoad) - DISPLAYLEVEL(1, "Not enough memory; training on %u MB only...\n", (unsigned)(benchedSize >> 20)); - - /* Memory allocation & restrictions */ - srcBuffer = malloc(benchedSize+NOISELENGTH); /* + noise */ - if ((!fileSizes) || (!srcBuffer) || (!dictBuffer)) EXM_THROW(12, "not enough memory for DiB_trainFiles"); /* should not happen */ - - /* Load input buffer */ - DiB_loadFiles(srcBuffer, benchedSize, fileSizes, fileNamesTable, nbFiles); - DiB_fillNoise((char*)srcBuffer + benchedSize, NOISELENGTH); /* guard band, for end of buffer condition */ - - /* call buffer version */ - dictSize = ZDICT_trainFromBuffer_unsafe(dictBuffer, maxDictSize, - srcBuffer, fileSizes, nbFiles, - params); - if (ZDICT_isError(dictSize)) { - DISPLAYLEVEL(1, "dictionary training failed : %s", ZDICT_getErrorName(dictSize)); /* should not happen */ - result = 1; - goto _cleanup; - } - - /* save dict */ - DISPLAYLEVEL(2, "Save dictionary of size %u into file %s \n", (U32)dictSize, dictFileName); - DiB_saveDict(dictFileName, dictBuffer, dictSize); - - /* clean up */ -_cleanup: - free(srcBuffer); - free(dictBuffer); - free(fileSizes); - return result; -} diff --git a/dictBuilder/dibio.h b/dictBuilder/dibio.h deleted file mode 100644 index c9aee1fcd..000000000 --- a/dictBuilder/dibio.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - dibio.h - I/O API for dictionary builder - Copyright (C) Yann Collet 2016 - - GPL v2 License - - 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. - - You can contact the author at : - - zstd source repository : https://github.com/Cyan4973/zstd - - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c -*/ - -/* This library is designed for a single-threaded console application. -* It exit() and printf() into stderr when it encounters an error condition. */ - -#ifndef DIBIO_H_003 -#define DIBIO_H_003 - - -/*-************************************* -* Dependencies -***************************************/ -#include "dictBuilder_static.h" /* ZDICT_params_t */ - - -/*-************************************* -* Public functions -***************************************/ -/*! DiB_trainFromFiles() : - Train a dictionary from a set of files provided by `fileNamesTable`. - Resulting dictionary is written into file `dictFileName`. - `parameters` is optional and can be provided with values set to 0, meaning "default". - @return : 0 == ok. Any other : error. -*/ -int DiB_trainFromFiles(const char* dictFileName, unsigned maxDictSize, - const char** fileNamesTable, unsigned nbFiles, - ZDICT_params_t parameters); - - -/*-************************************* -* Helper functions -***************************************/ -/*! DiB_setNotificationLevel - Set amount of notification to be displayed on the console. - default initial value : 0 = no console notification. - Note : not thread-safe (use a global constant) -*/ -void DiB_setNotificationLevel(unsigned l); - - -#endif diff --git a/dictBuilder/dictionary b/dictBuilder/dictionary deleted file mode 100644 index d6bf575c61f3b366de2c0aadadb0b484deaf377d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112640 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≀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 c = '.'; /* non-printable char */ - DISPLAYLEVEL(dlevel, "%c", c); - } -} - /*-************************************* * Exceptions diff --git a/programs/dibio.h b/programs/dibio.h index 9b8deb54b..4d24cc16a 100644 --- a/programs/dibio.h +++ b/programs/dibio.h @@ -32,7 +32,7 @@ /*-************************************* * Dependencies ***************************************/ -#include "dictBuilder_static.h" /* ZDICT_params_t */ +#include "zdict_static.h" /* ZDICT_params_t */ /*-*************************************