mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-11 05:42:58 +00:00
Merge branch 'master' of /home/wd/git/u-boot/master/
This commit is contained in:
commit
46edbc545d
89 changed files with 2283 additions and 2026 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -54,6 +54,7 @@ series
|
||||||
cscope.*
|
cscope.*
|
||||||
|
|
||||||
# tags files
|
# tags files
|
||||||
|
/tags
|
||||||
/ctags
|
/ctags
|
||||||
/etags
|
/etags
|
||||||
|
|
||||||
|
|
21
Makefile
21
Makefile
|
@ -140,8 +140,8 @@ endif
|
||||||
# The "tools" are needed early, so put this first
|
# The "tools" are needed early, so put this first
|
||||||
# Don't include stuff already done in $(LIBS)
|
# Don't include stuff already done in $(LIBS)
|
||||||
SUBDIRS = tools \
|
SUBDIRS = tools \
|
||||||
examples \
|
examples/standalone \
|
||||||
api_examples
|
examples/api
|
||||||
|
|
||||||
.PHONY : $(SUBDIRS)
|
.PHONY : $(SUBDIRS)
|
||||||
|
|
||||||
|
@ -3592,11 +3592,16 @@ grsim_leon2_config : unconfig
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -f $(obj)examples/82559_eeprom $(obj)examples/eepro100_eeprom \
|
@rm -f $(obj)examples/standalone/82559_eeprom \
|
||||||
$(obj)examples/hello_world $(obj)examples/interrupt \
|
$(obj)examples/standalone/eepro100_eeprom \
|
||||||
$(obj)examples/mem_to_mem_idma2intr \
|
$(obj)examples/standalone/hello_world \
|
||||||
$(obj)examples/sched $(obj)examples/smc91111_eeprom \
|
$(obj)examples/standalone/interrupt \
|
||||||
$(obj)examples/test_burst $(obj)examples/timer
|
$(obj)examples/standalone/mem_to_mem_idma2intr \
|
||||||
|
$(obj)examples/standalone/sched \
|
||||||
|
$(obj)examples/standalone/smc91111_eeprom \
|
||||||
|
$(obj)examples/standalone/test_burst \
|
||||||
|
$(obj)examples/standalone/timer
|
||||||
|
@rm -f $(obj)examples/api/demo{,.bin}
|
||||||
@rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \
|
@rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \
|
||||||
$(obj)tools/env/{fw_printenv,fw_setenv} \
|
$(obj)tools/env/{fw_printenv,fw_setenv} \
|
||||||
$(obj)tools/envcrc \
|
$(obj)tools/envcrc \
|
||||||
|
@ -3613,7 +3618,7 @@ clean:
|
||||||
@rm -f $(obj)include/bmp_logo.h
|
@rm -f $(obj)include/bmp_logo.h
|
||||||
@rm -f $(obj)nand_spl/{u-boot-spl,u-boot-spl.map,System.map}
|
@rm -f $(obj)nand_spl/{u-boot-spl,u-boot-spl.map,System.map}
|
||||||
@rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map}
|
@rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map}
|
||||||
@rm -f $(obj)api_examples/demo $(TIMESTAMP_FILE) $(VERSION_FILE)
|
@rm -f $(TIMESTAMP_FILE) $(VERSION_FILE)
|
||||||
@find $(OBJTREE) -type f \
|
@find $(OBJTREE) -type f \
|
||||||
\( -name 'core' -o -name '*.bak' -o -name '*~' \
|
\( -name 'core' -o -name '*.bak' -o -name '*~' \
|
||||||
-o -name '*.o' -o -name '*.a' -o -name '*.exe' \) -print \
|
-o -name '*.o' -o -name '*.a' -o -name '*.exe' \) -print \
|
||||||
|
|
|
@ -203,8 +203,9 @@ static int ivm_check_crc (unsigned char *buf, int block)
|
||||||
crceeprom = (buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 1] + \
|
crceeprom = (buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 1] + \
|
||||||
buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 2] * 256);
|
buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 2] * 256);
|
||||||
if (crc != crceeprom) {
|
if (crc != crceeprom) {
|
||||||
printf ("Error CRC Block: %d EEprom: calculated: %lx EEprom: %lx\n",
|
if (block == 0)
|
||||||
block, crc, crceeprom);
|
printf ("Error CRC Block: %d EEprom: calculated: \
|
||||||
|
%lx EEprom: %lx\n", block, crc, crceeprom);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -287,7 +288,7 @@ int ivm_analyze_eeprom (unsigned char *buf, int len)
|
||||||
GET_STRING("IVM_CustomerProductID", IVM_POS_CUSTOMER_PROD_ID, 32)
|
GET_STRING("IVM_CustomerProductID", IVM_POS_CUSTOMER_PROD_ID, 32)
|
||||||
|
|
||||||
if (ivm_check_crc (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], 2) != 0)
|
if (ivm_check_crc (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], 2) != 0)
|
||||||
return -2;
|
return 0;
|
||||||
ivm_analyze_block2 (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], CONFIG_SYS_IVM_EEPROM_PAGE_LEN);
|
ivm_analyze_block2 (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], CONFIG_SYS_IVM_EEPROM_PAGE_LEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -527,6 +528,34 @@ int fdt_set_node_and_value (void *blob,
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
int fdt_get_node_and_value (void *blob,
|
||||||
|
char *nodename,
|
||||||
|
char *propname,
|
||||||
|
void **var)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
int nodeoffset = 0;
|
||||||
|
|
||||||
|
nodeoffset = fdt_path_offset (blob, nodename);
|
||||||
|
if (nodeoffset >= 0) {
|
||||||
|
*var = (void *)fdt_getprop (blob, nodeoffset, propname, &len);
|
||||||
|
if (len == 0) {
|
||||||
|
/* no value */
|
||||||
|
printf ("%s no value\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
} else if (len > 0) {
|
||||||
|
return len;
|
||||||
|
} else {
|
||||||
|
printf ("libfdt fdt_getprop(): %s\n",
|
||||||
|
fdt_strerror(len));
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("%s: cannot find %s node err:%s\n", __FUNCTION__,
|
||||||
|
nodename, fdt_strerror (nodeoffset));
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ethernet_present (void)
|
int ethernet_present (void)
|
||||||
|
|
|
@ -17,4 +17,14 @@ int ivm_read_eeprom (void);
|
||||||
#ifdef CONFIG_KEYMILE_HDLC_ENET
|
#ifdef CONFIG_KEYMILE_HDLC_ENET
|
||||||
int keymile_hdlc_enet_initialize (bd_t *bis);
|
int keymile_hdlc_enet_initialize (bd_t *bis);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int fdt_set_node_and_value (void *blob,
|
||||||
|
char *nodename,
|
||||||
|
char *regname,
|
||||||
|
void *var,
|
||||||
|
int size);
|
||||||
|
int fdt_get_node_and_value (void *blob,
|
||||||
|
char *nodename,
|
||||||
|
char *propname,
|
||||||
|
void **var);
|
||||||
#endif /* __KEYMILE_COMMON_H */
|
#endif /* __KEYMILE_COMMON_H */
|
||||||
|
|
|
@ -159,12 +159,6 @@ int hush_init_var (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
|
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
|
||||||
extern int fdt_set_node_and_value (void *blob,
|
|
||||||
char *nodename,
|
|
||||||
char *regname,
|
|
||||||
void *var,
|
|
||||||
int size);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update "memory" property in the blob
|
* update "memory" property in the blob
|
||||||
*/
|
*/
|
||||||
|
@ -172,33 +166,53 @@ void ft_blob_update (void *blob, bd_t *bd)
|
||||||
{
|
{
|
||||||
ulong brg_data[1] = {0};
|
ulong brg_data[1] = {0};
|
||||||
ulong memory_data[2] = {0};
|
ulong memory_data[2] = {0};
|
||||||
ulong flash_data[4] = {0};
|
ulong *flash_data = NULL;
|
||||||
ulong flash_reg[3] = {0};
|
ulong flash_reg[3] = {0};
|
||||||
uchar enetaddr[6];
|
flash_info_t *info;
|
||||||
|
int len;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
memory_data[0] = cpu_to_be32 (bd->bi_memstart);
|
memory_data[0] = cpu_to_be32 (bd->bi_memstart);
|
||||||
memory_data[1] = cpu_to_be32 (bd->bi_memsize);
|
memory_data[1] = cpu_to_be32 (bd->bi_memsize);
|
||||||
fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
|
fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
|
||||||
sizeof (memory_data));
|
sizeof (memory_data));
|
||||||
|
|
||||||
flash_data[2] = cpu_to_be32 (bd->bi_flashstart);
|
len = fdt_get_node_and_value (blob, "/localbus", "ranges",
|
||||||
flash_data[3] = cpu_to_be32 (bd->bi_flashsize);
|
(void *)&flash_data);
|
||||||
|
|
||||||
|
if (flash_data == NULL) {
|
||||||
|
printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update Flash addr, size */
|
||||||
|
while ( i < (len / 4)) {
|
||||||
|
switch (flash_data[i]) {
|
||||||
|
case 0:
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE);
|
||||||
|
flash_data[i + 1] = 0;
|
||||||
|
flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
|
||||||
|
flash_data[i + 3] = cpu_to_be32 (info->size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 4;
|
||||||
|
}
|
||||||
fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
|
fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
|
||||||
sizeof (flash_data));
|
len);
|
||||||
|
|
||||||
flash_reg[2] = cpu_to_be32 (bd->bi_flashsize);
|
flash_reg[2] = cpu_to_be32 (bd->bi_flashsize);
|
||||||
fdt_set_node_and_value (blob, "/localbus/flash@0,0", "reg", flash_reg,
|
fdt_set_node_and_value (blob, "/localbus/flash@0,0", "reg", flash_reg,
|
||||||
sizeof (flash_reg));
|
sizeof (flash_reg));
|
||||||
|
|
||||||
/* BRG */
|
/* BRG */
|
||||||
brg_data[0] = cpu_to_be32 (bd->bi_busfreq);
|
brg_data[0] = cpu_to_be32 (bd->bi_busfreq);
|
||||||
fdt_set_node_and_value (blob, "/soc/cpm", "brg-frequency", brg_data,
|
fdt_set_node_and_value (blob, "/soc/cpm", "brg-frequency", brg_data,
|
||||||
sizeof (brg_data));
|
sizeof (brg_data));
|
||||||
|
|
||||||
/* MAC adr */
|
/* MAC adr */
|
||||||
eth_getenv_enetaddr("ethaddr", enetaddr);
|
|
||||||
fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
|
fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
|
||||||
enetaddr, sizeof (u8) * 6);
|
bd->bi_enetaddr, sizeof (u8) * 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_board_setup(void *blob, bd_t *bd)
|
void ft_board_setup(void *blob, bd_t *bd)
|
||||||
|
|
|
@ -187,9 +187,60 @@ int checkboard (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_OF_BOARD_SETUP)
|
#if defined(CONFIG_OF_BOARD_SETUP)
|
||||||
|
/*
|
||||||
|
* update "/localbus/ranges" property in the blob
|
||||||
|
*/
|
||||||
|
void ft_blob_update (void *blob, bd_t *bd)
|
||||||
|
{
|
||||||
|
ulong *flash_data = NULL;
|
||||||
|
flash_info_t *info;
|
||||||
|
ulong flash_reg[6] = {0};
|
||||||
|
int len;
|
||||||
|
int size = 0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
len = fdt_get_node_and_value (blob, "/localbus", "ranges",
|
||||||
|
(void *)&flash_data);
|
||||||
|
|
||||||
|
if (flash_data == NULL) {
|
||||||
|
printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update Flash addr, size */
|
||||||
|
while ( i < (len / 4)) {
|
||||||
|
switch (flash_data[i]) {
|
||||||
|
case 0:
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE);
|
||||||
|
size = info->size;
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
|
||||||
|
size += info->size;
|
||||||
|
flash_data[i + 1] = 0;
|
||||||
|
flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
|
||||||
|
flash_data[i + 3] = cpu_to_be32 (size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 4;
|
||||||
|
}
|
||||||
|
fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
|
||||||
|
len);
|
||||||
|
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE);
|
||||||
|
flash_reg[2] = cpu_to_be32 (size);
|
||||||
|
flash_reg[4] = flash_reg[2];
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
|
||||||
|
flash_reg[5] = cpu_to_be32 (info->size);
|
||||||
|
fdt_set_node_and_value (blob, "/localbus/flash@f0000000,0", "reg", flash_reg,
|
||||||
|
sizeof (flash_reg));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ft_board_setup (void *blob, bd_t *bd)
|
void ft_board_setup (void *blob, bd_t *bd)
|
||||||
{
|
{
|
||||||
ft_cpu_setup (blob, bd);
|
ft_cpu_setup (blob, bd);
|
||||||
|
ft_blob_update (blob, bd);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -312,42 +312,71 @@ int hush_init_var (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
|
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
|
||||||
extern int fdt_set_node_and_value (void *blob,
|
|
||||||
char *nodename,
|
|
||||||
char *regname,
|
|
||||||
void *var,
|
|
||||||
int size);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update "memory" property in the blob
|
* update "memory" property in the blob
|
||||||
*/
|
*/
|
||||||
void ft_blob_update (void *blob, bd_t *bd)
|
void ft_blob_update (void *blob, bd_t *bd)
|
||||||
{
|
{
|
||||||
ulong memory_data[2] = {0};
|
ulong memory_data[2] = {0};
|
||||||
ulong flash_data[8] = {0};
|
ulong *flash_data = NULL;
|
||||||
|
ulong flash_reg[6] = {0};
|
||||||
flash_info_t *info;
|
flash_info_t *info;
|
||||||
uchar enetaddr[6];
|
int len;
|
||||||
|
int size;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
memory_data[0] = cpu_to_be32 (bd->bi_memstart);
|
memory_data[0] = cpu_to_be32 (bd->bi_memstart);
|
||||||
memory_data[1] = cpu_to_be32 (bd->bi_memsize);
|
memory_data[1] = cpu_to_be32 (bd->bi_memsize);
|
||||||
fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
|
fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
|
||||||
sizeof (memory_data));
|
sizeof (memory_data));
|
||||||
|
|
||||||
|
len = fdt_get_node_and_value (blob, "/localbus", "ranges",
|
||||||
|
(void *)&flash_data);
|
||||||
|
|
||||||
|
if (flash_data == NULL) {
|
||||||
|
printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* update Flash addr, size */
|
/* update Flash addr, size */
|
||||||
|
while ( i < (len / 4)) {
|
||||||
|
switch (flash_data[i]) {
|
||||||
|
case 0:
|
||||||
info = flash_get_info(CONFIG_SYS_FLASH_BASE);
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE);
|
||||||
flash_data[2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
|
flash_data[i + 1] = 0;
|
||||||
flash_data[3] = cpu_to_be32 (info->size);
|
flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
|
||||||
flash_data[4] = cpu_to_be32 (5);
|
flash_data[i + 3] = cpu_to_be32 (info->size);
|
||||||
flash_data[5] = cpu_to_be32 (0);
|
break;
|
||||||
|
case 5:
|
||||||
info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
|
||||||
flash_data[6] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
|
size = info->size;
|
||||||
flash_data[7] = cpu_to_be32 (info->size);
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
|
||||||
|
size += info->size;
|
||||||
|
flash_data[i + 1] = 0;
|
||||||
|
flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
|
||||||
|
flash_data[i + 3] = cpu_to_be32 (size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 4;
|
||||||
|
}
|
||||||
fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
|
fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
|
||||||
sizeof (flash_data));
|
len);
|
||||||
|
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
|
||||||
|
flash_reg[0] = cpu_to_be32 (5);
|
||||||
|
flash_reg[2] = cpu_to_be32 (info->size);
|
||||||
|
flash_reg[3] = flash_reg[0];
|
||||||
|
flash_reg[4] = flash_reg[2];
|
||||||
|
info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
|
||||||
|
flash_reg[5] = cpu_to_be32 (info->size);
|
||||||
|
fdt_set_node_and_value (blob, "/localbus/flash@5,0", "reg", flash_reg,
|
||||||
|
sizeof (flash_reg));
|
||||||
|
|
||||||
/* MAC addr */
|
/* MAC addr */
|
||||||
eth_getenv_enetaddr("ethaddr", enetaddr);
|
|
||||||
fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
|
fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
|
||||||
enetaddr, sizeof (u8) * 6);
|
bd->bi_enetaddr, sizeof (u8) * 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_board_setup (void *blob, bd_t *bd)
|
void ft_board_setup (void *blob, bd_t *bd)
|
||||||
|
|
|
@ -52,9 +52,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_LZMA
|
#ifdef CONFIG_LZMA
|
||||||
#define _7ZIP_BYTE_DEFINED /* Byte already defined by zlib */
|
|
||||||
#include <lzma/LzmaTypes.h>
|
#include <lzma/LzmaTypes.h>
|
||||||
#include <lzma/LzmaDecode.h>
|
#include <lzma/LzmaDec.h>
|
||||||
#include <lzma/LzmaTools.h>
|
#include <lzma/LzmaTools.h>
|
||||||
#endif /* CONFIG_LZMA */
|
#endif /* CONFIG_LZMA */
|
||||||
|
|
||||||
|
@ -390,7 +389,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
|
||||||
int ret = lzmaBuffToBuffDecompress(
|
int ret = lzmaBuffToBuffDecompress(
|
||||||
(unsigned char *)load, &unc_len,
|
(unsigned char *)load, &unc_len,
|
||||||
(unsigned char *)image_start, image_len);
|
(unsigned char *)image_start, image_len);
|
||||||
if (ret != LZMA_RESULT_OK) {
|
if (ret != SZ_OK) {
|
||||||
printf ("LZMA: uncompress or overwrite error %d "
|
printf ("LZMA: uncompress or overwrite error %d "
|
||||||
"- must RESET board to recover\n", ret);
|
"- must RESET board to recover\n", ret);
|
||||||
show_boot_progress (-6);
|
show_boot_progress (-6);
|
||||||
|
|
|
@ -83,7 +83,7 @@ RANLIB = $(CROSS_COMPILE)RANLIB
|
||||||
sinclude $(OBJTREE)/include/autoconf.mk
|
sinclude $(OBJTREE)/include/autoconf.mk
|
||||||
|
|
||||||
ifdef ARCH
|
ifdef ARCH
|
||||||
sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
|
sinclude $(TOPDIR)/lib_$(ARCH)/config.mk # include architecture dependend rules
|
||||||
endif
|
endif
|
||||||
ifdef CPU
|
ifdef CPU
|
||||||
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
|
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
|
||||||
|
|
|
@ -81,7 +81,7 @@ void dprint_buffer(unsigned char *buf, int len)
|
||||||
printf("\n\r");
|
printf("\n\r");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fsl_sata_dump_sfis(struct sfis *s)
|
static void fsl_sata_dump_sfis(struct sata_fis_d2h *s)
|
||||||
{
|
{
|
||||||
printf("Status FIS dump:\n\r");
|
printf("Status FIS dump:\n\r");
|
||||||
printf("fis_type: %02x\n\r", s->fis_type);
|
printf("fis_type: %02x\n\r", s->fis_type);
|
||||||
|
@ -347,7 +347,7 @@ static void fsl_sata_dump_regs(fsl_sata_reg_t *reg)
|
||||||
printf("SYSPR: %08x\n\r", in_be32(®->syspr));
|
printf("SYSPR: %08x\n\r", in_be32(®->syspr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
|
||||||
int is_ncq, int tag, u8 *buffer, u32 len)
|
int is_ncq, int tag, u8 *buffer, u32 len)
|
||||||
{
|
{
|
||||||
cmd_hdr_entry_t *cmd_hdr;
|
cmd_hdr_entry_t *cmd_hdr;
|
||||||
|
@ -483,7 +483,7 @@ static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
||||||
|
|
||||||
if (val32) {
|
if (val32) {
|
||||||
u32 der;
|
u32 der;
|
||||||
fsl_sata_dump_sfis((struct sfis *)cmd_desc->sfis);
|
fsl_sata_dump_sfis((struct sata_fis_d2h *)cmd_desc->sfis);
|
||||||
printf("CE at device\n\r");
|
printf("CE at device\n\r");
|
||||||
fsl_sata_dump_regs(reg);
|
fsl_sata_dump_regs(reg);
|
||||||
der = in_le32(®->der);
|
der = in_le32(®->der);
|
||||||
|
@ -498,13 +498,13 @@ static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsl_ata_exec_reset_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
static int fsl_ata_exec_reset_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
|
||||||
int tag, u8 *buffer, u32 len)
|
int tag, u8 *buffer, u32 len)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
|
||||||
enum cmd_type command_type, int tag, u8 *buffer, u32 len)
|
enum cmd_type command_type, int tag, u8 *buffer, u32 len)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -539,11 +539,9 @@ static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct cfis *cfis,
|
||||||
static void fsl_sata_identify(int dev, u16 *id)
|
static void fsl_sata_identify(int dev, u16 *id)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
|
|
||||||
cfis = (struct cfis *)&h2d;
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -566,12 +564,10 @@ static void fsl_sata_xfer_mode(int dev, u16 *id)
|
||||||
static void fsl_sata_set_features(int dev)
|
static void fsl_sata_set_features(int dev)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
u8 udma_cap;
|
u8 udma_cap;
|
||||||
|
|
||||||
cfis = (struct cfis *)&h2d;
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -597,14 +593,12 @@ static void fsl_sata_set_features(int dev)
|
||||||
static u32 fsl_sata_rw_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
static u32 fsl_sata_rw_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
u32 block;
|
u32 block;
|
||||||
|
|
||||||
block = start;
|
block = start;
|
||||||
cfis = (struct cfis *)&h2d;
|
|
||||||
|
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -624,12 +618,9 @@ static u32 fsl_sata_rw_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_wr
|
||||||
void fsl_sata_flush_cache(int dev)
|
void fsl_sata_flush_cache(int dev)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
|
|
||||||
cfis = (struct cfis *)&h2d;
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
|
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -641,14 +632,12 @@ void fsl_sata_flush_cache(int dev)
|
||||||
static u32 fsl_sata_rw_cmd_ext(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
static u32 fsl_sata_rw_cmd_ext(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
u64 block;
|
u64 block;
|
||||||
|
|
||||||
block = (u64)start;
|
block = (u64)start;
|
||||||
cfis = (struct cfis *)&h2d;
|
|
||||||
|
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -673,8 +662,7 @@ static u32 fsl_sata_rw_cmd_ext(int dev, u32 start, u32 blkcnt, u8 *buffer, int i
|
||||||
u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
int ncq_channel;
|
int ncq_channel;
|
||||||
u64 block;
|
u64 block;
|
||||||
|
|
||||||
|
@ -684,9 +672,8 @@ u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write
|
||||||
}
|
}
|
||||||
|
|
||||||
block = (u64)start;
|
block = (u64)start;
|
||||||
cfis = (struct cfis *)&h2d;
|
|
||||||
|
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
@ -718,12 +705,9 @@ u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write
|
||||||
void fsl_sata_flush_cache_ext(int dev)
|
void fsl_sata_flush_cache_ext(int dev)
|
||||||
{
|
{
|
||||||
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
|
||||||
struct sata_fis_h2d h2d;
|
struct sata_fis_h2d h2d, *cfis = &h2d;
|
||||||
struct cfis *cfis;
|
|
||||||
|
|
||||||
cfis = (struct cfis *)&h2d;
|
memset(cfis, 0, sizeof(struct sata_fis_h2d));
|
||||||
|
|
||||||
memset((void *)cfis, 0, sizeof(struct cfis));
|
|
||||||
|
|
||||||
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
|
||||||
cfis->pm_port_c = 0x80; /* is command */
|
cfis->pm_port_c = 0x80; /* is command */
|
||||||
|
|
|
@ -288,52 +288,6 @@ typedef struct cmd_desc {
|
||||||
#define SATA_HC_CMD_DESC_SIZE sizeof(struct cmd_desc)
|
#define SATA_HC_CMD_DESC_SIZE sizeof(struct cmd_desc)
|
||||||
#define SATA_HC_CMD_DESC_ALIGN 4
|
#define SATA_HC_CMD_DESC_ALIGN 4
|
||||||
|
|
||||||
/*
|
|
||||||
* CFIS - Command FIS, which is H2D register FIS, the struct defination
|
|
||||||
* of Non-Queued command is different than NCQ command. see them is sata2.h
|
|
||||||
*/
|
|
||||||
typedef struct cfis {
|
|
||||||
u8 fis_type;
|
|
||||||
u8 pm_port_c;
|
|
||||||
u8 command;
|
|
||||||
u8 features;
|
|
||||||
u8 lba_low;
|
|
||||||
u8 lba_mid;
|
|
||||||
u8 lba_high;
|
|
||||||
u8 device;
|
|
||||||
u8 lba_low_exp;
|
|
||||||
u8 lba_mid_exp;
|
|
||||||
u8 lba_high_exp;
|
|
||||||
u8 features_exp;
|
|
||||||
u8 sector_count;
|
|
||||||
u8 sector_count_exp;
|
|
||||||
u8 res1;
|
|
||||||
u8 control;
|
|
||||||
u8 res2[4];
|
|
||||||
} __attribute__ ((packed)) cfis_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SFIS - Status FIS, which is D2H register FIS.
|
|
||||||
*/
|
|
||||||
typedef struct sfis {
|
|
||||||
u8 fis_type;
|
|
||||||
u8 pm_port_i;
|
|
||||||
u8 status;
|
|
||||||
u8 error;
|
|
||||||
u8 lba_low;
|
|
||||||
u8 lba_mid;
|
|
||||||
u8 lba_high;
|
|
||||||
u8 device;
|
|
||||||
u8 lba_low_exp;
|
|
||||||
u8 lba_mid_exp;
|
|
||||||
u8 lba_high_exp;
|
|
||||||
u8 res1;
|
|
||||||
u8 sector_count;
|
|
||||||
u8 sector_count_exp;
|
|
||||||
u8 res2[2];
|
|
||||||
u8 res3[4];
|
|
||||||
} __attribute__ ((packed)) sfis_t;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SATA device driver info
|
* SATA device driver info
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -33,13 +33,13 @@ include $(TOPDIR)/config.mk
|
||||||
OUTPUT-$(CONFIG_API) = $(obj)demo
|
OUTPUT-$(CONFIG_API) = $(obj)demo
|
||||||
OUTPUT = $(OUTPUT-y)
|
OUTPUT = $(OUTPUT-y)
|
||||||
|
|
||||||
# Source files located in the api_examples directory
|
# Source files located in the examples/api directory
|
||||||
SOBJ_FILES-$(CONFIG_API) += crt0.o
|
SOBJ_FILES-$(CONFIG_API) += crt0.o
|
||||||
COBJ_FILES-$(CONFIG_API) += demo.o
|
COBJ_FILES-$(CONFIG_API) += demo.o
|
||||||
COBJ_FILES-$(CONFIG_API) += glue.o
|
COBJ_FILES-$(CONFIG_API) += glue.o
|
||||||
COBJ_FILES-$(CONFIG_API) += libgenwrap.o
|
COBJ_FILES-$(CONFIG_API) += libgenwrap.o
|
||||||
|
|
||||||
# Source files which exist outside the api_examples directory
|
# Source files which exist outside the examples/api directory
|
||||||
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/crc32.o
|
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/crc32.o
|
||||||
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/ctype.o
|
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/ctype.o
|
||||||
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/string.o
|
EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/string.o
|
||||||
|
@ -51,8 +51,8 @@ endif
|
||||||
# Create a list of source files so their dependencies can be auto-generated
|
# Create a list of source files so their dependencies can be auto-generated
|
||||||
SRCS += $(addprefix $(SRCTREE)/,$(EXT_COBJ_FILES-y:.o=.c))
|
SRCS += $(addprefix $(SRCTREE)/,$(EXT_COBJ_FILES-y:.o=.c))
|
||||||
SRCS += $(addprefix $(SRCTREE)/,$(EXT_SOBJ_FILES-y:.o=.S))
|
SRCS += $(addprefix $(SRCTREE)/,$(EXT_SOBJ_FILES-y:.o=.S))
|
||||||
SRCS += $(addprefix $(SRCTREE)/api_examples/,$(COBJ_FILES-y:.o=.c))
|
SRCS += $(addprefix $(SRCTREE)/examples/api/,$(COBJ_FILES-y:.o=.c))
|
||||||
SRCS += $(addprefix $(SRCTREE)/api_examples/,$(SOBJ_FILES-y:.o=.S))
|
SRCS += $(addprefix $(SRCTREE)/examples/api/,$(SOBJ_FILES-y:.o=.S))
|
||||||
|
|
||||||
# Create a list of object files to be compiled
|
# Create a list of object files to be compiled
|
||||||
OBJS += $(addprefix $(obj),$(SOBJ_FILES-y))
|
OBJS += $(addprefix $(obj),$(SOBJ_FILES-y))
|
18
include/asm-arm/unaligned.h
Normal file
18
include/asm-arm/unaligned.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef _ASM_ARM_UNALIGNED_H
|
||||||
|
#define _ASM_ARM_UNALIGNED_H
|
||||||
|
|
||||||
|
#include <linux/unaligned/access_ok.h>
|
||||||
|
#include <linux/unaligned/generic.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Select endianness
|
||||||
|
*/
|
||||||
|
#ifndef __ARMEB__
|
||||||
|
#define get_unaligned __get_unaligned_le
|
||||||
|
#define put_unaligned __put_unaligned_le
|
||||||
|
#else
|
||||||
|
#define get_unaligned __get_unaligned_be
|
||||||
|
#define put_unaligned __put_unaligned_be
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ASM_ARM_UNALIGNED_H */
|
|
@ -697,6 +697,7 @@ void show_boot_progress(int val);
|
||||||
|
|
||||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
|
||||||
|
#define ROUND(a,b) (((a) + (b)) & ~((b) - 1))
|
||||||
#define DIV_ROUND(n,d) (((n) + ((d)/2)) / (d))
|
#define DIV_ROUND(n,d) (((n) + ((d)/2)) / (d))
|
||||||
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
||||||
#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
|
#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
|
||||||
|
|
|
@ -161,7 +161,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -203,7 +203,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -311,7 +311,6 @@ struct bd_info_ext {
|
||||||
*/
|
*/
|
||||||
#define CONFIG_SYS_HZ_CLOCK (AT91C_MASTER_CLOCK / 2)
|
#define CONFIG_SYS_HZ_CLOCK (AT91C_MASTER_CLOCK / 2)
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -207,7 +207,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -225,7 +225,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -335,7 +335,6 @@
|
||||||
#define CONFIG_SYS_HUSH_PARSER
|
#define CONFIG_SYS_HUSH_PARSER
|
||||||
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -212,7 +212,6 @@
|
||||||
#define CONFIG_SYS_HUSH_PARSER
|
#define CONFIG_SYS_HUSH_PARSER
|
||||||
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -170,7 +170,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#define CONFIG_CMD_I2C
|
#define CONFIG_CMD_I2C
|
||||||
#define CONFIG_CMD_JFFS2
|
#define CONFIG_CMD_JFFS2
|
||||||
#define CONFIG_JFFS2_CMDLINE
|
#define CONFIG_JFFS2_CMDLINE
|
||||||
|
#define CONFIG_CMD_MTDPARTS
|
||||||
|
|
||||||
#undef CONFIG_WATCHDOG /* disable platform specific watchdog */
|
#undef CONFIG_WATCHDOG /* disable platform specific watchdog */
|
||||||
|
|
||||||
|
@ -97,7 +98,7 @@
|
||||||
#define CONFIG_SYS_SLOT_ID_MASK (0x3f) /* mask for slot ID bits */
|
#define CONFIG_SYS_SLOT_ID_MASK (0x3f) /* mask for slot ID bits */
|
||||||
|
|
||||||
#define CONFIG_I2C_MULTI_BUS 1
|
#define CONFIG_I2C_MULTI_BUS 1
|
||||||
#define CONFIG_SYS_MAX_I2C_BUS 2
|
#define CONFIG_SYS_MAX_I2C_BUS 1
|
||||||
#define CONFIG_SYS_I2C_INIT_BOARD 1
|
#define CONFIG_SYS_I2C_INIT_BOARD 1
|
||||||
#define CONFIG_I2C_MUX 1
|
#define CONFIG_I2C_MUX 1
|
||||||
|
|
||||||
|
@ -122,6 +123,20 @@
|
||||||
#define CONFIG_BOOTP_GATEWAY
|
#define CONFIG_BOOTP_GATEWAY
|
||||||
#define CONFIG_BOOTP_HOSTNAME
|
#define CONFIG_BOOTP_HOSTNAME
|
||||||
|
|
||||||
|
#define CONFIG_ENV_SIZE 0x04000 /* Size of Environment */
|
||||||
|
|
||||||
|
#define CONFIG_SYS_MALLOC_LEN (1024 * 1024) /* Reserved for malloc */
|
||||||
|
|
||||||
|
#define CONFIG_SYS_64BIT_VSPRINTF /* needed for UBI/UBIFS */
|
||||||
|
|
||||||
|
/* UBI Support for all Keymile boards */
|
||||||
|
#define CONFIG_CMD_UBI
|
||||||
|
#define CONFIG_RBTREE
|
||||||
|
#define CONFIG_MTD_PARTITIONS
|
||||||
|
#define CONFIG_FLASH_CFI_MTD
|
||||||
|
#define CONFIG_MTD_DEVICE
|
||||||
|
#define CONFIG_MTD_CONCAT
|
||||||
|
|
||||||
/* define this to use the keymile's io muxing feature */
|
/* define this to use the keymile's io muxing feature */
|
||||||
/*#define CONFIG_IO_MUXING */
|
/*#define CONFIG_IO_MUXING */
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,6 @@
|
||||||
#define CONFIG_SYS_FLASH_BASE 0xf0000000
|
#define CONFIG_SYS_FLASH_BASE 0xf0000000
|
||||||
#define CONFIG_SYS_MONITOR_LEN (384 << 10) /* 384 kB for Monitor */
|
#define CONFIG_SYS_MONITOR_LEN (384 << 10) /* 384 kB for Monitor */
|
||||||
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
|
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE
|
||||||
#define CONFIG_SYS_MALLOC_LEN (256 << 10) /* 256 kB for malloc() */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For booting Linux, the board info and command line data
|
* For booting Linux, the board info and command line data
|
||||||
|
@ -146,7 +145,6 @@
|
||||||
|
|
||||||
#define CONFIG_ENV_IS_IN_FLASH 1
|
#define CONFIG_ENV_IS_IN_FLASH 1
|
||||||
#define CONFIG_ENV_OFFSET CONFIG_SYS_MONITOR_LEN
|
#define CONFIG_ENV_OFFSET CONFIG_SYS_MONITOR_LEN
|
||||||
#define CONFIG_ENV_SIZE 0x04000 /* Total Size of Environment Sector */
|
|
||||||
#define CONFIG_ENV_SECT_SIZE 0x20000 /* Total Size of Environment Sector */
|
#define CONFIG_ENV_SECT_SIZE 0x20000 /* Total Size of Environment Sector */
|
||||||
|
|
||||||
/* Address and size of Redundant Environment Sector */
|
/* Address and size of Redundant Environment Sector */
|
||||||
|
|
|
@ -158,7 +158,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CONFIG_SYS_MONITOR_LEN (384 * 1024) /* Reserve 384 kB for Mon */
|
#define CONFIG_SYS_MONITOR_LEN (384 * 1024) /* Reserve 384 kB for Mon */
|
||||||
#define CONFIG_SYS_MALLOC_LEN (128 * 1024) /* Reserved for malloc */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initial RAM Base Address Setup
|
* Initial RAM Base Address Setup
|
||||||
|
@ -292,7 +291,6 @@
|
||||||
#define CONFIG_ENV_IS_IN_FLASH 1
|
#define CONFIG_ENV_IS_IN_FLASH 1
|
||||||
#define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
|
#define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
|
||||||
#define CONFIG_ENV_SECT_SIZE 0x20000 /* 128K(one sector) for env */
|
#define CONFIG_ENV_SECT_SIZE 0x20000 /* 128K(one sector) for env */
|
||||||
#define CONFIG_ENV_SIZE 0x20000
|
|
||||||
#define CONFIG_ENV_OFFSET (CONFIG_SYS_MONITOR_LEN)
|
#define CONFIG_ENV_OFFSET (CONFIG_SYS_MONITOR_LEN)
|
||||||
|
|
||||||
/* Address and size of Redundant Environment Sector */
|
/* Address and size of Redundant Environment Sector */
|
||||||
|
@ -314,7 +312,6 @@
|
||||||
#define CONFIG_SYS_I2C_SLAVE 0x7F
|
#define CONFIG_SYS_I2C_SLAVE 0x7F
|
||||||
#define CONFIG_SYS_I2C_OFFSET 0x3000
|
#define CONFIG_SYS_I2C_OFFSET 0x3000
|
||||||
#define CONFIG_I2C_MULTI_BUS 1
|
#define CONFIG_I2C_MULTI_BUS 1
|
||||||
#define CONFIG_SYS_MAX_I2C_BUS 2
|
|
||||||
#define CONFIG_I2C_MUX 1
|
#define CONFIG_I2C_MUX 1
|
||||||
|
|
||||||
/* EEprom support */
|
/* EEprom support */
|
||||||
|
@ -326,7 +323,7 @@
|
||||||
#define CONFIG_SYS_DTT_MAX_TEMP 70
|
#define CONFIG_SYS_DTT_MAX_TEMP 70
|
||||||
#define CONFIG_SYS_DTT_LOW_TEMP -30
|
#define CONFIG_SYS_DTT_LOW_TEMP -30
|
||||||
#define CONFIG_SYS_DTT_HYSTERESIS 3
|
#define CONFIG_SYS_DTT_HYSTERESIS 3
|
||||||
#define CONFIG_SYS_DTT_BUS_NUM (2)
|
#define CONFIG_SYS_DTT_BUS_NUM (CONFIG_SYS_MAX_I2C_BUS)
|
||||||
|
|
||||||
#if defined(CONFIG_PCI)
|
#if defined(CONFIG_PCI)
|
||||||
#define CONFIG_CMD_PCI
|
#define CONFIG_CMD_PCI
|
||||||
|
@ -433,7 +430,7 @@
|
||||||
|
|
||||||
#define CONFIG_PRAM 512 /* protected RAM [KBytes] */
|
#define CONFIG_PRAM 512 /* protected RAM [KBytes] */
|
||||||
|
|
||||||
#define MTDIDS_DEFAULT "nor0=app"
|
#define MTDIDS_DEFAULT "nor2=app"
|
||||||
#define MTDPARTS_DEFAULT \
|
#define MTDPARTS_DEFAULT \
|
||||||
"mtdparts=app:256k(u-boot),128k(env),128k(envred)," \
|
"mtdparts=app:256k(u-boot),128k(env),128k(envred)," \
|
||||||
"1536k(esw0),8704k(rootfs0),1536k(esw1),2432k(rootfs1),640k(var),768k(cfg)"
|
"1536k(esw0),8704k(rootfs0),1536k(esw1),2432k(rootfs1),640k(var),768k(cfg)"
|
||||||
|
|
|
@ -98,13 +98,11 @@
|
||||||
"addcon=setenv bootargs ${bootargs} " \
|
"addcon=setenv bootargs ${bootargs} " \
|
||||||
"console=ttyCPM0,${baudrate}\0" \
|
"console=ttyCPM0,${baudrate}\0" \
|
||||||
"mtdids=nor0=boot,nor1=app \0" \
|
"mtdids=nor0=boot,nor1=app \0" \
|
||||||
"mtdparts=mtdparts=boot:384k(u-boot),128k(env),128k(envred)," \
|
|
||||||
"3456k(free);app:3m(esw0),10m(rootfs0),3m(esw1)," \
|
|
||||||
"10m(rootfs1),1m(var),5m(cfg) \0" \
|
|
||||||
"partition=nor1,5 \0" \
|
"partition=nor1,5 \0" \
|
||||||
"new_env=prot off FE060000 FE09FFFF; era FE060000 FE09FFFF \0" \
|
"new_env=prot off FE060000 FE09FFFF; era FE060000 FE09FFFF \0" \
|
||||||
"EEprom_ivm=pca9544a:70:4 \0" \
|
"EEprom_ivm=pca9544a:70:4 \0" \
|
||||||
"mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0" \
|
"mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0" \
|
||||||
|
"unlock=yes\0" \
|
||||||
""
|
""
|
||||||
|
|
||||||
#define CONFIG_SYS_SDRAM_BASE 0x00000000
|
#define CONFIG_SYS_SDRAM_BASE 0x00000000
|
||||||
|
@ -112,13 +110,17 @@
|
||||||
#define CONFIG_SYS_FLASH_SIZE 32
|
#define CONFIG_SYS_FLASH_SIZE 32
|
||||||
#define CONFIG_SYS_FLASH_CFI
|
#define CONFIG_SYS_FLASH_CFI
|
||||||
#define CONFIG_FLASH_CFI_DRIVER
|
#define CONFIG_FLASH_CFI_DRIVER
|
||||||
#define CONFIG_SYS_MAX_FLASH_BANKS 2 /* max num of flash banks */
|
#define CONFIG_SYS_MAX_FLASH_BANKS 3 /* max num of flash banks */
|
||||||
#define CONFIG_SYS_MAX_FLASH_SECT 512 /* max num of sects on one chip */
|
#define CONFIG_SYS_MAX_FLASH_SECT 512 /* max num of sects on one chip */
|
||||||
|
|
||||||
#define CONFIG_SYS_FLASH_BASE_1 0x50000000
|
#define CONFIG_SYS_FLASH_BASE_1 0x50000000
|
||||||
#define CONFIG_SYS_FLASH_SIZE_1 64
|
#define CONFIG_SYS_FLASH_SIZE_1 32
|
||||||
|
#define CONFIG_SYS_FLASH_BASE_2 0x52000000
|
||||||
|
#define CONFIG_SYS_FLASH_SIZE_2 32
|
||||||
|
|
||||||
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_1 }
|
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, \
|
||||||
|
CONFIG_SYS_FLASH_BASE_1, \
|
||||||
|
CONFIG_SYS_FLASH_BASE_2 }
|
||||||
|
|
||||||
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE
|
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE
|
||||||
#if (CONFIG_SYS_MONITOR_BASE < CONFIG_SYS_FLASH_BASE)
|
#if (CONFIG_SYS_MONITOR_BASE < CONFIG_SYS_FLASH_BASE)
|
||||||
|
@ -193,7 +195,6 @@
|
||||||
#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
|
#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */
|
||||||
#define BOOTFLAG_WARM 0x02 /* Software reboot */
|
#define BOOTFLAG_WARM 0x02 /* Software reboot */
|
||||||
|
|
||||||
#define CONFIG_SYS_MALLOC_LEN (4096 << 10) /* Reserve 4 MB for malloc() */
|
|
||||||
#define CONFIG_SYS_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
|
#define CONFIG_SYS_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */
|
||||||
|
|
||||||
#define CONFIG_SYS_CACHELINE_SIZE 32 /* For MPC8260 CPUs */
|
#define CONFIG_SYS_CACHELINE_SIZE 32 /* For MPC8260 CPUs */
|
||||||
|
@ -333,7 +334,8 @@
|
||||||
#define CONFIG_SYS_BR5_PRELIM ((CONFIG_SYS_FLASH_BASE_1 & BRx_BA_MSK) |\
|
#define CONFIG_SYS_BR5_PRELIM ((CONFIG_SYS_FLASH_BASE_1 & BRx_BA_MSK) |\
|
||||||
BRx_PS_16 | BRx_MS_GPCM_P | BRx_V)
|
BRx_PS_16 | BRx_MS_GPCM_P | BRx_V)
|
||||||
|
|
||||||
#define CONFIG_SYS_OR5_PRELIM (MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1) |\
|
#define CONFIG_SYS_OR5_PRELIM (MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1 + \
|
||||||
|
CONFIG_SYS_FLASH_SIZE_2) |\
|
||||||
ORxG_CSNT | ORxG_ACS_DIV2 |\
|
ORxG_CSNT | ORxG_ACS_DIV2 |\
|
||||||
ORxG_SCY_5_CLK | ORxG_TRLX )
|
ORxG_SCY_5_CLK | ORxG_TRLX )
|
||||||
|
|
||||||
|
|
|
@ -368,7 +368,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -397,7 +397,6 @@
|
||||||
#define CONFIG_SYS_LONGHELP 1
|
#define CONFIG_SYS_LONGHELP 1
|
||||||
#define CONFIG_CMDLINE_EDITING 1
|
#define CONFIG_CMDLINE_EDITING 1
|
||||||
|
|
||||||
#define ROUND(A, B) (((A) + (B)) & ~((B) - 1))
|
|
||||||
/*
|
/*
|
||||||
* Size of malloc() pool
|
* Size of malloc() pool
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -163,6 +163,8 @@
|
||||||
|
|
||||||
#undef CONFIG_MEMSIZE_IN_BYTES
|
#undef CONFIG_MEMSIZE_IN_BYTES
|
||||||
|
|
||||||
|
#define CONFIG_LZMA
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
* Cache Configuration
|
* Cache Configuration
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -47,7 +47,9 @@
|
||||||
#define I2C_RXTX_LEN 128 /* maximum tx/rx buffer length */
|
#define I2C_RXTX_LEN 128 /* maximum tx/rx buffer length */
|
||||||
|
|
||||||
#if defined(CONFIG_I2C_MULTI_BUS)
|
#if defined(CONFIG_I2C_MULTI_BUS)
|
||||||
|
#if !defined(CONFIG_SYS_MAX_I2C_BUS)
|
||||||
#define CONFIG_SYS_MAX_I2C_BUS 2
|
#define CONFIG_SYS_MAX_I2C_BUS 2
|
||||||
|
#endif
|
||||||
#define I2C_GET_BUS() i2c_get_bus_num()
|
#define I2C_GET_BUS() i2c_get_bus_num()
|
||||||
#define I2C_SET_BUS(a) i2c_set_bus_num(a)
|
#define I2C_SET_BUS(a) i2c_set_bus_num(a)
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Fake include for LzmaDecode.h
|
* Fake include for LzmaDec.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
* Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
|
||||||
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
||||||
*
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
|
@ -23,9 +23,9 @@
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __LZMADECODE_H__FAKE__
|
#ifndef __LZMADEC_H__FAKE__
|
||||||
#define __LZMADECODE_H__FAKE__
|
#define __LZMADEC_H__FAKE__
|
||||||
|
|
||||||
#include "../../lib_generic/lzma/LzmaDecode.h"
|
#include "../../lib_generic/lzma/LzmaDec.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Fake include for LzmaTools.h
|
* Fake include for LzmaTools.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
* Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
|
||||||
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
||||||
*
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Fake include for LzmaTypes.h
|
* Fake include for Types.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
* Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
|
||||||
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
||||||
*
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
|
@ -23,9 +23,14 @@
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __LZMATYPES_H__FAKE__
|
#ifndef __TYPES_H__FAKE__
|
||||||
#define __LZMATYPES_H__FAKE__
|
#define __TYPES_H__FAKE__
|
||||||
|
|
||||||
#include "../../lib_generic/lzma/LzmaTypes.h"
|
/*
|
||||||
|
*This avoids the collition with zlib.h Byte definition
|
||||||
|
*/
|
||||||
|
#define Byte LZByte
|
||||||
|
|
||||||
|
#include "../../lib_generic/lzma/Types.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,502 +0,0 @@
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 2.1, February 1999
|
|
||||||
|
|
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
[This is the first released version of the Lesser GPL. It also counts
|
|
||||||
as the successor of the GNU Library Public License, version 2, hence
|
|
||||||
the version number 2.1.]
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
Licenses are intended to guarantee your freedom to share and change
|
|
||||||
free software--to make sure the software is free for all its users.
|
|
||||||
|
|
||||||
This license, the Lesser General Public License, applies to some
|
|
||||||
specially designated software packages--typically libraries--of the
|
|
||||||
Free Software Foundation and other authors who decide to use it. You
|
|
||||||
can use it too, but we suggest you first think carefully about whether
|
|
||||||
this license or the ordinary General Public License is the better
|
|
||||||
strategy to use in any particular case, based on the explanations below.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom of use,
|
|
||||||
not price. Our General Public Licenses are designed to make sure that
|
|
||||||
you have the freedom to distribute copies of free software (and charge
|
|
||||||
for this service if you wish); that you receive source code or can get
|
|
||||||
it if you want it; that you can change the software and use pieces of
|
|
||||||
it in new free programs; and that you are informed that you can do
|
|
||||||
these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
distributors to deny you these rights or to ask you to surrender these
|
|
||||||
rights. These restrictions translate to certain responsibilities for
|
|
||||||
you if you distribute copies of the library or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis
|
|
||||||
or for a fee, you must give the recipients all the rights that we gave
|
|
||||||
you. You must make sure that they, too, receive or can get the source
|
|
||||||
code. If you link other code with the library, you must provide
|
|
||||||
complete object files to the recipients, so that they can relink them
|
|
||||||
with the library after making changes to the library and recompiling
|
|
||||||
it. And you must show them these terms so they know their rights.
|
|
||||||
|
|
||||||
We protect your rights with a two-step method: (1) we copyright the
|
|
||||||
library, and (2) we offer you this license, which gives you legal
|
|
||||||
permission to copy, distribute and/or modify the library.
|
|
||||||
|
|
||||||
To protect each distributor, we want to make it very clear that
|
|
||||||
there is no warranty for the free library. Also, if the library is
|
|
||||||
modified by someone else and passed on, the recipients should know
|
|
||||||
that what they have is not the original version, so that the original
|
|
||||||
author's reputation will not be affected by problems that might be
|
|
||||||
introduced by others.
|
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of
|
|
||||||
any free program. We wish to make sure that a company cannot
|
|
||||||
effectively restrict the users of a free program by obtaining a
|
|
||||||
restrictive license from a patent holder. Therefore, we insist that
|
|
||||||
any patent license obtained for a version of the library must be
|
|
||||||
consistent with the full freedom of use specified in this license.
|
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the
|
|
||||||
ordinary GNU General Public License. This license, the GNU Lesser
|
|
||||||
General Public License, applies to certain designated libraries, and
|
|
||||||
is quite different from the ordinary General Public License. We use
|
|
||||||
this license for certain libraries in order to permit linking those
|
|
||||||
libraries into non-free programs.
|
|
||||||
|
|
||||||
When a program is linked with a library, whether statically or using
|
|
||||||
a shared library, the combination of the two is legally speaking a
|
|
||||||
combined work, a derivative of the original library. The ordinary
|
|
||||||
General Public License therefore permits such linking only if the
|
|
||||||
entire combination fits its criteria of freedom. The Lesser General
|
|
||||||
Public License permits more lax criteria for linking other code with
|
|
||||||
the library.
|
|
||||||
|
|
||||||
We call this license the "Lesser" General Public License because it
|
|
||||||
does Less to protect the user's freedom than the ordinary General
|
|
||||||
Public License. It also provides other free software developers Less
|
|
||||||
of an advantage over competing non-free programs. These disadvantages
|
|
||||||
are the reason we use the ordinary General Public License for many
|
|
||||||
libraries. However, the Lesser license provides advantages in certain
|
|
||||||
special circumstances.
|
|
||||||
|
|
||||||
For example, on rare occasions, there may be a special need to
|
|
||||||
encourage the widest possible use of a certain library, so that it becomes
|
|
||||||
a de-facto standard. To achieve this, non-free programs must be
|
|
||||||
allowed to use the library. A more frequent case is that a free
|
|
||||||
library does the same job as widely used non-free libraries. In this
|
|
||||||
case, there is little to gain by limiting the free library to free
|
|
||||||
software only, so we use the Lesser General Public License.
|
|
||||||
|
|
||||||
In other cases, permission to use a particular library in non-free
|
|
||||||
programs enables a greater number of people to use a large body of
|
|
||||||
free software. For example, permission to use the GNU C Library in
|
|
||||||
non-free programs enables many more people to use the whole GNU
|
|
||||||
operating system, as well as its variant, the GNU/Linux operating
|
|
||||||
system.
|
|
||||||
|
|
||||||
Although the Lesser General Public License is Less protective of the
|
|
||||||
users' freedom, it does ensure that the user of a program that is
|
|
||||||
linked with the Library has the freedom and the wherewithal to run
|
|
||||||
that program using a modified version of the Library.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow. Pay close attention to the difference between a
|
|
||||||
"work based on the library" and a "work that uses the library". The
|
|
||||||
former contains code derived from the library, whereas the latter must
|
|
||||||
be combined with the library in order to run.
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License Agreement applies to any software library or other
|
|
||||||
program which contains a notice placed by the copyright holder or
|
|
||||||
other authorized party saying it may be distributed under the terms of
|
|
||||||
this Lesser General Public License (also called "this License").
|
|
||||||
Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data
|
|
||||||
prepared so as to be conveniently linked with application programs
|
|
||||||
(which use some of those functions and data) to form executables.
|
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work
|
|
||||||
which has been distributed under these terms. A "work based on the
|
|
||||||
Library" means either the Library or any derivative work under
|
|
||||||
copyright law: that is to say, a work containing the Library or a
|
|
||||||
portion of it, either verbatim or with modifications and/or translated
|
|
||||||
straightforwardly into another language. (Hereinafter, translation is
|
|
||||||
included without limitation in the term "modification".)
|
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For a library, complete source code means
|
|
||||||
all the source code for all modules it contains, plus any associated
|
|
||||||
interface definition files, plus the scripts used to control compilation
|
|
||||||
and installation of the library.
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running a program using the Library is not restricted, and output from
|
|
||||||
such a program is covered only if its contents constitute a work based
|
|
||||||
on the Library (independent of the use of the Library in a tool for
|
|
||||||
writing it). Whether that is true depends on what the Library does
|
|
||||||
and what the program that uses the Library does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's
|
|
||||||
complete source code as you receive it, in any medium, provided that
|
|
||||||
you conspicuously and appropriately publish on each copy an
|
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
|
||||||
all the notices that refer to this License and to the absence of any
|
|
||||||
warranty; and distribute a copy of this License along with the
|
|
||||||
Library.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
|
||||||
and you may at your option offer warranty protection in exchange for a
|
|
||||||
fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
|
||||||
of it, thus forming a work based on the Library, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The modified work must itself be a software library.
|
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no
|
|
||||||
charge to all third parties under the terms of this License.
|
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a
|
|
||||||
table of data to be supplied by an application program that uses
|
|
||||||
the facility, other than as an argument passed when the facility
|
|
||||||
is invoked, then you must make a good faith effort to ensure that,
|
|
||||||
in the event an application does not supply such function or
|
|
||||||
table, the facility still operates, and performs whatever part of
|
|
||||||
its purpose remains meaningful.
|
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has
|
|
||||||
a purpose that is entirely well-defined independent of the
|
|
||||||
application. Therefore, Subsection 2d requires that any
|
|
||||||
application-supplied function or table used by this function must
|
|
||||||
be optional: if the application does not supply it, the square
|
|
||||||
root function must still compute square roots.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Library,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Library, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote
|
|
||||||
it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Library.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library
|
|
||||||
with the Library (or with a work based on the Library) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
|
||||||
License instead of this License to a given copy of the Library. To do
|
|
||||||
this, you must alter all the notices that refer to this License, so
|
|
||||||
that they refer to the ordinary GNU General Public License, version 2,
|
|
||||||
instead of to this License. (If a newer version than version 2 of the
|
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change in
|
|
||||||
these notices.
|
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
|
||||||
subsequent copies and derivative works made from that copy.
|
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of
|
|
||||||
the Library into a program that is not a library.
|
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or
|
|
||||||
derivative of it, under Section 2) in object code or executable form
|
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany
|
|
||||||
it with the complete corresponding machine-readable source code, which
|
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a
|
|
||||||
medium customarily used for software interchange.
|
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy
|
|
||||||
from a designated place, then offering equivalent access to copy the
|
|
||||||
source code from the same place satisfies the requirement to
|
|
||||||
distribute the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the
|
|
||||||
Library, but is designed to work with the Library by being compiled or
|
|
||||||
linked with it, is called a "work that uses the Library". Such a
|
|
||||||
work, in isolation, is not a derivative work of the Library, and
|
|
||||||
therefore falls outside the scope of this License.
|
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library
|
|
||||||
creates an executable that is a derivative of the Library (because it
|
|
||||||
contains portions of the Library), rather than a "work that uses the
|
|
||||||
library". The executable is therefore covered by this License.
|
|
||||||
Section 6 states terms for distribution of such executables.
|
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file
|
|
||||||
that is part of the Library, the object code for the work may be a
|
|
||||||
derivative work of the Library even though the source code is not.
|
|
||||||
Whether this is true is especially significant if the work can be
|
|
||||||
linked without the Library, or if the work is itself a library. The
|
|
||||||
threshold for this to be true is not precisely defined by law.
|
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data
|
|
||||||
structure layouts and accessors, and small macros and small inline
|
|
||||||
functions (ten lines or less in length), then the use of the object
|
|
||||||
file is unrestricted, regardless of whether it is legally a derivative
|
|
||||||
work. (Executables containing this object code plus portions of the
|
|
||||||
Library will still fall under Section 6.)
|
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may
|
|
||||||
distribute the object code for the work under the terms of Section 6.
|
|
||||||
Any executables containing that work also fall under Section 6,
|
|
||||||
whether or not they are linked directly with the Library itself.
|
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or
|
|
||||||
link a "work that uses the Library" with the Library to produce a
|
|
||||||
work containing portions of the Library, and distribute that work
|
|
||||||
under terms of your choice, provided that the terms permit
|
|
||||||
modification of the work for the customer's own use and reverse
|
|
||||||
engineering for debugging such modifications.
|
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the
|
|
||||||
Library is used in it and that the Library and its use are covered by
|
|
||||||
this License. You must supply a copy of this License. If the work
|
|
||||||
during execution displays copyright notices, you must include the
|
|
||||||
copyright notice for the Library among them, as well as a reference
|
|
||||||
directing the user to the copy of this License. Also, you must do one
|
|
||||||
of these things:
|
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding
|
|
||||||
machine-readable source code for the Library including whatever
|
|
||||||
changes were used in the work (which must be distributed under
|
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked
|
|
||||||
with the Library, with the complete machine-readable "work that
|
|
||||||
uses the Library", as object code and/or source code, so that the
|
|
||||||
user can modify the Library and then relink to produce a modified
|
|
||||||
executable containing the modified Library. (It is understood
|
|
||||||
that the user who changes the contents of definitions files in the
|
|
||||||
Library will not necessarily be able to recompile the application
|
|
||||||
to use the modified definitions.)
|
|
||||||
|
|
||||||
b) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (1) uses at run time a
|
|
||||||
copy of the library already present on the user's computer system,
|
|
||||||
rather than copying library functions into the executable, and (2)
|
|
||||||
will operate properly with a modified version of the library, if
|
|
||||||
the user installs one, as long as the modified version is
|
|
||||||
interface-compatible with the version that the work was made with.
|
|
||||||
|
|
||||||
c) Accompany the work with a written offer, valid for at
|
|
||||||
least three years, to give the same user the materials
|
|
||||||
specified in Subsection 6a, above, for a charge no more
|
|
||||||
than the cost of performing this distribution.
|
|
||||||
|
|
||||||
d) If distribution of the work is made by offering access to copy
|
|
||||||
from a designated place, offer equivalent access to copy the above
|
|
||||||
specified materials from the same place.
|
|
||||||
|
|
||||||
e) Verify that the user has already received a copy of these
|
|
||||||
materials or that you have already sent this user a copy.
|
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the
|
|
||||||
Library" must include any data and utility programs needed for
|
|
||||||
reproducing the executable from it. However, as a special exception,
|
|
||||||
the materials to be distributed need not include anything that is
|
|
||||||
normally distributed (in either source or binary form) with the major
|
|
||||||
components (compiler, kernel, and so on) of the operating system on
|
|
||||||
which the executable runs, unless that component itself accompanies
|
|
||||||
the executable.
|
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
|
||||||
use both them and the Library together in an executable that you
|
|
||||||
distribute.
|
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
|
||||||
Library side-by-side in a single library together with other library
|
|
||||||
facilities not covered by this License, and distribute such a combined
|
|
||||||
library, provided that the separate distribution of the work based on
|
|
||||||
the Library and of the other library facilities is otherwise
|
|
||||||
permitted, and provided that you do these two things:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work
|
|
||||||
based on the Library, uncombined with any other library
|
|
||||||
facilities. This must be distributed under the terms of the
|
|
||||||
Sections above.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact
|
|
||||||
that part of it is a work based on the Library, and explaining
|
|
||||||
where to find the accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute
|
|
||||||
the Library except as expressly provided under this License. Any
|
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or
|
|
||||||
distribute the Library is void, and will automatically terminate your
|
|
||||||
rights under this License. However, parties who have received copies,
|
|
||||||
or rights, from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full compliance.
|
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Library or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Library (or any work based on the
|
|
||||||
Library), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Library or works based on it.
|
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the
|
|
||||||
Library), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute, link with or modify the Library
|
|
||||||
subject to these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties with
|
|
||||||
this License.
|
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Library by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Library.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any
|
|
||||||
particular circumstance, the balance of the section is intended to apply,
|
|
||||||
and the section as a whole is intended to apply in other circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Library under this License may add
|
|
||||||
an explicit geographical distribution limitation excluding those countries,
|
|
||||||
so that distribution is permitted only in or among countries not thus
|
|
||||||
excluded. In such case, this License incorporates the limitation as if
|
|
||||||
written in the body of this License.
|
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new
|
|
||||||
versions of the Lesser General Public License from time to time.
|
|
||||||
Such new versions will be similar in spirit to the present version,
|
|
||||||
but may differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library
|
|
||||||
specifies a version number of this License which applies to it and
|
|
||||||
"any later version", you have the option of following the terms and
|
|
||||||
conditions either of that version or of any later version published by
|
|
||||||
the Free Software Foundation. If the Library does not specify a
|
|
||||||
license version number, you may choose any version ever published by
|
|
||||||
the Free Software Foundation.
|
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
|
||||||
programs whose distribution conditions are incompatible with these,
|
|
||||||
write to the author to ask for permission. For software which is
|
|
||||||
copyrighted by the Free Software Foundation, write to the Free
|
|
||||||
Software Foundation; we sometimes make exceptions for this. Our
|
|
||||||
decision will be guided by the two goals of preserving the free status
|
|
||||||
of all derivatives of our free software and of promoting the sharing
|
|
||||||
and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
||||||
DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries
|
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
|
||||||
possible use to the public, we recommend making it free software that
|
|
||||||
everyone can redistribute and change. You can do so by permitting
|
|
||||||
redistribution under these terms (or, alternatively, under the terms of the
|
|
||||||
ordinary General Public License).
|
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is
|
|
||||||
safest to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least the
|
|
||||||
"copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
That's all there is to it!
|
|
1007
lib_generic/lzma/LzmaDec.c
Normal file
1007
lib_generic/lzma/LzmaDec.c
Normal file
File diff suppressed because it is too large
Load diff
223
lib_generic/lzma/LzmaDec.h
Normal file
223
lib_generic/lzma/LzmaDec.h
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
/* LzmaDec.h -- LZMA Decoder
|
||||||
|
2008-10-04 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
|
#ifndef __LZMADEC_H
|
||||||
|
#define __LZMADEC_H
|
||||||
|
|
||||||
|
#include "Types.h"
|
||||||
|
|
||||||
|
/* #define _LZMA_PROB32 */
|
||||||
|
/* _LZMA_PROB32 can increase the speed on some CPUs,
|
||||||
|
but memory usage for CLzmaDec::probs will be doubled in that case */
|
||||||
|
|
||||||
|
#ifdef _LZMA_PROB32
|
||||||
|
#define CLzmaProb UInt32
|
||||||
|
#else
|
||||||
|
#define CLzmaProb UInt16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- LZMA Properties ---------- */
|
||||||
|
|
||||||
|
#define LZMA_PROPS_SIZE 5
|
||||||
|
|
||||||
|
typedef struct _CLzmaProps
|
||||||
|
{
|
||||||
|
unsigned lc, lp, pb;
|
||||||
|
UInt32 dicSize;
|
||||||
|
} CLzmaProps;
|
||||||
|
|
||||||
|
/* LzmaProps_Decode - decodes properties
|
||||||
|
Returns:
|
||||||
|
SZ_OK
|
||||||
|
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||||
|
*/
|
||||||
|
|
||||||
|
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- LZMA Decoder state ---------- */
|
||||||
|
|
||||||
|
/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
|
||||||
|
Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
|
||||||
|
|
||||||
|
#define LZMA_REQUIRED_INPUT_MAX 20
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
CLzmaProps prop;
|
||||||
|
CLzmaProb *probs;
|
||||||
|
Byte *dic;
|
||||||
|
const Byte *buf;
|
||||||
|
UInt32 range, code;
|
||||||
|
SizeT dicPos;
|
||||||
|
SizeT dicBufSize;
|
||||||
|
UInt32 processedPos;
|
||||||
|
UInt32 checkDicSize;
|
||||||
|
unsigned state;
|
||||||
|
UInt32 reps[4];
|
||||||
|
unsigned remainLen;
|
||||||
|
int needFlush;
|
||||||
|
int needInitState;
|
||||||
|
UInt32 numProbs;
|
||||||
|
unsigned tempBufSize;
|
||||||
|
Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
|
||||||
|
} CLzmaDec;
|
||||||
|
|
||||||
|
#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
|
||||||
|
|
||||||
|
void LzmaDec_Init(CLzmaDec *p);
|
||||||
|
|
||||||
|
/* There are two types of LZMA streams:
|
||||||
|
0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
|
||||||
|
1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
LZMA_FINISH_ANY, /* finish at any point */
|
||||||
|
LZMA_FINISH_END /* block must be finished at the end */
|
||||||
|
} ELzmaFinishMode;
|
||||||
|
|
||||||
|
/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
|
||||||
|
|
||||||
|
You must use LZMA_FINISH_END, when you know that current output buffer
|
||||||
|
covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
|
||||||
|
|
||||||
|
If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
|
||||||
|
and output value of destLen will be less than output buffer size limit.
|
||||||
|
You can check status result also.
|
||||||
|
|
||||||
|
You can use multiple checks to test data integrity after full decompression:
|
||||||
|
1) Check Result and "status" variable.
|
||||||
|
2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
|
||||||
|
3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
|
||||||
|
You must use correct finish mode in that case. */
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
|
||||||
|
LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
|
||||||
|
LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
|
||||||
|
LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
|
||||||
|
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
|
||||||
|
} ELzmaStatus;
|
||||||
|
|
||||||
|
/* ELzmaStatus is used only as output value for function call */
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- Interfaces ---------- */
|
||||||
|
|
||||||
|
/* There are 3 levels of interfaces:
|
||||||
|
1) Dictionary Interface
|
||||||
|
2) Buffer Interface
|
||||||
|
3) One Call Interface
|
||||||
|
You can select any of these interfaces, but don't mix functions from different
|
||||||
|
groups for same object. */
|
||||||
|
|
||||||
|
|
||||||
|
/* There are two variants to allocate state for Dictionary Interface:
|
||||||
|
1) LzmaDec_Allocate / LzmaDec_Free
|
||||||
|
2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
|
||||||
|
You can use variant 2, if you set dictionary buffer manually.
|
||||||
|
For Buffer Interface you must always use variant 1.
|
||||||
|
|
||||||
|
LzmaDec_Allocate* can return:
|
||||||
|
SZ_OK
|
||||||
|
SZ_ERROR_MEM - Memory allocation error
|
||||||
|
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||||
|
*/
|
||||||
|
|
||||||
|
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
|
||||||
|
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
|
||||||
|
|
||||||
|
SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
|
||||||
|
void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
|
||||||
|
|
||||||
|
/* ---------- Dictionary Interface ---------- */
|
||||||
|
|
||||||
|
/* You can use it, if you want to eliminate the overhead for data copying from
|
||||||
|
dictionary to some other external buffer.
|
||||||
|
You must work with CLzmaDec variables directly in this interface.
|
||||||
|
|
||||||
|
STEPS:
|
||||||
|
LzmaDec_Constr()
|
||||||
|
LzmaDec_Allocate()
|
||||||
|
for (each new stream)
|
||||||
|
{
|
||||||
|
LzmaDec_Init()
|
||||||
|
while (it needs more decompression)
|
||||||
|
{
|
||||||
|
LzmaDec_DecodeToDic()
|
||||||
|
use data from CLzmaDec::dic and update CLzmaDec::dicPos
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LzmaDec_Free()
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LzmaDec_DecodeToDic
|
||||||
|
|
||||||
|
The decoding to internal dictionary buffer (CLzmaDec::dic).
|
||||||
|
You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
|
||||||
|
|
||||||
|
finishMode:
|
||||||
|
It has meaning only if the decoding reaches output limit (dicLimit).
|
||||||
|
LZMA_FINISH_ANY - Decode just dicLimit bytes.
|
||||||
|
LZMA_FINISH_END - Stream must be finished after dicLimit.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
SZ_OK
|
||||||
|
status:
|
||||||
|
LZMA_STATUS_FINISHED_WITH_MARK
|
||||||
|
LZMA_STATUS_NOT_FINISHED
|
||||||
|
LZMA_STATUS_NEEDS_MORE_INPUT
|
||||||
|
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
||||||
|
SZ_ERROR_DATA - Data error
|
||||||
|
*/
|
||||||
|
|
||||||
|
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
|
||||||
|
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- Buffer Interface ---------- */
|
||||||
|
|
||||||
|
/* It's zlib-like interface.
|
||||||
|
See LzmaDec_DecodeToDic description for information about STEPS and return results,
|
||||||
|
but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
|
||||||
|
to work with CLzmaDec variables manually.
|
||||||
|
|
||||||
|
finishMode:
|
||||||
|
It has meaning only if the decoding reaches output limit (*destLen).
|
||||||
|
LZMA_FINISH_ANY - Decode just destLen bytes.
|
||||||
|
LZMA_FINISH_END - Stream must be finished after (*destLen).
|
||||||
|
*/
|
||||||
|
|
||||||
|
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
|
||||||
|
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------- One Call Interface ---------- */
|
||||||
|
|
||||||
|
/* LzmaDecode
|
||||||
|
|
||||||
|
finishMode:
|
||||||
|
It has meaning only if the decoding reaches output limit (*destLen).
|
||||||
|
LZMA_FINISH_ANY - Decode just destLen bytes.
|
||||||
|
LZMA_FINISH_END - Stream must be finished after (*destLen).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
SZ_OK
|
||||||
|
status:
|
||||||
|
LZMA_STATUS_FINISHED_WITH_MARK
|
||||||
|
LZMA_STATUS_NOT_FINISHED
|
||||||
|
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
||||||
|
SZ_ERROR_DATA - Data error
|
||||||
|
SZ_ERROR_MEM - Memory allocation error
|
||||||
|
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||||
|
SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
||||||
|
*/
|
||||||
|
|
||||||
|
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
||||||
|
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
|
||||||
|
ELzmaStatus *status, ISzAlloc *alloc);
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,584 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaDecode.c
|
|
||||||
LZMA Decoder (optimized for Speed version)
|
|
||||||
|
|
||||||
LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
|
|
||||||
http://www.7-zip.org/
|
|
||||||
|
|
||||||
LZMA SDK is licensed under two licenses:
|
|
||||||
1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
2) Common Public License (CPL)
|
|
||||||
It means that you can select one of these two licenses and
|
|
||||||
follow rules of that license.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION:
|
|
||||||
Igor Pavlov, as the author of this Code, expressly permits you to
|
|
||||||
statically or dynamically link your Code (or bind by name) to the
|
|
||||||
interfaces of this file without subjecting your linked Code to the
|
|
||||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
|
||||||
to this file, however, are subject to the LGPL or CPL terms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "LzmaDecode.h"
|
|
||||||
|
|
||||||
#define kNumTopBits 24
|
|
||||||
#define kTopValue ((UInt32)1 << kNumTopBits)
|
|
||||||
|
|
||||||
#define kNumBitModelTotalBits 11
|
|
||||||
#define kBitModelTotal (1 << kNumBitModelTotalBits)
|
|
||||||
#define kNumMoveBits 5
|
|
||||||
|
|
||||||
#define RC_READ_BYTE (*Buffer++)
|
|
||||||
|
|
||||||
#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
|
|
||||||
{ int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) \
|
|
||||||
{ SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \
|
|
||||||
BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }}
|
|
||||||
|
|
||||||
#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }
|
|
||||||
|
|
||||||
#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
|
|
||||||
|
|
||||||
#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
|
|
||||||
#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
|
|
||||||
#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
|
|
||||||
|
|
||||||
#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
|
|
||||||
{ UpdateBit0(p); mi <<= 1; A0; } else \
|
|
||||||
{ UpdateBit1(p); mi = (mi + mi) + 1; A1; }
|
|
||||||
|
|
||||||
#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
|
|
||||||
|
|
||||||
#define RangeDecoderBitTreeDecode(probs, numLevels, res) \
|
|
||||||
{ int i = numLevels; res = 1; \
|
|
||||||
do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
|
|
||||||
res -= (1 << numLevels); }
|
|
||||||
|
|
||||||
|
|
||||||
#define kNumPosBitsMax 4
|
|
||||||
#define kNumPosStatesMax (1 << kNumPosBitsMax)
|
|
||||||
|
|
||||||
#define kLenNumLowBits 3
|
|
||||||
#define kLenNumLowSymbols (1 << kLenNumLowBits)
|
|
||||||
#define kLenNumMidBits 3
|
|
||||||
#define kLenNumMidSymbols (1 << kLenNumMidBits)
|
|
||||||
#define kLenNumHighBits 8
|
|
||||||
#define kLenNumHighSymbols (1 << kLenNumHighBits)
|
|
||||||
|
|
||||||
#define LenChoice 0
|
|
||||||
#define LenChoice2 (LenChoice + 1)
|
|
||||||
#define LenLow (LenChoice2 + 1)
|
|
||||||
#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
|
|
||||||
#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
|
|
||||||
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
|
|
||||||
|
|
||||||
|
|
||||||
#define kNumStates 12
|
|
||||||
#define kNumLitStates 7
|
|
||||||
|
|
||||||
#define kStartPosModelIndex 4
|
|
||||||
#define kEndPosModelIndex 14
|
|
||||||
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
|
|
||||||
|
|
||||||
#define kNumPosSlotBits 6
|
|
||||||
#define kNumLenToPosStates 4
|
|
||||||
|
|
||||||
#define kNumAlignBits 4
|
|
||||||
#define kAlignTableSize (1 << kNumAlignBits)
|
|
||||||
|
|
||||||
#define kMatchMinLen 2
|
|
||||||
|
|
||||||
#define IsMatch 0
|
|
||||||
#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
|
|
||||||
#define IsRepG0 (IsRep + kNumStates)
|
|
||||||
#define IsRepG1 (IsRepG0 + kNumStates)
|
|
||||||
#define IsRepG2 (IsRepG1 + kNumStates)
|
|
||||||
#define IsRep0Long (IsRepG2 + kNumStates)
|
|
||||||
#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
|
|
||||||
#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
|
|
||||||
#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
|
|
||||||
#define LenCoder (Align + kAlignTableSize)
|
|
||||||
#define RepLenCoder (LenCoder + kNumLenProbs)
|
|
||||||
#define Literal (RepLenCoder + kNumLenProbs)
|
|
||||||
|
|
||||||
#if Literal != LZMA_BASE_SIZE
|
|
||||||
StopCompilingDueBUG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size)
|
|
||||||
{
|
|
||||||
unsigned char prop0;
|
|
||||||
if (size < LZMA_PROPERTIES_SIZE)
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
prop0 = propsData[0];
|
|
||||||
if (prop0 >= (9 * 5 * 5))
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
{
|
|
||||||
for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5));
|
|
||||||
for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9);
|
|
||||||
propsRes->lc = prop0;
|
|
||||||
/*
|
|
||||||
unsigned char remainder = (unsigned char)(prop0 / 9);
|
|
||||||
propsRes->lc = prop0 % 9;
|
|
||||||
propsRes->pb = remainder / 5;
|
|
||||||
propsRes->lp = remainder % 5;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
propsRes->DictionarySize = 0;
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8);
|
|
||||||
if (propsRes->DictionarySize == 0)
|
|
||||||
propsRes->DictionarySize = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define kLzmaStreamWasFinishedId (-1)
|
|
||||||
|
|
||||||
int LzmaDecode(CLzmaDecoderState *vs,
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
ILzmaInCallback *InCallback,
|
|
||||||
#else
|
|
||||||
const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
|
|
||||||
#endif
|
|
||||||
unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)
|
|
||||||
{
|
|
||||||
CProb *p = vs->Probs;
|
|
||||||
SizeT nowPos = 0;
|
|
||||||
Byte previousByte = 0;
|
|
||||||
UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1;
|
|
||||||
UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1;
|
|
||||||
int lc = vs->Properties.lc;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
|
|
||||||
UInt32 Range = vs->Range;
|
|
||||||
UInt32 Code = vs->Code;
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
const Byte *Buffer = vs->Buffer;
|
|
||||||
const Byte *BufferLim = vs->BufferLim;
|
|
||||||
#else
|
|
||||||
const Byte *Buffer = inStream;
|
|
||||||
const Byte *BufferLim = inStream + inSize;
|
|
||||||
#endif
|
|
||||||
int state = vs->State;
|
|
||||||
UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
|
|
||||||
int len = vs->RemainLen;
|
|
||||||
UInt32 globalPos = vs->GlobalPos;
|
|
||||||
UInt32 distanceLimit = vs->DistanceLimit;
|
|
||||||
|
|
||||||
Byte *dictionary = vs->Dictionary;
|
|
||||||
UInt32 dictionarySize = vs->Properties.DictionarySize;
|
|
||||||
UInt32 dictionaryPos = vs->DictionaryPos;
|
|
||||||
|
|
||||||
Byte tempDictionary[4];
|
|
||||||
|
|
||||||
#ifndef _LZMA_IN_CB
|
|
||||||
*inSizeProcessed = 0;
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = 0;
|
|
||||||
if (len == kLzmaStreamWasFinishedId)
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
|
|
||||||
if (dictionarySize == 0)
|
|
||||||
{
|
|
||||||
dictionary = tempDictionary;
|
|
||||||
dictionarySize = 1;
|
|
||||||
tempDictionary[0] = vs->TempDictionary[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == kLzmaNeedInitId)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
|
|
||||||
UInt32 i;
|
|
||||||
for (i = 0; i < numProbs; i++)
|
|
||||||
p[i] = kBitModelTotal >> 1;
|
|
||||||
rep0 = rep1 = rep2 = rep3 = 1;
|
|
||||||
state = 0;
|
|
||||||
globalPos = 0;
|
|
||||||
distanceLimit = 0;
|
|
||||||
dictionaryPos = 0;
|
|
||||||
dictionary[dictionarySize - 1] = 0;
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
RC_INIT;
|
|
||||||
#else
|
|
||||||
RC_INIT(inStream, inSize);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
while(len != 0 && nowPos < outSize)
|
|
||||||
{
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
if (dictionaryPos == 0)
|
|
||||||
previousByte = dictionary[dictionarySize - 1];
|
|
||||||
else
|
|
||||||
previousByte = dictionary[dictionaryPos - 1];
|
|
||||||
|
|
||||||
#else /* if !_LZMA_OUT_READ */
|
|
||||||
|
|
||||||
int state = 0;
|
|
||||||
UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
|
|
||||||
int len = 0;
|
|
||||||
const Byte *Buffer;
|
|
||||||
const Byte *BufferLim;
|
|
||||||
UInt32 Range;
|
|
||||||
UInt32 Code;
|
|
||||||
|
|
||||||
#ifndef _LZMA_IN_CB
|
|
||||||
*inSizeProcessed = 0;
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = 0;
|
|
||||||
|
|
||||||
{
|
|
||||||
UInt32 i;
|
|
||||||
UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
|
|
||||||
for (i = 0; i < numProbs; i++)
|
|
||||||
p[i] = kBitModelTotal >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
RC_INIT;
|
|
||||||
#else
|
|
||||||
RC_INIT(inStream, inSize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _LZMA_OUT_READ */
|
|
||||||
|
|
||||||
while(nowPos < outSize)
|
|
||||||
{
|
|
||||||
CProb *prob;
|
|
||||||
UInt32 bound;
|
|
||||||
int posState = (int)(
|
|
||||||
(nowPos
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
+ globalPos
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
& posStateMask);
|
|
||||||
|
|
||||||
prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
int symbol = 1;
|
|
||||||
UpdateBit0(prob)
|
|
||||||
prob = p + Literal + (LZMA_LIT_SIZE *
|
|
||||||
(((
|
|
||||||
(nowPos
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
+ globalPos
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
& literalPosMask) << lc) + (previousByte >> (8 - lc))));
|
|
||||||
|
|
||||||
if (state >= kNumLitStates)
|
|
||||||
{
|
|
||||||
int matchByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
matchByte = dictionary[pos];
|
|
||||||
#else
|
|
||||||
matchByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
do
|
|
||||||
{
|
|
||||||
int bit;
|
|
||||||
CProb *probLit;
|
|
||||||
matchByte <<= 1;
|
|
||||||
bit = (matchByte & 0x100);
|
|
||||||
probLit = prob + 0x100 + bit + symbol;
|
|
||||||
RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)
|
|
||||||
}
|
|
||||||
while (symbol < 0x100);
|
|
||||||
}
|
|
||||||
while (symbol < 0x100)
|
|
||||||
{
|
|
||||||
CProb *probLit = prob + symbol;
|
|
||||||
RC_GET_BIT(probLit, symbol)
|
|
||||||
}
|
|
||||||
previousByte = (Byte)symbol;
|
|
||||||
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit < dictionarySize)
|
|
||||||
distanceLimit++;
|
|
||||||
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#endif
|
|
||||||
if (state < 4) state = 0;
|
|
||||||
else if (state < 10) state -= 3;
|
|
||||||
else state -= 6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRep + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
rep3 = rep2;
|
|
||||||
rep2 = rep1;
|
|
||||||
rep1 = rep0;
|
|
||||||
state = state < kNumLitStates ? 0 : 3;
|
|
||||||
prob = p + LenCoder;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG0 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos;
|
|
||||||
#endif
|
|
||||||
UpdateBit0(prob);
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit == 0)
|
|
||||||
#else
|
|
||||||
if (nowPos == 0)
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
|
|
||||||
state = state < kNumLitStates ? 9 : 11;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
previousByte = dictionary[pos];
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#else
|
|
||||||
previousByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (distanceLimit < dictionarySize)
|
|
||||||
distanceLimit++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UInt32 distance;
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG1 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
distance = rep1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
prob = p + IsRepG2 + state;
|
|
||||||
IfBit0(prob)
|
|
||||||
{
|
|
||||||
UpdateBit0(prob);
|
|
||||||
distance = rep2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(prob);
|
|
||||||
distance = rep3;
|
|
||||||
rep3 = rep2;
|
|
||||||
}
|
|
||||||
rep2 = rep1;
|
|
||||||
}
|
|
||||||
rep1 = rep0;
|
|
||||||
rep0 = distance;
|
|
||||||
}
|
|
||||||
state = state < kNumLitStates ? 8 : 11;
|
|
||||||
prob = p + RepLenCoder;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int numBits, offset;
|
|
||||||
CProb *probLen = prob + LenChoice;
|
|
||||||
IfBit0(probLen)
|
|
||||||
{
|
|
||||||
UpdateBit0(probLen);
|
|
||||||
probLen = prob + LenLow + (posState << kLenNumLowBits);
|
|
||||||
offset = 0;
|
|
||||||
numBits = kLenNumLowBits;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(probLen);
|
|
||||||
probLen = prob + LenChoice2;
|
|
||||||
IfBit0(probLen)
|
|
||||||
{
|
|
||||||
UpdateBit0(probLen);
|
|
||||||
probLen = prob + LenMid + (posState << kLenNumMidBits);
|
|
||||||
offset = kLenNumLowSymbols;
|
|
||||||
numBits = kLenNumMidBits;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UpdateBit1(probLen);
|
|
||||||
probLen = prob + LenHigh;
|
|
||||||
offset = kLenNumLowSymbols + kLenNumMidSymbols;
|
|
||||||
numBits = kLenNumHighBits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RangeDecoderBitTreeDecode(probLen, numBits, len);
|
|
||||||
len += offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state < 4)
|
|
||||||
{
|
|
||||||
int posSlot;
|
|
||||||
state += kNumLitStates;
|
|
||||||
prob = p + PosSlot +
|
|
||||||
((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
|
|
||||||
kNumPosSlotBits);
|
|
||||||
RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);
|
|
||||||
if (posSlot >= kStartPosModelIndex)
|
|
||||||
{
|
|
||||||
int numDirectBits = ((posSlot >> 1) - 1);
|
|
||||||
rep0 = (2 | ((UInt32)posSlot & 1));
|
|
||||||
if (posSlot < kEndPosModelIndex)
|
|
||||||
{
|
|
||||||
rep0 <<= numDirectBits;
|
|
||||||
prob = p + SpecPos + rep0 - posSlot - 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
numDirectBits -= kNumAlignBits;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
RC_NORMALIZE
|
|
||||||
Range >>= 1;
|
|
||||||
rep0 <<= 1;
|
|
||||||
if (Code >= Range)
|
|
||||||
{
|
|
||||||
Code -= Range;
|
|
||||||
rep0 |= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (--numDirectBits != 0);
|
|
||||||
prob = p + Align;
|
|
||||||
rep0 <<= kNumAlignBits;
|
|
||||||
numDirectBits = kNumAlignBits;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int i = 1;
|
|
||||||
int mi = 1;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
CProb *prob3 = prob + mi;
|
|
||||||
RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
|
|
||||||
i <<= 1;
|
|
||||||
}
|
|
||||||
while(--numDirectBits != 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
rep0 = posSlot;
|
|
||||||
if (++rep0 == (UInt32)(0))
|
|
||||||
{
|
|
||||||
/* it's for stream version */
|
|
||||||
len = kLzmaStreamWasFinishedId;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
len += kMatchMinLen;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (rep0 > distanceLimit)
|
|
||||||
#else
|
|
||||||
if (rep0 > nowPos)
|
|
||||||
#endif
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
if (dictionarySize - distanceLimit > (UInt32)len)
|
|
||||||
distanceLimit += len;
|
|
||||||
else
|
|
||||||
distanceLimit = dictionarySize;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 pos = dictionaryPos - rep0;
|
|
||||||
if (pos >= dictionarySize)
|
|
||||||
pos += dictionarySize;
|
|
||||||
previousByte = dictionary[pos];
|
|
||||||
dictionary[dictionaryPos] = previousByte;
|
|
||||||
if (++dictionaryPos == dictionarySize)
|
|
||||||
dictionaryPos = 0;
|
|
||||||
#else
|
|
||||||
previousByte = outStream[nowPos - rep0];
|
|
||||||
#endif
|
|
||||||
len--;
|
|
||||||
outStream[nowPos++] = previousByte;
|
|
||||||
}
|
|
||||||
while(len != 0 && nowPos < outSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RC_NORMALIZE;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
vs->Range = Range;
|
|
||||||
vs->Code = Code;
|
|
||||||
vs->DictionaryPos = dictionaryPos;
|
|
||||||
vs->GlobalPos = globalPos + (UInt32)nowPos;
|
|
||||||
vs->DistanceLimit = distanceLimit;
|
|
||||||
vs->Reps[0] = rep0;
|
|
||||||
vs->Reps[1] = rep1;
|
|
||||||
vs->Reps[2] = rep2;
|
|
||||||
vs->Reps[3] = rep3;
|
|
||||||
vs->State = state;
|
|
||||||
vs->RemainLen = len;
|
|
||||||
vs->TempDictionary[0] = tempDictionary[0];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
vs->Buffer = Buffer;
|
|
||||||
vs->BufferLim = BufferLim;
|
|
||||||
#else
|
|
||||||
*inSizeProcessed = (SizeT)(Buffer - inStream);
|
|
||||||
#endif
|
|
||||||
*outSizeProcessed = nowPos;
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaDecode.h
|
|
||||||
LZMA Decoder interface
|
|
||||||
|
|
||||||
LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
|
|
||||||
http://www.7-zip.org/
|
|
||||||
|
|
||||||
LZMA SDK is licensed under two licenses:
|
|
||||||
1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
2) Common Public License (CPL)
|
|
||||||
It means that you can select one of these two licenses and
|
|
||||||
follow rules of that license.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION:
|
|
||||||
Igor Pavlov, as the author of this code, expressly permits you to
|
|
||||||
statically or dynamically link your code (or bind by name) to the
|
|
||||||
interfaces of this file without subjecting your linked code to the
|
|
||||||
terms of the CPL or GNU LGPL. Any modifications or additions
|
|
||||||
to this file, however, are subject to the LGPL or CPL terms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LZMADECODE_H
|
|
||||||
#define __LZMADECODE_H
|
|
||||||
|
|
||||||
#include "LzmaTypes.h"
|
|
||||||
|
|
||||||
/* #define _LZMA_IN_CB */
|
|
||||||
/* Use callback for input data */
|
|
||||||
|
|
||||||
/* #define _LZMA_OUT_READ */
|
|
||||||
/* Use read function for output data */
|
|
||||||
|
|
||||||
/* #define _LZMA_PROB32 */
|
|
||||||
/* It can increase speed on some 32-bit CPUs,
|
|
||||||
but memory usage will be doubled in that case */
|
|
||||||
|
|
||||||
/* #define _LZMA_LOC_OPT */
|
|
||||||
/* Enable local speed optimizations inside code */
|
|
||||||
|
|
||||||
#ifdef _LZMA_PROB32
|
|
||||||
#define CProb UInt32
|
|
||||||
#else
|
|
||||||
#define CProb UInt16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LZMA_RESULT_OK 0
|
|
||||||
#define LZMA_RESULT_DATA_ERROR 1
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
typedef struct _ILzmaInCallback
|
|
||||||
{
|
|
||||||
int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize);
|
|
||||||
} ILzmaInCallback;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LZMA_BASE_SIZE 1846
|
|
||||||
#define LZMA_LIT_SIZE 768
|
|
||||||
|
|
||||||
#define LZMA_PROPERTIES_SIZE 5
|
|
||||||
|
|
||||||
typedef struct _CLzmaProperties
|
|
||||||
{
|
|
||||||
int lc;
|
|
||||||
int lp;
|
|
||||||
int pb;
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
UInt32 DictionarySize;
|
|
||||||
#endif
|
|
||||||
}CLzmaProperties;
|
|
||||||
|
|
||||||
int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size);
|
|
||||||
|
|
||||||
#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
|
|
||||||
|
|
||||||
#define kLzmaNeedInitId (-2)
|
|
||||||
|
|
||||||
typedef struct _CLzmaDecoderState
|
|
||||||
{
|
|
||||||
CLzmaProperties Properties;
|
|
||||||
CProb *Probs;
|
|
||||||
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
const unsigned char *Buffer;
|
|
||||||
const unsigned char *BufferLim;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
unsigned char *Dictionary;
|
|
||||||
UInt32 Range;
|
|
||||||
UInt32 Code;
|
|
||||||
UInt32 DictionaryPos;
|
|
||||||
UInt32 GlobalPos;
|
|
||||||
UInt32 DistanceLimit;
|
|
||||||
UInt32 Reps[4];
|
|
||||||
int State;
|
|
||||||
int RemainLen;
|
|
||||||
unsigned char TempDictionary[4];
|
|
||||||
#endif
|
|
||||||
} CLzmaDecoderState;
|
|
||||||
|
|
||||||
#ifdef _LZMA_OUT_READ
|
|
||||||
#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int LzmaDecode(CLzmaDecoderState *vs,
|
|
||||||
#ifdef _LZMA_IN_CB
|
|
||||||
ILzmaInCallback *inCallback,
|
|
||||||
#else
|
|
||||||
const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
|
|
||||||
#endif
|
|
||||||
unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.57
|
* Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.65
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
* Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
|
||||||
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2005 Igor Pavlov
|
* Copyright (C) 1999-2005 Igor Pavlov
|
||||||
|
@ -40,29 +40,32 @@
|
||||||
#ifdef CONFIG_LZMA
|
#ifdef CONFIG_LZMA
|
||||||
|
|
||||||
#define LZMA_PROPERTIES_OFFSET 0
|
#define LZMA_PROPERTIES_OFFSET 0
|
||||||
#define LZMA_SIZE_OFFSET LZMA_PROPERTIES_SIZE
|
#define LZMA_SIZE_OFFSET LZMA_PROPS_SIZE
|
||||||
#define LZMA_DATA_OFFSET LZMA_SIZE_OFFSET+sizeof(uint64_t)
|
#define LZMA_DATA_OFFSET LZMA_SIZE_OFFSET+sizeof(uint64_t)
|
||||||
|
|
||||||
#include "LzmaTools.h"
|
#include "LzmaTools.h"
|
||||||
#include "LzmaDecode.h"
|
#include "LzmaDec.h"
|
||||||
|
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
|
static void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
|
||||||
|
static void SzFree(void *p, void *address) { p = p; free(address); }
|
||||||
|
|
||||||
int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
||||||
unsigned char *inStream, SizeT length)
|
unsigned char *inStream, SizeT length)
|
||||||
{
|
{
|
||||||
int res = LZMA_RESULT_DATA_ERROR;
|
int res = SZ_ERROR_DATA;
|
||||||
int i;
|
int i;
|
||||||
|
ISzAlloc g_Alloc;
|
||||||
|
|
||||||
SizeT outSizeFull = 0xFFFFFFFF; /* 4GBytes limit */
|
SizeT outSizeFull = 0xFFFFFFFF; /* 4GBytes limit */
|
||||||
SizeT inProcessed;
|
SizeT inProcessed;
|
||||||
SizeT outProcessed;
|
SizeT outProcessed;
|
||||||
SizeT outSize;
|
SizeT outSize;
|
||||||
SizeT outSizeHigh;
|
SizeT outSizeHigh;
|
||||||
CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */
|
ELzmaStatus state;
|
||||||
unsigned char properties[LZMA_PROPERTIES_SIZE];
|
SizeT compressedSize = (SizeT)(length - LZMA_PROPS_SIZE);
|
||||||
SizeT compressedSize = (SizeT)(length - LZMA_DATA_OFFSET);
|
|
||||||
|
|
||||||
debug ("LZMA: Image address............... 0x%lx\n", inStream);
|
debug ("LZMA: Image address............... 0x%lx\n", inStream);
|
||||||
debug ("LZMA: Properties address.......... 0x%lx\n", inStream + LZMA_PROPERTIES_OFFSET);
|
debug ("LZMA: Properties address.......... 0x%lx\n", inStream + LZMA_PROPERTIES_OFFSET);
|
||||||
|
@ -70,15 +73,7 @@ int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
||||||
debug ("LZMA: Compressed data address..... 0x%lx\n", inStream + LZMA_DATA_OFFSET);
|
debug ("LZMA: Compressed data address..... 0x%lx\n", inStream + LZMA_DATA_OFFSET);
|
||||||
debug ("LZMA: Destination address......... 0x%lx\n", outStream);
|
debug ("LZMA: Destination address......... 0x%lx\n", outStream);
|
||||||
|
|
||||||
memcpy(properties, inStream + LZMA_PROPERTIES_OFFSET, LZMA_PROPERTIES_SIZE);
|
|
||||||
|
|
||||||
memset(&state, 0, sizeof(state));
|
memset(&state, 0, sizeof(state));
|
||||||
res = LzmaDecodeProperties(&state.Properties,
|
|
||||||
properties,
|
|
||||||
LZMA_PROPERTIES_SIZE);
|
|
||||||
if (res != LZMA_RESULT_OK) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
outSize = 0;
|
outSize = 0;
|
||||||
outSizeHigh = 0;
|
outSizeHigh = 0;
|
||||||
|
@ -106,36 +101,26 @@ int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
debug ("LZMA: 64bit support not enabled.\n");
|
debug ("LZMA: 64bit support not enabled.\n");
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
return SZ_ERROR_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug ("LZMA: Uncompresed size............ 0x%lx\n", outSizeFull);
|
debug ("LZMA: Uncompresed size............ 0x%lx\n", outSizeFull);
|
||||||
debug ("LZMA: Compresed size.............. 0x%lx\n", compressedSize);
|
debug ("LZMA: Compresed size.............. 0x%lx\n", compressedSize);
|
||||||
debug ("LZMA: Dynamic memory needed....... 0x%lx", LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
|
||||||
|
|
||||||
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
g_Alloc.Alloc = SzAlloc;
|
||||||
|
g_Alloc.Free = SzFree;
|
||||||
if (state.Probs == 0
|
|
||||||
|| (outStream == 0 && outSizeFull != 0)
|
|
||||||
|| (inStream == 0 && compressedSize != 0)) {
|
|
||||||
free(state.Probs);
|
|
||||||
debug ("\n");
|
|
||||||
return LZMA_RESULT_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug (" allocated.\n");
|
|
||||||
|
|
||||||
/* Decompress */
|
/* Decompress */
|
||||||
|
outProcessed = outSizeFull;
|
||||||
res = LzmaDecode(&state,
|
res = LzmaDecode(
|
||||||
inStream + LZMA_DATA_OFFSET, compressedSize, &inProcessed,
|
outStream, &outProcessed,
|
||||||
outStream, outSizeFull, &outProcessed);
|
inStream + LZMA_DATA_OFFSET, &compressedSize,
|
||||||
if (res != LZMA_RESULT_OK) {
|
inStream, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &state, &g_Alloc);
|
||||||
|
*uncompressedSize = outProcessed;
|
||||||
|
if (res != SZ_OK) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
*uncompressedSize = outProcessed;
|
|
||||||
free(state.Probs);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.57
|
* Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.65
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
* Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
|
||||||
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
* Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
#ifndef __LZMA_TOOL_H__
|
#ifndef __LZMA_TOOL_H__
|
||||||
#define __LZMA_TOOL_H__
|
#define __LZMA_TOOL_H__
|
||||||
|
|
||||||
#include "LzmaTypes.h"
|
#include <lzma/LzmaTypes.h>
|
||||||
|
|
||||||
extern int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
extern int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
|
||||||
unsigned char *inStream, SizeT length);
|
unsigned char *inStream, SizeT length);
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
LzmaTypes.h
|
|
||||||
|
|
||||||
Types for LZMA Decoder
|
|
||||||
|
|
||||||
This file written and distributed to public domain by Igor Pavlov.
|
|
||||||
This file is part of LZMA SDK 4.40 (2006-05-01)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LZMATYPES_H
|
|
||||||
#define __LZMATYPES_H
|
|
||||||
|
|
||||||
#ifndef _7ZIP_BYTE_DEFINED
|
|
||||||
#define _7ZIP_BYTE_DEFINED
|
|
||||||
typedef unsigned char Byte;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _7ZIP_UINT16_DEFINED
|
|
||||||
#define _7ZIP_UINT16_DEFINED
|
|
||||||
typedef unsigned short UInt16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _7ZIP_UINT32_DEFINED
|
|
||||||
#define _7ZIP_UINT32_DEFINED
|
|
||||||
#ifdef _LZMA_UINT32_IS_ULONG
|
|
||||||
typedef unsigned long UInt32;
|
|
||||||
#else
|
|
||||||
typedef unsigned int UInt32;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* #define _LZMA_NO_SYSTEM_SIZE_T */
|
|
||||||
/* You can use it, if you don't want <stddef.h> */
|
|
||||||
|
|
||||||
#ifndef _7ZIP_SIZET_DEFINED
|
|
||||||
#define _7ZIP_SIZET_DEFINED
|
|
||||||
#ifdef _LZMA_NO_SYSTEM_SIZE_T
|
|
||||||
typedef UInt32 SizeT;
|
|
||||||
#else
|
|
||||||
#include <stddef.h>
|
|
||||||
typedef size_t SizeT;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -30,7 +30,9 @@ LIB = $(obj)liblzma.a
|
||||||
|
|
||||||
SOBJS =
|
SOBJS =
|
||||||
|
|
||||||
COBJS-$(CONFIG_LZMA) += LzmaDecode.o LzmaTools.o
|
CFLAGS += -D_LZMA_PROB32 -I$(TOPDIR)/include/linux
|
||||||
|
|
||||||
|
COBJS-$(CONFIG_LZMA) += LzmaDec.o LzmaTools.o
|
||||||
|
|
||||||
COBJS = $(COBJS-y)
|
COBJS = $(COBJS-y)
|
||||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
|
|
|
@ -7,14 +7,14 @@ Author: Igor Pavlov
|
||||||
The import is made using the import_lzmasdk.sh script that:
|
The import is made using the import_lzmasdk.sh script that:
|
||||||
|
|
||||||
* untars the lzmaXYY.tar.bz2 file (from the download web page)
|
* untars the lzmaXYY.tar.bz2 file (from the download web page)
|
||||||
* copies the files LzmaDecode.h, LzmaTypes.h, LzmaDecode.c, history.txt,
|
* copies the files LzmaDec.h, Types.h, LzmaDec.c, history.txt,
|
||||||
LGPL.txt, and lzma.txt from source archive into the lib_lzma directory (pwd).
|
and lzma.txt from source archive into the lib_lzma directory (pwd).
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
./import_lzmasdk.sh ~/lzma457.tar.bz2
|
. import_lzmasdk.sh ~/lzma465.tar.bz2
|
||||||
|
|
||||||
Notice: The files from lzma sdk are not _modified_ by this script!
|
Notice: The files from lzma sdk are _not modified_ by this script!
|
||||||
|
|
||||||
The files LzmaTools.{c,h} are provided to export the lzmaBuffToBuffDecompress()
|
The files LzmaTools.{c,h} are provided to export the lzmaBuffToBuffDecompress()
|
||||||
function that wraps the complex LzmaDecode() function from the LZMA SDK. The
|
function that wraps the complex LzmaDecode() function from the LZMA SDK. The
|
||||||
|
|
208
lib_generic/lzma/Types.h
Normal file
208
lib_generic/lzma/Types.h
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
/* Types.h -- Basic types
|
||||||
|
2008-11-23 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
|
#ifndef __7Z_TYPES_H
|
||||||
|
#define __7Z_TYPES_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SZ_OK 0
|
||||||
|
|
||||||
|
#define SZ_ERROR_DATA 1
|
||||||
|
#define SZ_ERROR_MEM 2
|
||||||
|
#define SZ_ERROR_CRC 3
|
||||||
|
#define SZ_ERROR_UNSUPPORTED 4
|
||||||
|
#define SZ_ERROR_PARAM 5
|
||||||
|
#define SZ_ERROR_INPUT_EOF 6
|
||||||
|
#define SZ_ERROR_OUTPUT_EOF 7
|
||||||
|
#define SZ_ERROR_READ 8
|
||||||
|
#define SZ_ERROR_WRITE 9
|
||||||
|
#define SZ_ERROR_PROGRESS 10
|
||||||
|
#define SZ_ERROR_FAIL 11
|
||||||
|
#define SZ_ERROR_THREAD 12
|
||||||
|
|
||||||
|
#define SZ_ERROR_ARCHIVE 16
|
||||||
|
#define SZ_ERROR_NO_ARCHIVE 17
|
||||||
|
|
||||||
|
typedef int SRes;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
typedef DWORD WRes;
|
||||||
|
#else
|
||||||
|
typedef int WRes;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RINOK
|
||||||
|
#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef unsigned char Byte;
|
||||||
|
typedef short Int16;
|
||||||
|
typedef unsigned short UInt16;
|
||||||
|
|
||||||
|
#ifdef _LZMA_UINT32_IS_ULONG
|
||||||
|
typedef long Int32;
|
||||||
|
typedef unsigned long UInt32;
|
||||||
|
#else
|
||||||
|
typedef int Int32;
|
||||||
|
typedef unsigned int UInt32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _SZ_NO_INT_64
|
||||||
|
|
||||||
|
/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
|
||||||
|
NOTES: Some code will work incorrectly in that case! */
|
||||||
|
|
||||||
|
typedef long Int64;
|
||||||
|
typedef unsigned long UInt64;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||||
|
typedef __int64 Int64;
|
||||||
|
typedef unsigned __int64 UInt64;
|
||||||
|
#else
|
||||||
|
typedef long long int Int64;
|
||||||
|
typedef unsigned long long int UInt64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LZMA_NO_SYSTEM_SIZE_T
|
||||||
|
typedef UInt32 SizeT;
|
||||||
|
#else
|
||||||
|
typedef size_t SizeT;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int Bool;
|
||||||
|
#define True 1
|
||||||
|
#define False 0
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
|
#if _MSC_VER >= 1300
|
||||||
|
#define MY_NO_INLINE __declspec(noinline)
|
||||||
|
#else
|
||||||
|
#define MY_NO_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MY_CDECL __cdecl
|
||||||
|
#define MY_STD_CALL __stdcall
|
||||||
|
#define MY_FAST_CALL MY_NO_INLINE __fastcall
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define MY_CDECL
|
||||||
|
#define MY_STD_CALL
|
||||||
|
#define MY_FAST_CALL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* The following interfaces use first parameter as pointer to structure */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SRes (*Read)(void *p, void *buf, size_t *size);
|
||||||
|
/* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
||||||
|
(output(*size) < input(*size)) is allowed */
|
||||||
|
} ISeqInStream;
|
||||||
|
|
||||||
|
/* it can return SZ_ERROR_INPUT_EOF */
|
||||||
|
SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
|
||||||
|
SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
|
||||||
|
SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t (*Write)(void *p, const void *buf, size_t size);
|
||||||
|
/* Returns: result - the number of actually written bytes.
|
||||||
|
(result < size) means error */
|
||||||
|
} ISeqOutStream;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SZ_SEEK_SET = 0,
|
||||||
|
SZ_SEEK_CUR = 1,
|
||||||
|
SZ_SEEK_END = 2
|
||||||
|
} ESzSeek;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */
|
||||||
|
SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
|
||||||
|
} ISeekInStream;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SRes (*Look)(void *p, void **buf, size_t *size);
|
||||||
|
/* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
|
||||||
|
(output(*size) > input(*size)) is not allowed
|
||||||
|
(output(*size) < input(*size)) is allowed */
|
||||||
|
SRes (*Skip)(void *p, size_t offset);
|
||||||
|
/* offset must be <= output(*size) of Look */
|
||||||
|
|
||||||
|
SRes (*Read)(void *p, void *buf, size_t *size);
|
||||||
|
/* reads directly (without buffer). It's same as ISeqInStream::Read */
|
||||||
|
SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
|
||||||
|
} ILookInStream;
|
||||||
|
|
||||||
|
SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
|
||||||
|
SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
|
||||||
|
|
||||||
|
/* reads via ILookInStream::Read */
|
||||||
|
SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
|
||||||
|
SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
|
||||||
|
|
||||||
|
#define LookToRead_BUF_SIZE (1 << 14)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ILookInStream s;
|
||||||
|
ISeekInStream *realStream;
|
||||||
|
size_t pos;
|
||||||
|
size_t size;
|
||||||
|
Byte buf[LookToRead_BUF_SIZE];
|
||||||
|
} CLookToRead;
|
||||||
|
|
||||||
|
void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
|
||||||
|
void LookToRead_Init(CLookToRead *p);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ISeqInStream s;
|
||||||
|
ILookInStream *realStream;
|
||||||
|
} CSecToLook;
|
||||||
|
|
||||||
|
void SecToLook_CreateVTable(CSecToLook *p);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ISeqInStream s;
|
||||||
|
ILookInStream *realStream;
|
||||||
|
} CSecToRead;
|
||||||
|
|
||||||
|
void SecToRead_CreateVTable(CSecToRead *p);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
|
||||||
|
/* Returns: result. (result != SZ_OK) means break.
|
||||||
|
Value (UInt64)(Int64)-1 for size means unknown value. */
|
||||||
|
} ICompressProgress;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
void *(*Alloc)(void *p, size_t size);
|
||||||
|
void (*Free)(void *p, void *address); /* address can be 0 */
|
||||||
|
} ISzAlloc;
|
||||||
|
|
||||||
|
#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
|
||||||
|
#define IAlloc_Free(p, a) (p)->Free((p), a)
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,119 +1,157 @@
|
||||||
HISTORY of the LZMA SDK
|
HISTORY of the LZMA SDK
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
4.57 2007-12-12
|
4.65 2009-02-03
|
||||||
-------------------------
|
-------------------------
|
||||||
- Speed optimizations in Ñ++ LZMA Decoder.
|
- Some minor fixes
|
||||||
- Small changes for more compatibility with some C/C++ compilers.
|
|
||||||
|
|
||||||
|
|
||||||
4.49 beta 2007-07-05
|
4.63 2008-12-31
|
||||||
-------------------------
|
-------------------------
|
||||||
- .7z ANSI-C Decoder:
|
- Some minor fixes
|
||||||
|
|
||||||
|
|
||||||
|
4.61 beta 2008-11-23
|
||||||
|
-------------------------
|
||||||
|
- The bug in ANSI-C LZMA Decoder was fixed:
|
||||||
|
If encoded stream was corrupted, decoder could access memory
|
||||||
|
outside of allocated range.
|
||||||
|
- Some changes in ANSI-C 7z Decoder interfaces.
|
||||||
|
- LZMA SDK is placed in the public domain.
|
||||||
|
|
||||||
|
|
||||||
|
4.60 beta 2008-08-19
|
||||||
|
-------------------------
|
||||||
|
- Some minor fixes.
|
||||||
|
|
||||||
|
|
||||||
|
4.59 beta 2008-08-13
|
||||||
|
-------------------------
|
||||||
|
- The bug was fixed:
|
||||||
|
LZMA Encoder in fast compression mode could access memory outside of
|
||||||
|
allocated range in some rare cases.
|
||||||
|
|
||||||
|
|
||||||
|
4.58 beta 2008-05-05
|
||||||
|
-------------------------
|
||||||
|
- ANSI-C LZMA Decoder was rewritten for speed optimizations.
|
||||||
|
- ANSI-C LZMA Encoder was included to LZMA SDK.
|
||||||
|
- C++ LZMA code now is just wrapper over ANSI-C code.
|
||||||
|
|
||||||
|
|
||||||
|
4.57 2007-12-12
|
||||||
|
-------------------------
|
||||||
|
- Speed optimizations in Ñ++ LZMA Decoder.
|
||||||
|
- Small changes for more compatibility with some C/C++ compilers.
|
||||||
|
|
||||||
|
|
||||||
|
4.49 beta 2007-07-05
|
||||||
|
-------------------------
|
||||||
|
- .7z ANSI-C Decoder:
|
||||||
- now it supports BCJ and BCJ2 filters
|
- now it supports BCJ and BCJ2 filters
|
||||||
- now it supports files larger than 4 GB.
|
- now it supports files larger than 4 GB.
|
||||||
- now it supports "Last Write Time" field for files.
|
- now it supports "Last Write Time" field for files.
|
||||||
- C++ code for .7z archives compressing/decompressing from 7-zip
|
- C++ code for .7z archives compressing/decompressing from 7-zip
|
||||||
was included to LZMA SDK.
|
was included to LZMA SDK.
|
||||||
|
|
||||||
|
|
||||||
4.43 2006-06-04
|
4.43 2006-06-04
|
||||||
-------------------------
|
-------------------------
|
||||||
- Small changes for more compatibility with some C/C++ compilers.
|
- Small changes for more compatibility with some C/C++ compilers.
|
||||||
|
|
||||||
|
|
||||||
4.42 2006-05-15
|
4.42 2006-05-15
|
||||||
-------------------------
|
-------------------------
|
||||||
- Small changes in .h files in ANSI-C version.
|
- Small changes in .h files in ANSI-C version.
|
||||||
|
|
||||||
|
|
||||||
4.39 beta 2006-04-14
|
4.39 beta 2006-04-14
|
||||||
-------------------------
|
-------------------------
|
||||||
- Bug in versions 4.33b:4.38b was fixed:
|
- The bug in versions 4.33b:4.38b was fixed:
|
||||||
C++ version of LZMA encoder could not correctly compress
|
C++ version of LZMA encoder could not correctly compress
|
||||||
files larger than 2 GB with HC4 match finder (-mfhc4).
|
files larger than 2 GB with HC4 match finder (-mfhc4).
|
||||||
|
|
||||||
|
|
||||||
4.37 beta 2005-04-06
|
4.37 beta 2005-04-06
|
||||||
-------------------------
|
-------------------------
|
||||||
- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
|
- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
|
||||||
|
|
||||||
|
|
||||||
4.35 beta 2005-03-02
|
4.35 beta 2005-03-02
|
||||||
-------------------------
|
-------------------------
|
||||||
- Bug was fixed in C++ version of LZMA Decoder:
|
- The bug was fixed in C++ version of LZMA Decoder:
|
||||||
If encoded stream was corrupted, decoder could access memory
|
If encoded stream was corrupted, decoder could access memory
|
||||||
outside of allocated range.
|
outside of allocated range.
|
||||||
|
|
||||||
|
|
||||||
4.34 beta 2006-02-27
|
4.34 beta 2006-02-27
|
||||||
-------------------------
|
-------------------------
|
||||||
- Compressing speed and memory requirements for compressing were increased
|
- Compressing speed and memory requirements for compressing were increased
|
||||||
- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
|
- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
|
||||||
|
|
||||||
|
|
||||||
4.32 2005-12-09
|
4.32 2005-12-09
|
||||||
-------------------------
|
-------------------------
|
||||||
- Java version of LZMA SDK was included
|
- Java version of LZMA SDK was included
|
||||||
|
|
||||||
|
|
||||||
4.30 2005-11-20
|
4.30 2005-11-20
|
||||||
-------------------------
|
-------------------------
|
||||||
- Compression ratio was improved in -a2 mode
|
- Compression ratio was improved in -a2 mode
|
||||||
- Speed optimizations for compressing in -a2 mode
|
- Speed optimizations for compressing in -a2 mode
|
||||||
- -fb switch now supports values up to 273
|
- -fb switch now supports values up to 273
|
||||||
- Bug in 7z_C (7zIn.c) was fixed:
|
- The bug in 7z_C (7zIn.c) was fixed:
|
||||||
It used Alloc/Free functions from different memory pools.
|
It used Alloc/Free functions from different memory pools.
|
||||||
So if program used two memory pools, it worked incorrectly.
|
So if program used two memory pools, it worked incorrectly.
|
||||||
- 7z_C: .7z format supporting was improved
|
- 7z_C: .7z format supporting was improved
|
||||||
- LZMA# SDK (C#.NET version) was included
|
- LZMA# SDK (C#.NET version) was included
|
||||||
|
|
||||||
|
|
||||||
4.27 (Updated) 2005-09-21
|
4.27 (Updated) 2005-09-21
|
||||||
-------------------------
|
-------------------------
|
||||||
- Some GUIDs/interfaces in C++ were changed.
|
- Some GUIDs/interfaces in C++ were changed.
|
||||||
IStream.h:
|
IStream.h:
|
||||||
ISequentialInStream::Read now works as old ReadPart
|
ISequentialInStream::Read now works as old ReadPart
|
||||||
ISequentialOutStream::Write now works as old WritePart
|
ISequentialOutStream::Write now works as old WritePart
|
||||||
|
|
||||||
|
|
||||||
4.27 2005-08-07
|
4.27 2005-08-07
|
||||||
-------------------------
|
-------------------------
|
||||||
- Bug in LzmaDecodeSize.c was fixed:
|
- The bug in LzmaDecodeSize.c was fixed:
|
||||||
if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
|
if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
|
||||||
decompressing worked incorrectly.
|
decompressing worked incorrectly.
|
||||||
|
|
||||||
|
|
||||||
4.26 2005-08-05
|
4.26 2005-08-05
|
||||||
-------------------------
|
-------------------------
|
||||||
- Fixes in 7z_C code and LzmaTest.c:
|
- Fixes in 7z_C code and LzmaTest.c:
|
||||||
previous versions could work incorrectly,
|
previous versions could work incorrectly,
|
||||||
if malloc(0) returns 0
|
if malloc(0) returns 0
|
||||||
|
|
||||||
|
|
||||||
4.23 2005-06-29
|
4.23 2005-06-29
|
||||||
-------------------------
|
-------------------------
|
||||||
- Small fixes in C++ code
|
- Small fixes in C++ code
|
||||||
|
|
||||||
|
|
||||||
4.22 2005-06-10
|
4.22 2005-06-10
|
||||||
-------------------------
|
-------------------------
|
||||||
- Small fixes
|
- Small fixes
|
||||||
|
|
||||||
|
|
||||||
4.21 2005-06-08
|
4.21 2005-06-08
|
||||||
-------------------------
|
-------------------------
|
||||||
- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
|
- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
|
||||||
- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
|
- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
|
||||||
- LzmaStateDecode.h
|
- LzmaStateDecode.h
|
||||||
- LzmaStateDecode.c
|
- LzmaStateDecode.c
|
||||||
- LzmaStateTest.c
|
- LzmaStateTest.c
|
||||||
- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
|
- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
|
||||||
|
|
||||||
|
|
||||||
4.17 2005-04-18
|
4.17 2005-04-18
|
||||||
-------------------------
|
-------------------------
|
||||||
- New example for RAM->RAM compressing/decompressing:
|
- New example for RAM->RAM compressing/decompressing:
|
||||||
LZMA + BCJ (filter for x86 code):
|
LZMA + BCJ (filter for x86 code):
|
||||||
- LzmaRam.h
|
- LzmaRam.h
|
||||||
- LzmaRam.cpp
|
- LzmaRam.cpp
|
||||||
|
@ -122,53 +160,53 @@ HISTORY of the LZMA SDK
|
||||||
- -f86 switch for lzma.exe
|
- -f86 switch for lzma.exe
|
||||||
|
|
||||||
|
|
||||||
4.16 2005-03-29
|
4.16 2005-03-29
|
||||||
-------------------------
|
-------------------------
|
||||||
- Bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
|
- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
|
||||||
If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
|
If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
|
||||||
decoder could access memory outside of allocated range.
|
decoder could access memory outside of allocated range.
|
||||||
- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
|
- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
|
||||||
Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
|
Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
|
||||||
LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
|
LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
|
||||||
- Small speed optimization in LZMA C++ code
|
- Small speed optimization in LZMA C++ code
|
||||||
- filter for SPARC's code was added
|
- filter for SPARC's code was added
|
||||||
- Simplified version of .7z ANSI-C Decoder was included
|
- Simplified version of .7z ANSI-C Decoder was included
|
||||||
|
|
||||||
|
|
||||||
4.06 2004-09-05
|
4.06 2004-09-05
|
||||||
-------------------------
|
-------------------------
|
||||||
- Bug in v4.05 was fixed:
|
- The bug in v4.05 was fixed:
|
||||||
LZMA-Encoder didn't release output stream in some cases.
|
LZMA-Encoder didn't release output stream in some cases.
|
||||||
|
|
||||||
|
|
||||||
4.05 2004-08-25
|
4.05 2004-08-25
|
||||||
-------------------------
|
-------------------------
|
||||||
- Source code of filters for x86, IA-64, ARM, ARM-Thumb
|
- Source code of filters for x86, IA-64, ARM, ARM-Thumb
|
||||||
and PowerPC code was included to SDK
|
and PowerPC code was included to SDK
|
||||||
- Some internal minor changes
|
- Some internal minor changes
|
||||||
|
|
||||||
|
|
||||||
4.04 2004-07-28
|
4.04 2004-07-28
|
||||||
-------------------------
|
-------------------------
|
||||||
- More compatibility with some C++ compilers
|
- More compatibility with some C++ compilers
|
||||||
|
|
||||||
|
|
||||||
4.03 2004-06-18
|
4.03 2004-06-18
|
||||||
-------------------------
|
-------------------------
|
||||||
- "Benchmark" command was added. It measures compressing
|
- "Benchmark" command was added. It measures compressing
|
||||||
and decompressing speed and shows rating values.
|
and decompressing speed and shows rating values.
|
||||||
Also it checks hardware errors.
|
Also it checks hardware errors.
|
||||||
|
|
||||||
|
|
||||||
4.02 2004-06-10
|
4.02 2004-06-10
|
||||||
-------------------------
|
-------------------------
|
||||||
- C++ LZMA Encoder/Decoder code now is more portable
|
- C++ LZMA Encoder/Decoder code now is more portable
|
||||||
and it can be compiled by GCC on Linux.
|
and it can be compiled by GCC on Linux.
|
||||||
|
|
||||||
|
|
||||||
4.01 2004-02-15
|
4.01 2004-02-15
|
||||||
-------------------------
|
-------------------------
|
||||||
- Some detection of data corruption was enabled.
|
- Some detection of data corruption was enabled.
|
||||||
LzmaDecode.c / RangeDecoderReadByte
|
LzmaDecode.c / RangeDecoderReadByte
|
||||||
.....
|
.....
|
||||||
{
|
{
|
||||||
|
@ -177,15 +215,15 @@ HISTORY of the LZMA SDK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
4.00 2004-02-13
|
4.00 2004-02-13
|
||||||
-------------------------
|
-------------------------
|
||||||
- Original version of LZMA SDK
|
- Original version of LZMA SDK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HISTORY of the LZMA
|
HISTORY of the LZMA
|
||||||
-------------------
|
-------------------
|
||||||
2001-2007: Improvements to LZMA compressing/decompressing code,
|
2001-2008: Improvements to LZMA compressing/decompressing code,
|
||||||
keeping compatibility with original LZMA format
|
keeping compatibility with original LZMA format
|
||||||
1996-2001: Development of LZMA compression format
|
1996-2001: Development of LZMA compression format
|
||||||
|
|
||||||
|
|
|
@ -17,14 +17,12 @@ fi
|
||||||
|
|
||||||
BASENAME=`basename $1 .tar.bz2`
|
BASENAME=`basename $1 .tar.bz2`
|
||||||
TMPDIR=/tmp/tmp_lib_$BASENAME
|
TMPDIR=/tmp/tmp_lib_$BASENAME
|
||||||
FILES="C/Compress/Lzma/LzmaDecode.h
|
FILES="C/LzmaDec.h
|
||||||
C/Compress/Lzma/LzmaTypes.h
|
C/Types.h
|
||||||
C/Compress/Lzma/LzmaDecode.c
|
C/LzmaDec.c
|
||||||
history.txt
|
history.txt
|
||||||
LGPL.txt
|
|
||||||
lzma.txt"
|
lzma.txt"
|
||||||
|
|
||||||
|
|
||||||
mkdir -p $TMPDIR
|
mkdir -p $TMPDIR
|
||||||
echo "Untar $1 -> $TMPDIR"
|
echo "Untar $1 -> $TMPDIR"
|
||||||
tar -jxf $1 -C $TMPDIR
|
tar -jxf $1 -C $TMPDIR
|
||||||
|
|
3
lib_generic/lzma/license.txt
Normal file
3
lib_generic/lzma/license.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
License
|
||||||
|
|
||||||
|
LZMA SDK is placed in the public domain.
|
|
@ -1,8 +1,6 @@
|
||||||
LZMA SDK 4.57
|
LZMA SDK 4.65
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
LZMA SDK Copyright (C) 1999-2007 Igor Pavlov
|
|
||||||
|
|
||||||
LZMA SDK provides the documentation, samples, header files, libraries,
|
LZMA SDK provides the documentation, samples, header files, libraries,
|
||||||
and tools you need to develop applications that use LZMA compression.
|
and tools you need to develop applications that use LZMA compression.
|
||||||
|
|
||||||
|
@ -20,70 +18,7 @@ decompressing.
|
||||||
LICENSE
|
LICENSE
|
||||||
-------
|
-------
|
||||||
|
|
||||||
LZMA SDK is available under any of the following licenses:
|
LZMA SDK is written and placed in the public domain by Igor Pavlov.
|
||||||
|
|
||||||
1) GNU Lesser General Public License (GNU LGPL)
|
|
||||||
2) Common Public License (CPL)
|
|
||||||
3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
|
|
||||||
4) Proprietary license
|
|
||||||
|
|
||||||
It means that you can select one of these four options and follow rules of that license.
|
|
||||||
|
|
||||||
|
|
||||||
1,2) GNU LGPL and CPL licenses are pretty similar and both these
|
|
||||||
licenses are classified as
|
|
||||||
- "Free software licenses" at http://www.gnu.org/
|
|
||||||
- "OSI-approved" at http://www.opensource.org/
|
|
||||||
|
|
||||||
|
|
||||||
3) SPECIAL EXCEPTION
|
|
||||||
|
|
||||||
Igor Pavlov, as the author of this code, expressly permits you
|
|
||||||
to statically or dynamically link your code (or bind by name)
|
|
||||||
to the files from LZMA SDK without subjecting your linked
|
|
||||||
code to the terms of the CPL or GNU LGPL.
|
|
||||||
Any modifications or additions to files from LZMA SDK, however,
|
|
||||||
are subject to the GNU LGPL or CPL terms.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
|
|
||||||
while you keep LZMA SDK code unmodified.
|
|
||||||
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits
|
|
||||||
you to use this code under the same terms and conditions contained in the License
|
|
||||||
Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov.
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version
|
|
||||||
of LZMA SDK as update for previous versions.
|
|
||||||
|
|
||||||
|
|
||||||
SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits
|
|
||||||
you to use code of the following files:
|
|
||||||
BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp,
|
|
||||||
LzmaAlone.cs, LzmaAlone.java
|
|
||||||
as public domain code.
|
|
||||||
|
|
||||||
|
|
||||||
4) Proprietary license
|
|
||||||
|
|
||||||
LZMA SDK also can be available under a proprietary license which
|
|
||||||
can include:
|
|
||||||
|
|
||||||
1) Right to modify code without subjecting modified code to the
|
|
||||||
terms of the CPL or GNU LGPL
|
|
||||||
2) Technical support for code
|
|
||||||
|
|
||||||
To request such proprietary license or any additional consultations,
|
|
||||||
send email message from that page:
|
|
||||||
http://www.7-zip.org/support.html
|
|
||||||
|
|
||||||
|
|
||||||
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
You should have received a copy of the Common Public License
|
|
||||||
along with this library.
|
|
||||||
|
|
||||||
|
|
||||||
LZMA SDK Contents
|
LZMA SDK Contents
|
||||||
|
@ -91,42 +26,28 @@ LZMA SDK Contents
|
||||||
|
|
||||||
LZMA SDK includes:
|
LZMA SDK includes:
|
||||||
|
|
||||||
- C++ source code of LZMA compressing and decompressing
|
- ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing
|
||||||
- ANSI-C compatible source code for LZMA decompressing
|
|
||||||
- C# source code for LZMA compressing and decompressing
|
|
||||||
- Java source code for LZMA compressing and decompressing
|
|
||||||
- Compiled file->file LZMA compressing/decompressing program for Windows system
|
- Compiled file->file LZMA compressing/decompressing program for Windows system
|
||||||
|
|
||||||
ANSI-C LZMA decompression code was ported from original C++ sources to C.
|
|
||||||
Also it was simplified and optimized for code size.
|
|
||||||
But it is fully compatible with LZMA from 7-Zip.
|
|
||||||
|
|
||||||
|
|
||||||
UNIX/Linux version
|
UNIX/Linux version
|
||||||
------------------
|
------------------
|
||||||
To compile C++ version of file->file LZMA, go to directory
|
To compile C++ version of file->file LZMA encoding, go to directory
|
||||||
C/7zip/Compress/LZMA_Alone
|
C++/7zip/Compress/LZMA_Alone
|
||||||
and type "make" or "make clean all" to recompile all.
|
and call make to recompile it:
|
||||||
|
make -f makefile.gcc clean all
|
||||||
|
|
||||||
In some UNIX/Linux versions you must compile LZMA with static libraries.
|
In some UNIX/Linux versions you must compile LZMA with static libraries.
|
||||||
To compile with static libraries, change string in makefile
|
To compile with static libraries, you can use
|
||||||
LIB = -lm
|
|
||||||
to string
|
|
||||||
LIB = -lm -static
|
LIB = -lm -static
|
||||||
|
|
||||||
|
|
||||||
Files
|
Files
|
||||||
---------------------
|
---------------------
|
||||||
C - C source code
|
|
||||||
CPP - CPP source code
|
|
||||||
CS - C# source code
|
|
||||||
Java - Java source code
|
|
||||||
lzma.txt - LZMA SDK description (this file)
|
lzma.txt - LZMA SDK description (this file)
|
||||||
7zFormat.txt - 7z Format description
|
7zFormat.txt - 7z Format description
|
||||||
7zC.txt - 7z ANSI-C Decoder description (this file)
|
7zC.txt - 7z ANSI-C Decoder description
|
||||||
methods.txt - Compression method IDs for .7z
|
methods.txt - Compression method IDs for .7z
|
||||||
LGPL.txt - GNU Lesser General Public License
|
|
||||||
CPL.html - Common Public License
|
|
||||||
lzma.exe - Compiled file->file LZMA encoder/decoder for Windows
|
lzma.exe - Compiled file->file LZMA encoder/decoder for Windows
|
||||||
history.txt - history of the LZMA SDK
|
history.txt - history of the LZMA SDK
|
||||||
|
|
||||||
|
@ -134,43 +55,41 @@ history.txt - history of the LZMA SDK
|
||||||
Source code structure
|
Source code structure
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
C - C files
|
C/ - C files
|
||||||
Compress - files related to compression/decompression
|
7zCrc*.* - CRC code
|
||||||
Lz - files related to LZ (Lempel-Ziv) compression algorithm
|
Alloc.* - Memory allocation functions
|
||||||
Lzma - ANSI-C compatible LZMA decompressor
|
Bra*.* - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
|
||||||
|
LzFind.* - Match finder for LZ (LZMA) encoders
|
||||||
|
LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding
|
||||||
|
LzHash.h - Additional file for LZ match finder
|
||||||
|
LzmaDec.* - LZMA decoding
|
||||||
|
LzmaEnc.* - LZMA encoding
|
||||||
|
LzmaLib.* - LZMA Library for DLL calling
|
||||||
|
Types.h - Basic types for another .c files
|
||||||
|
Threads.* - The code for multithreading.
|
||||||
|
|
||||||
LzmaDecode.h - interface for LZMA decoding on ANSI-C
|
LzmaLib - LZMA Library (.DLL for Windows)
|
||||||
LzmaDecode.c - LZMA decoding on ANSI-C (new fastest version)
|
|
||||||
LzmaDecodeSize.c - LZMA decoding on ANSI-C (old size-optimized version)
|
|
||||||
LzmaTest.c - test application that decodes LZMA encoded file
|
|
||||||
LzmaTypes.h - basic types for LZMA Decoder
|
|
||||||
LzmaStateDecode.h - interface for LZMA decoding (State version)
|
|
||||||
LzmaStateDecode.c - LZMA decoding on ANSI-C (State version)
|
|
||||||
LzmaStateTest.c - test application (State version)
|
|
||||||
|
|
||||||
Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
|
LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).
|
||||||
|
|
||||||
Archive - files related to archiving
|
Archive - files related to archiving
|
||||||
7z_C - 7z ANSI-C Decoder
|
7z - 7z ANSI-C Decoder
|
||||||
|
|
||||||
|
CPP/ -- CPP files
|
||||||
CPP -- CPP files
|
|
||||||
|
|
||||||
Common - common files for C++ projects
|
Common - common files for C++ projects
|
||||||
Windows - common files for Windows related code
|
Windows - common files for Windows related code
|
||||||
|
|
||||||
7zip - files related to 7-Zip Project
|
7zip - files related to 7-Zip Project
|
||||||
|
|
||||||
Common - common files for 7-Zip
|
Common - common files for 7-Zip
|
||||||
|
|
||||||
Compress - files related to compression/decompression
|
Compress - files related to compression/decompression
|
||||||
|
|
||||||
LZ - files related to LZ (Lempel-Ziv) compression algorithm
|
|
||||||
|
|
||||||
Copy - Copy coder
|
Copy - Copy coder
|
||||||
RangeCoder - Range Coder (special code of compression/decompression)
|
RangeCoder - Range Coder (special code of compression/decompression)
|
||||||
LZMA - LZMA compression/decompression on C++
|
LZMA - LZMA compression/decompression on C++
|
||||||
LZMA_Alone - file->file LZMA compression/decompression
|
LZMA_Alone - file->file LZMA compression/decompression
|
||||||
|
|
||||||
Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
|
Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
|
||||||
|
|
||||||
Archive - files related to archiving
|
Archive - files related to archiving
|
||||||
|
@ -192,7 +111,7 @@ CPP -- CPP files
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CS - C# files
|
CS/ - C# files
|
||||||
7zip
|
7zip
|
||||||
Common - some common files for 7-Zip
|
Common - some common files for 7-Zip
|
||||||
Compress - files related to compression/decompression
|
Compress - files related to compression/decompression
|
||||||
|
@ -201,46 +120,40 @@ CS - C# files
|
||||||
LzmaAlone - file->file LZMA compression/decompression
|
LzmaAlone - file->file LZMA compression/decompression
|
||||||
RangeCoder - Range Coder (special code of compression/decompression)
|
RangeCoder - Range Coder (special code of compression/decompression)
|
||||||
|
|
||||||
Java - Java files
|
Java/ - Java files
|
||||||
SevenZip
|
SevenZip
|
||||||
Compression - files related to compression/decompression
|
Compression - files related to compression/decompression
|
||||||
LZ - files related to LZ (Lempel-Ziv) compression algorithm
|
LZ - files related to LZ (Lempel-Ziv) compression algorithm
|
||||||
LZMA - LZMA compression/decompression
|
LZMA - LZMA compression/decompression
|
||||||
RangeCoder - Range Coder (special code of compression/decompression)
|
RangeCoder - Range Coder (special code of compression/decompression)
|
||||||
|
|
||||||
|
|
||||||
C/C++ source code of LZMA SDK is part of 7-Zip project.
|
C/C++ source code of LZMA SDK is part of 7-Zip project.
|
||||||
|
|
||||||
You can find ANSI-C LZMA decompressing code at folder
|
|
||||||
C/7zip/Compress/Lzma
|
|
||||||
7-Zip doesn't use that ANSI-C LZMA code and that code was developed
|
|
||||||
specially for this SDK. And files from C/7zip/Compress/Lzma do not need
|
|
||||||
files from other directories of SDK for compiling.
|
|
||||||
|
|
||||||
7-Zip source code can be downloaded from 7-Zip's SourceForge page:
|
7-Zip source code can be downloaded from 7-Zip's SourceForge page:
|
||||||
|
|
||||||
http://sourceforge.net/projects/sevenzip/
|
http://sourceforge.net/projects/sevenzip/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LZMA features
|
LZMA features
|
||||||
-------------
|
-------------
|
||||||
- Variable dictionary size (up to 1 GB)
|
- Variable dictionary size (up to 1 GB)
|
||||||
- Estimated compressing speed: about 1 MB/s on 1 GHz CPU
|
- Estimated compressing speed: about 2 MB/s on 2 GHz CPU
|
||||||
- Estimated decompressing speed:
|
- Estimated decompressing speed:
|
||||||
- 8-12 MB/s on 1 GHz Intel Pentium 3 or AMD Athlon
|
- 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64
|
||||||
- 500-1000 KB/s on 100 MHz ARM, MIPS, PowerPC or other simple RISC
|
- 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC
|
||||||
- Small memory requirements for decompressing (8-32 KB + DictionarySize)
|
- Small memory requirements for decompressing (16 KB + DictionarySize)
|
||||||
- Small code size for decompressing: 2-8 KB (depending from
|
- Small code size for decompressing: 5-8 KB
|
||||||
speed optimizations)
|
|
||||||
|
|
||||||
LZMA decoder uses only integer operations and can be
|
LZMA decoder uses only integer operations and can be
|
||||||
implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
|
implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
|
||||||
|
|
||||||
Some critical operations that affect to speed of LZMA decompression:
|
Some critical operations that affect the speed of LZMA decompression:
|
||||||
1) 32*16 bit integer multiply
|
1) 32*16 bit integer multiply
|
||||||
2) Misspredicted branches (penalty mostly depends from pipeline length)
|
2) Misspredicted branches (penalty mostly depends from pipeline length)
|
||||||
3) 32-bit shift and arithmetic operations
|
3) 32-bit shift and arithmetic operations
|
||||||
|
|
||||||
Speed of LZMA decompressing mostly depends from CPU speed.
|
The speed of LZMA decompressing mostly depends from CPU speed.
|
||||||
Memory speed has no big meaning. But if your CPU has small data cache,
|
Memory speed has no big meaning. But if your CPU has small data cache,
|
||||||
overall weight of memory speed will slightly increase.
|
overall weight of memory speed will slightly increase.
|
||||||
|
|
||||||
|
@ -260,11 +173,11 @@ Usage: LZMA <e|d> inputFile outputFile [<switches>...]
|
||||||
b: Benchmark. There are two tests: compressing and decompressing
|
b: Benchmark. There are two tests: compressing and decompressing
|
||||||
with LZMA method. Benchmark shows rating in MIPS (million
|
with LZMA method. Benchmark shows rating in MIPS (million
|
||||||
instructions per second). Rating value is calculated from
|
instructions per second). Rating value is calculated from
|
||||||
measured speed and it is normalized with AMD Athlon 64 X2 CPU
|
measured speed and it is normalized with Intel's Core 2 results.
|
||||||
results. Also Benchmark checks possible hardware errors (RAM
|
Also Benchmark checks possible hardware errors (RAM
|
||||||
errors in most cases). Benchmark uses these settings:
|
errors in most cases). Benchmark uses these settings:
|
||||||
(-a1, -d21, -fb32, -mfbt4). You can change only -d. Also you
|
(-a1, -d21, -fb32, -mfbt4). You can change only -d parameter.
|
||||||
can change number of iterations. Example for 30 iterations:
|
Also you can change the number of iterations. Example for 30 iterations:
|
||||||
LZMA b 30
|
LZMA b 30
|
||||||
Default number of iterations is 10.
|
Default number of iterations is 10.
|
||||||
|
|
||||||
|
@ -345,32 +258,29 @@ Compression ratio hints
|
||||||
Recommendations
|
Recommendations
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
To increase compression ratio for LZMA compressing it's desirable
|
To increase the compression ratio for LZMA compressing it's desirable
|
||||||
to have aligned data (if it's possible) and also it's desirable to locate
|
to have aligned data (if it's possible) and also it's desirable to locate
|
||||||
data in such order, where code is grouped in one place and data is
|
data in such order, where code is grouped in one place and data is
|
||||||
grouped in other place (it's better than such mixing: code, data, code,
|
grouped in other place (it's better than such mixing: code, data, code,
|
||||||
data, ...).
|
data, ...).
|
||||||
|
|
||||||
|
|
||||||
Using Filters
|
Filters
|
||||||
-------------
|
-------
|
||||||
You can increase compression ratio for some data types, using
|
You can increase the compression ratio for some data types, using
|
||||||
special filters before compressing. For example, it's possible to
|
special filters before compressing. For example, it's possible to
|
||||||
increase compression ratio on 5-10% for code for those CPU ISAs:
|
increase the compression ratio on 5-10% for code for those CPU ISAs:
|
||||||
x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
|
x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
|
||||||
|
|
||||||
You can find C/C++ source code of such filters in folder "7zip/Compress/Branch"
|
You can find C source code of such filters in C/Bra*.* files
|
||||||
|
|
||||||
You can check compression ratio gain of these filters with such
|
You can check the compression ratio gain of these filters with such
|
||||||
7-Zip commands (example for ARM code):
|
7-Zip commands (example for ARM code):
|
||||||
No filter:
|
No filter:
|
||||||
7z a a1.7z a.bin -m0=lzma
|
7z a a1.7z a.bin -m0=lzma
|
||||||
|
|
||||||
With filter for little-endian ARM code:
|
With filter for little-endian ARM code:
|
||||||
7z a a2.7z a.bin -m0=bc_arm -m1=lzma
|
7z a a2.7z a.bin -m0=arm -m1=lzma
|
||||||
|
|
||||||
With filter for big-endian ARM code (using additional Swap4 filter):
|
|
||||||
7z a a3.7z a.bin -m0=swap4 -m1=bc_arm -m2=lzma
|
|
||||||
|
|
||||||
It works in such manner:
|
It works in such manner:
|
||||||
Compressing = Filter_encoding + LZMA_encoding
|
Compressing = Filter_encoding + LZMA_encoding
|
||||||
|
@ -383,8 +293,7 @@ since compression ratio with filtering is higher.
|
||||||
|
|
||||||
These filters convert CALL (calling procedure) instructions
|
These filters convert CALL (calling procedure) instructions
|
||||||
from relative offsets to absolute addresses, so such data becomes more
|
from relative offsets to absolute addresses, so such data becomes more
|
||||||
compressible. Source code of these CALL filters is pretty simple
|
compressible.
|
||||||
(about 20 lines of C++), so you can convert it from C++ version yourself.
|
|
||||||
|
|
||||||
For some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
|
For some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
|
||||||
|
|
||||||
|
@ -392,7 +301,7 @@ For some ISAs (for example, for MIPS) it's impossible to get gain from such filt
|
||||||
LZMA compressed file format
|
LZMA compressed file format
|
||||||
---------------------------
|
---------------------------
|
||||||
Offset Size Description
|
Offset Size Description
|
||||||
0 1 Special LZMA properties for compressed data
|
0 1 Special LZMA properties (lc,lp, pb in encoded form)
|
||||||
1 4 Dictionary size (little endian)
|
1 4 Dictionary size (little endian)
|
||||||
5 8 Uncompressed size (little endian). -1 means unknown size
|
5 8 Uncompressed size (little endian). -1 means unknown size
|
||||||
13 Compressed data
|
13 Compressed data
|
||||||
|
@ -401,263 +310,285 @@ Offset Size Description
|
||||||
ANSI-C LZMA Decoder
|
ANSI-C LZMA Decoder
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
To compile ANSI-C LZMA Decoder you can use one of the following files sets:
|
Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.
|
||||||
1) LzmaDecode.h + LzmaDecode.c + LzmaTest.c (fastest version)
|
If you want to use old interfaces you can download previous version of LZMA SDK
|
||||||
2) LzmaDecode.h + LzmaDecodeSize.c + LzmaTest.c (old size-optimized version)
|
from sourceforge.net site.
|
||||||
3) LzmaStateDecode.h + LzmaStateDecode.c + LzmaStateTest.c (zlib-like interface)
|
|
||||||
|
To use ANSI-C LZMA Decoder you need the following files:
|
||||||
|
1) LzmaDec.h + LzmaDec.c + Types.h
|
||||||
|
LzmaUtil/LzmaUtil.c is example application that uses these files.
|
||||||
|
|
||||||
|
|
||||||
Memory requirements for LZMA decoding
|
Memory requirements for LZMA decoding
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
LZMA decoder doesn't allocate memory itself, so you must
|
|
||||||
allocate memory and send it to LZMA.
|
|
||||||
|
|
||||||
Stack usage of LZMA decoding function for local variables is not
|
Stack usage of LZMA decoding function for local variables is not
|
||||||
larger than 200 bytes.
|
larger than 200-400 bytes.
|
||||||
|
|
||||||
|
LZMA Decoder uses dictionary buffer and internal state structure.
|
||||||
|
Internal state structure consumes
|
||||||
|
state_size = (4 + (1.5 << (lc + lp))) KB
|
||||||
|
by default (lc=3, lp=0), state_size = 16 KB.
|
||||||
|
|
||||||
|
|
||||||
How To decompress data
|
How To decompress data
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
LZMA Decoder (ANSI-C version) now supports 5 interfaces:
|
LZMA Decoder (ANSI-C version) now supports 2 interfaces:
|
||||||
1) Single-call Decompressing
|
1) Single-call Decompressing
|
||||||
2) Single-call Decompressing with input stream callback
|
2) Multi-call State Decompressing (zlib-like interface)
|
||||||
3) Multi-call Decompressing with output buffer
|
|
||||||
4) Multi-call Decompressing with input callback and output buffer
|
|
||||||
5) Multi-call State Decompressing (zlib-like interface)
|
|
||||||
|
|
||||||
Variant-5 is similar to Variant-4, but Variant-5 doesn't use callback functions.
|
You must use external allocator:
|
||||||
|
Example:
|
||||||
|
void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
|
||||||
|
void SzFree(void *p, void *address) { p = p; free(address); }
|
||||||
|
ISzAlloc alloc = { SzAlloc, SzFree };
|
||||||
|
|
||||||
Decompressing steps
|
You can use p = p; operator to disable compiler warnings.
|
||||||
-------------------
|
|
||||||
|
|
||||||
1) read LZMA properties (5 bytes):
|
|
||||||
unsigned char properties[LZMA_PROPERTIES_SIZE];
|
|
||||||
|
|
||||||
2) read uncompressed size (8 bytes, little-endian)
|
|
||||||
|
|
||||||
3) Decode properties:
|
|
||||||
|
|
||||||
CLzmaDecoderState state; /* it's 24-140 bytes structure, if int is 32-bit */
|
|
||||||
|
|
||||||
if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
|
|
||||||
return PrintError(rs, "Incorrect stream properties");
|
|
||||||
|
|
||||||
4) Allocate memory block for internal Structures:
|
|
||||||
|
|
||||||
state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
|
|
||||||
if (state.Probs == 0)
|
|
||||||
return PrintError(rs, kCantAllocateMessage);
|
|
||||||
|
|
||||||
LZMA decoder uses array of CProb variables as internal structure.
|
|
||||||
By default, CProb is unsigned_short. But you can define _LZMA_PROB32 to make
|
|
||||||
it unsigned_int. It can increase speed on some 32-bit CPUs, but memory
|
|
||||||
usage will be doubled in that case.
|
|
||||||
|
|
||||||
|
|
||||||
5) Main Decompressing
|
Single-call Decompressing
|
||||||
|
-------------------------
|
||||||
You must use one of the following interfaces:
|
|
||||||
|
|
||||||
5.1 Single-call Decompressing
|
|
||||||
-----------------------------
|
|
||||||
When to use: RAM->RAM decompressing
|
When to use: RAM->RAM decompressing
|
||||||
Compile files: LzmaDecode.h, LzmaDecode.c
|
Compile files: LzmaDec.h + LzmaDec.c + Types.h
|
||||||
Compile defines: no defines
|
Compile defines: no defines
|
||||||
Memory Requirements:
|
Memory Requirements:
|
||||||
- Input buffer: compressed size
|
- Input buffer: compressed size
|
||||||
- Output buffer: uncompressed size
|
- Output buffer: uncompressed size
|
||||||
- LZMA Internal Structures (~16 KB for default settings)
|
- LZMA Internal Structures: state_size (16 KB for default settings)
|
||||||
|
|
||||||
Interface:
|
Interface:
|
||||||
int res = LzmaDecode(&state,
|
int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
|
||||||
inStream, compressedSize, &inProcessed,
|
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
|
||||||
outStream, outSize, &outProcessed);
|
ELzmaStatus *status, ISzAlloc *alloc);
|
||||||
|
In:
|
||||||
|
dest - output data
|
||||||
|
destLen - output data size
|
||||||
|
src - input data
|
||||||
|
srcLen - input data size
|
||||||
|
propData - LZMA properties (5 bytes)
|
||||||
|
propSize - size of propData buffer (5 bytes)
|
||||||
|
finishMode - It has meaning only if the decoding reaches output limit (*destLen).
|
||||||
|
LZMA_FINISH_ANY - Decode just destLen bytes.
|
||||||
|
LZMA_FINISH_END - Stream must be finished after (*destLen).
|
||||||
|
You can use LZMA_FINISH_END, when you know that
|
||||||
|
current output buffer covers last bytes of stream.
|
||||||
|
alloc - Memory allocator.
|
||||||
|
|
||||||
|
Out:
|
||||||
|
destLen - processed output size
|
||||||
|
srcLen - processed input size
|
||||||
|
|
||||||
|
Output:
|
||||||
|
SZ_OK
|
||||||
|
status:
|
||||||
|
LZMA_STATUS_FINISHED_WITH_MARK
|
||||||
|
LZMA_STATUS_NOT_FINISHED
|
||||||
|
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
|
||||||
|
SZ_ERROR_DATA - Data error
|
||||||
|
SZ_ERROR_MEM - Memory allocation error
|
||||||
|
SZ_ERROR_UNSUPPORTED - Unsupported properties
|
||||||
|
SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
|
||||||
|
|
||||||
|
If LZMA decoder sees end_marker before reaching output limit, it returns OK result,
|
||||||
|
and output value of destLen will be less than output buffer size limit.
|
||||||
|
|
||||||
|
You can use multiple checks to test data integrity after full decompression:
|
||||||
|
1) Check Result and "status" variable.
|
||||||
|
2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
|
||||||
|
3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
|
||||||
|
You must use correct finish mode in that case. */
|
||||||
|
|
||||||
|
|
||||||
5.2 Single-call Decompressing with input stream callback
|
Multi-call State Decompressing (zlib-like interface)
|
||||||
--------------------------------------------------------
|
----------------------------------------------------
|
||||||
When to use: File->RAM or Flash->RAM decompressing.
|
|
||||||
Compile files: LzmaDecode.h, LzmaDecode.c
|
|
||||||
Compile defines: _LZMA_IN_CB
|
|
||||||
Memory Requirements:
|
|
||||||
- Buffer for input stream: any size (for example, 16 KB)
|
|
||||||
- Output buffer: uncompressed size
|
|
||||||
- LZMA Internal Structures (~16 KB for default settings)
|
|
||||||
|
|
||||||
Interface:
|
|
||||||
typedef struct _CBuffer
|
|
||||||
{
|
|
||||||
ILzmaInCallback InCallback;
|
|
||||||
FILE *File;
|
|
||||||
unsigned char Buffer[kInBufferSize];
|
|
||||||
} CBuffer;
|
|
||||||
|
|
||||||
int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size)
|
|
||||||
{
|
|
||||||
CBuffer *bo = (CBuffer *)object;
|
|
||||||
*buffer = bo->Buffer;
|
|
||||||
*size = MyReadFile(bo->File, bo->Buffer, kInBufferSize);
|
|
||||||
return LZMA_RESULT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBuffer g_InBuffer;
|
|
||||||
|
|
||||||
g_InBuffer.File = inFile;
|
|
||||||
g_InBuffer.InCallback.Read = LzmaReadCompressed;
|
|
||||||
int res = LzmaDecode(&state,
|
|
||||||
&g_InBuffer.InCallback,
|
|
||||||
outStream, outSize, &outProcessed);
|
|
||||||
|
|
||||||
|
|
||||||
5.3 Multi-call decompressing with output buffer
|
|
||||||
-----------------------------------------------
|
|
||||||
When to use: RAM->File decompressing
|
|
||||||
Compile files: LzmaDecode.h, LzmaDecode.c
|
|
||||||
Compile defines: _LZMA_OUT_READ
|
|
||||||
Memory Requirements:
|
|
||||||
- Input buffer: compressed size
|
|
||||||
- Buffer for output stream: any size (for example, 16 KB)
|
|
||||||
- LZMA Internal Structures (~16 KB for default settings)
|
|
||||||
- LZMA dictionary (dictionary size is encoded in stream properties)
|
|
||||||
|
|
||||||
Interface:
|
|
||||||
|
|
||||||
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
|
|
||||||
|
|
||||||
LzmaDecoderInit(&state);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
LzmaDecode(&state,
|
|
||||||
inBuffer, inAvail, &inProcessed,
|
|
||||||
g_OutBuffer, outAvail, &outProcessed);
|
|
||||||
inAvail -= inProcessed;
|
|
||||||
inBuffer += inProcessed;
|
|
||||||
}
|
|
||||||
while you need more bytes
|
|
||||||
|
|
||||||
see LzmaTest.c for more details.
|
|
||||||
|
|
||||||
|
|
||||||
5.4 Multi-call decompressing with input callback and output buffer
|
|
||||||
------------------------------------------------------------------
|
|
||||||
When to use: File->File decompressing
|
|
||||||
Compile files: LzmaDecode.h, LzmaDecode.c
|
|
||||||
Compile defines: _LZMA_IN_CB, _LZMA_OUT_READ
|
|
||||||
Memory Requirements:
|
|
||||||
- Buffer for input stream: any size (for example, 16 KB)
|
|
||||||
- Buffer for output stream: any size (for example, 16 KB)
|
|
||||||
- LZMA Internal Structures (~16 KB for default settings)
|
|
||||||
- LZMA dictionary (dictionary size is encoded in stream properties)
|
|
||||||
|
|
||||||
Interface:
|
|
||||||
|
|
||||||
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
|
|
||||||
|
|
||||||
LzmaDecoderInit(&state);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
LzmaDecode(&state,
|
|
||||||
&bo.InCallback,
|
|
||||||
g_OutBuffer, outAvail, &outProcessed);
|
|
||||||
}
|
|
||||||
while you need more bytes
|
|
||||||
|
|
||||||
see LzmaTest.c for more details:
|
|
||||||
|
|
||||||
|
|
||||||
5.5 Multi-call State Decompressing (zlib-like interface)
|
|
||||||
------------------------------------------------------------------
|
|
||||||
When to use: file->file decompressing
|
When to use: file->file decompressing
|
||||||
Compile files: LzmaStateDecode.h, LzmaStateDecode.c
|
Compile files: LzmaDec.h + LzmaDec.c + Types.h
|
||||||
Compile defines:
|
|
||||||
Memory Requirements:
|
Memory Requirements:
|
||||||
- Buffer for input stream: any size (for example, 16 KB)
|
- Buffer for input stream: any size (for example, 16 KB)
|
||||||
- Buffer for output stream: any size (for example, 16 KB)
|
- Buffer for output stream: any size (for example, 16 KB)
|
||||||
- LZMA Internal Structures (~16 KB for default settings)
|
- LZMA Internal Structures: state_size (16 KB for default settings)
|
||||||
- LZMA dictionary (dictionary size is encoded in stream properties)
|
- LZMA dictionary (dictionary size is encoded in LZMA properties header)
|
||||||
|
|
||||||
Interface:
|
1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:
|
||||||
|
unsigned char header[LZMA_PROPS_SIZE + 8];
|
||||||
|
ReadFile(inFile, header, sizeof(header)
|
||||||
|
|
||||||
state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
|
2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
|
||||||
|
|
||||||
|
CLzmaDec state;
|
||||||
|
LzmaDec_Constr(&state);
|
||||||
|
res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);
|
||||||
|
if (res != SZ_OK)
|
||||||
|
return res;
|
||||||
|
|
||||||
LzmaDecoderInit(&state);
|
3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
|
||||||
do
|
|
||||||
|
LzmaDec_Init(&state);
|
||||||
|
for (;;)
|
||||||
{
|
{
|
||||||
res = LzmaDecode(&state,
|
...
|
||||||
inBuffer, inAvail, &inProcessed,
|
int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
|
||||||
g_OutBuffer, outAvail, &outProcessed,
|
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
|
||||||
finishDecoding);
|
...
|
||||||
inAvail -= inProcessed;
|
|
||||||
inBuffer += inProcessed;
|
|
||||||
}
|
}
|
||||||
while you need more bytes
|
|
||||||
|
|
||||||
see LzmaStateTest.c for more details:
|
|
||||||
|
|
||||||
|
|
||||||
6) Free all allocated blocks
|
4) Free all allocated structures
|
||||||
|
LzmaDec_Free(&state, &g_Alloc);
|
||||||
|
|
||||||
|
For full code example, look at C/LzmaUtil/LzmaUtil.c code.
|
||||||
|
|
||||||
|
|
||||||
Note
|
How To compress data
|
||||||
----
|
--------------------
|
||||||
LzmaDecodeSize.c is size-optimized version of LzmaDecode.c.
|
|
||||||
But compiled code of LzmaDecodeSize.c can be larger than
|
Compile files: LzmaEnc.h + LzmaEnc.c + Types.h +
|
||||||
compiled code of LzmaDecode.c. So it's better to use
|
LzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h
|
||||||
LzmaDecode.c in most cases.
|
|
||||||
|
Memory Requirements:
|
||||||
|
- (dictSize * 11.5 + 6 MB) + state_size
|
||||||
|
|
||||||
|
Lzma Encoder can use two memory allocators:
|
||||||
|
1) alloc - for small arrays.
|
||||||
|
2) allocBig - for big arrays.
|
||||||
|
|
||||||
|
For example, you can use Large RAM Pages (2 MB) in allocBig allocator for
|
||||||
|
better compression speed. Note that Windows has bad implementation for
|
||||||
|
Large RAM Pages.
|
||||||
|
It's OK to use same allocator for alloc and allocBig.
|
||||||
|
|
||||||
|
|
||||||
EXIT codes
|
Single-call Compression with callbacks
|
||||||
-----------
|
--------------------------------------
|
||||||
|
|
||||||
LZMA decoder can return one of the following codes:
|
Check C/LzmaUtil/LzmaUtil.c as example,
|
||||||
|
|
||||||
#define LZMA_RESULT_OK 0
|
When to use: file->file decompressing
|
||||||
#define LZMA_RESULT_DATA_ERROR 1
|
|
||||||
|
|
||||||
If you use callback function for input data and you return some
|
1) you must implement callback structures for interfaces:
|
||||||
error code, LZMA Decoder also returns that code.
|
ISeqInStream
|
||||||
|
ISeqOutStream
|
||||||
|
ICompressProgress
|
||||||
|
ISzAlloc
|
||||||
|
|
||||||
|
static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
|
||||||
|
static void SzFree(void *p, void *address) { p = p; MyFree(address); }
|
||||||
|
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
|
||||||
|
|
||||||
|
CFileSeqInStream inStream;
|
||||||
|
CFileSeqOutStream outStream;
|
||||||
|
|
||||||
|
inStream.funcTable.Read = MyRead;
|
||||||
|
inStream.file = inFile;
|
||||||
|
outStream.funcTable.Write = MyWrite;
|
||||||
|
outStream.file = outFile;
|
||||||
|
|
||||||
|
|
||||||
|
2) Create CLzmaEncHandle object;
|
||||||
|
|
||||||
|
CLzmaEncHandle enc;
|
||||||
|
|
||||||
|
enc = LzmaEnc_Create(&g_Alloc);
|
||||||
|
if (enc == 0)
|
||||||
|
return SZ_ERROR_MEM;
|
||||||
|
|
||||||
|
|
||||||
|
3) initialize CLzmaEncProps properties;
|
||||||
|
|
||||||
|
LzmaEncProps_Init(&props);
|
||||||
|
|
||||||
|
Then you can change some properties in that structure.
|
||||||
|
|
||||||
|
4) Send LZMA properties to LZMA Encoder
|
||||||
|
|
||||||
|
res = LzmaEnc_SetProps(enc, &props);
|
||||||
|
|
||||||
|
5) Write encoded properties to header
|
||||||
|
|
||||||
|
Byte header[LZMA_PROPS_SIZE + 8];
|
||||||
|
size_t headerSize = LZMA_PROPS_SIZE;
|
||||||
|
UInt64 fileSize;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
res = LzmaEnc_WriteProperties(enc, header, &headerSize);
|
||||||
|
fileSize = MyGetFileLength(inFile);
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
header[headerSize++] = (Byte)(fileSize >> (8 * i));
|
||||||
|
MyWriteFileAndCheck(outFile, header, headerSize)
|
||||||
|
|
||||||
|
6) Call encoding function:
|
||||||
|
res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
|
||||||
|
NULL, &g_Alloc, &g_Alloc);
|
||||||
|
|
||||||
|
7) Destroy LZMA Encoder Object
|
||||||
|
LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
|
||||||
|
|
||||||
|
|
||||||
|
If callback function return some error code, LzmaEnc_Encode also returns that code.
|
||||||
|
|
||||||
|
|
||||||
|
Single-call RAM->RAM Compression
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Single-call RAM->RAM Compression is similar to Compression with callbacks,
|
||||||
|
but you provide pointers to buffers instead of pointers to stream callbacks:
|
||||||
|
|
||||||
|
HRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
|
||||||
|
CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
|
||||||
|
ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
|
||||||
|
|
||||||
|
Return code:
|
||||||
|
SZ_OK - OK
|
||||||
|
SZ_ERROR_MEM - Memory allocation error
|
||||||
|
SZ_ERROR_PARAM - Incorrect paramater
|
||||||
|
SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
||||||
|
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LZMA Defines
|
LZMA Defines
|
||||||
------------
|
------------
|
||||||
|
|
||||||
_LZMA_IN_CB - Use callback for input data
|
_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.
|
||||||
|
|
||||||
_LZMA_OUT_READ - Use read function for output data
|
_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for
|
||||||
|
some structures will be doubled in that case.
|
||||||
|
|
||||||
_LZMA_LOC_OPT - Enable local speed optimizations inside code.
|
_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit.
|
||||||
_LZMA_LOC_OPT is only for LzmaDecodeSize.c (size-optimized version).
|
|
||||||
_LZMA_LOC_OPT doesn't affect LzmaDecode.c (speed-optimized version)
|
|
||||||
and LzmaStateDecode.c
|
|
||||||
|
|
||||||
_LZMA_PROB32 - It can increase speed on some 32-bit CPUs,
|
|
||||||
but memory usage will be doubled in that case
|
|
||||||
|
|
||||||
_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler
|
|
||||||
and long is 32-bit.
|
|
||||||
|
|
||||||
_LZMA_SYSTEM_SIZE_T - Define it if you want to use system's size_t.
|
|
||||||
You can use it to enable 64-bit sizes supporting
|
|
||||||
|
|
||||||
|
_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type.
|
||||||
|
|
||||||
|
|
||||||
C++ LZMA Encoder/Decoder
|
C++ LZMA Encoder/Decoder
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
C++ LZMA code use COM-like interfaces. So if you want to use it,
|
C++ LZMA code use COM-like interfaces. So if you want to use it,
|
||||||
you can study basics of COM/OLE.
|
you can study basics of COM/OLE.
|
||||||
|
C++ LZMA code is just wrapper over ANSI-C code.
|
||||||
|
|
||||||
By default, LZMA Encoder contains all Match Finders.
|
|
||||||
But for compressing it's enough to have just one of them.
|
|
||||||
So for reducing size of compressing code you can define:
|
|
||||||
#define COMPRESS_MF_BT
|
|
||||||
#define COMPRESS_MF_BT4
|
|
||||||
and it will use only bt4 match finder.
|
|
||||||
|
|
||||||
|
C++ Notes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling),
|
||||||
|
you must check that you correctly work with "new" operator.
|
||||||
|
7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator.
|
||||||
|
So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator:
|
||||||
|
operator new(size_t size)
|
||||||
|
{
|
||||||
|
void *p = ::malloc(size);
|
||||||
|
if (p == 0)
|
||||||
|
throw CNewException();
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
If you use MSCV that throws exception for "new" operator, you can compile without
|
||||||
|
"NewHandler.cpp". So standard exception will be used. Actually some code of
|
||||||
|
7-Zip catches any exception in internal code and converts it to HRESULT code.
|
||||||
|
So you don't need to catch CNewException, if you call COM interfaces of 7-Zip.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
http://www.7-zip.org
|
http://www.7-zip.org
|
||||||
|
http://www.7-zip.org/sdk.html
|
||||||
http://www.7-zip.org/support.html
|
http://www.7-zip.org/support.html
|
||||||
|
|
Loading…
Reference in a new issue