Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2175800/?format=api
{ "id": 2175800, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2175800/?format=api", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/1.0/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null }, "msgid": "<20251218232255.3934258-6-trini@konsulko.com>", "date": "2025-12-18T23:10:17", "name": "[RFC,5/9] lzma: Update 9.38 -> 18.06", "commit_ref": null, "pull_url": null, "state": "rfc", "archived": false, "hash": "75b65d8731c863649b6ba48031113fd0c1ceb457", "submitter": { "id": 65875, "url": "http://patchwork.ozlabs.org/api/1.0/people/65875/?format=api", "name": "Tom Rini", "email": "trini@konsulko.com" }, "delegate": { "id": 3651, "url": "http://patchwork.ozlabs.org/api/1.0/users/3651/?format=api", "username": "trini", "first_name": "Tom", "last_name": "Rini", "email": "trini@ti.com" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20251218232255.3934258-6-trini@konsulko.com/mbox/", "series": [ { "id": 485929, "url": "http://patchwork.ozlabs.org/api/1.0/series/485929/?format=api", "date": "2025-12-18T23:10:12", "name": "Update lzma to current version of LZMA SDK", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/485929/mbox/" } ], "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2175800/checks/", "tags": {}, "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=konsulko.com header.i=@konsulko.com header.a=rsa-sha256\n header.s=google header.b=ktdlr6Yn;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=konsulko.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de", "phobos.denx.de;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=konsulko.com header.i=@konsulko.com\n header.b=\"ktdlr6Yn\";\n\tdkim-atps=neutral", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=konsulko.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=trini@konsulko.com" ], "Received": [ "from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dXRYz2KcMz1xty\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 10:23:51 +1100 (AEDT)", "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 9E12C83106;\n\tFri, 19 Dec 2025 00:23:13 +0100 (CET)", "by phobos.denx.de (Postfix, from userid 109)\n id 964DE8392C; Fri, 19 Dec 2025 00:23:08 +0100 (CET)", "from mail-ot1-x32d.google.com (mail-ot1-x32d.google.com\n [IPv6:2607:f8b0:4864:20::32d])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 048CF836A3\n for <u-boot@lists.denx.de>; Fri, 19 Dec 2025 00:23:05 +0100 (CET)", "by mail-ot1-x32d.google.com with SMTP id\n 46e09a7af769-7c6ce4f65f7so1034907a34.0\n for <u-boot@lists.denx.de>; Thu, 18 Dec 2025 15:23:04 -0800 (PST)", "from bill-the-cat.. (fixed-189-203-103-235.totalplay.net.\n [189.203.103.235]) by smtp.gmail.com with ESMTPSA id\n 5614622812f47-457b3cc0928sm295333b6e.10.2025.12.18.15.23.02\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 18 Dec 2025 15:23:02 -0800 (PST)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS,T_FILL_THIS_FORM_SHORT autolearn=ham\n autolearn_force=no version=3.4.2", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=konsulko.com; s=google; t=1766100184; x=1766704984; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=+8li59yVfYwSBb25j49kCoJqxVHZdoLmZpYXhIdMLZE=;\n b=ktdlr6YnW3pUvXd0Akf/36+eEpFW1b4W+XJ0bVVd0koNkUzo8rbxiXYJh3RaZUgJhm\n pYYlgmohIHoHDi8J/9TApghMe5UXmPhaO/ypnyi6dhDVYP6bwZNFUzbRHFgoeXuzdr8W\n zQ7upakOlvO3xdLudgQc5qjUoQG2u2Ba/ntgA=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1766100184; x=1766704984;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=+8li59yVfYwSBb25j49kCoJqxVHZdoLmZpYXhIdMLZE=;\n b=lT1qvpeNbs5KmzOBfjHtv89g7BmvtZ+n68S4WVHzIg+8hEl63nB/pZhFMDENfPsYGw\n BuZ5lhJhLM0Q9ooGQjK43ajqPD9AdUnsaBrcLeqo6p6ISwH3O5pnf+7iqxfgqwGp5hCk\n 8tBLlnxU2vDw7YN1lFSUv3r8sy/yEZ7/DjkIZyY2chIsy0daaUqfz60BneuIGEhuKcLt\n 4hEyArzVkheyRdmNOV8zEPs4NHj6IMZI+VxfUnPsjJ2s80SID24GkMINOsMAMFrYhHJR\n +Gn5kVIFazO95krP0DkcQaPSp5CjzXBTLIQqmzkuC39CepFAV3XGwH0U5uuVjLW4PPPy\n 7bXA==", "X-Gm-Message-State": "AOJu0YzDI5/mwzZVHtodSbsEjQ3mQPxDqfTkrefiJTSCbvbubyUtzYRo\n WtAXGvoeoVUm2BkY8cmauUuMAjrG/WmHnkf18PoLUqBMTPfd+ZPaC3wULJBQG0jtNiPoHNVVpwN\n 7+oaUnkk=", "X-Gm-Gg": "AY/fxX7Zvfp+NKAhqzISevFnVKBC5TZdyoil2s7i7A8MTSgvOjB+Gac7i82kVoFipRZ\n a9AZiCqA5wTUoX4IQoUwaDMQFY/ByfryyqpVX1gL7DNOztPstyao3NTUCcyGRoKEXn3gDwnnqQ5\n eiqgp/bHMVNU+7dkX+6/MUmXbmEysMJ7kZzX7gopx4NFbkpPsU8+H6prb670qq/pUSwc1zf1zJ9\n qr9dQPNdZK8kjaJplwM3boUCqcmeNdRQQ3h6Mls0l4H+uGrl+ln/OgT3or7XzSc/UFEM8b8esZE\n a84jPeCXiR/DvgzPYqHIDG5dfKsDBStHGtYucMjEid0wKmTxfDv1VTh5lCcHzRPrdX9nIHA2Xj7\n xd9kDmGNtb5vXfyCm+yvqbWRlLIt4nJbEemL9jDyfkaWn6p7NpJpwCXd8mZlhZTPBgfiSVmXOL+\n STVHQbit7rcfpn96qe0ForOvOG1L5F0ZrdulSZThBMHUj7Ii4bnwC8", "X-Google-Smtp-Source": "\n AGHT+IHJaqoeomc19ChC8D7V4rMOak2IyOZ9SKc8QEu3SuVdBEiwtEY510pyChnDK+8jPpUBsayHxg==", "X-Received": "by 2002:a05:6808:1247:b0:450:c5b6:b7cd with SMTP id\n 5614622812f47-457b1ee8773mr662859b6e.27.1766100183275;\n Thu, 18 Dec 2025 15:23:03 -0800 (PST)", "From": "Tom Rini <trini@konsulko.com>", "To": "u-boot@lists.denx.de", "Cc": "Darek <x64x6a@gmail.com>", "Subject": "[RFC PATCH 5/9] lzma: Update 9.38 -> 18.06", "Date": "Thu, 18 Dec 2025 17:10:17 -0600", "Message-ID": "<20251218232255.3934258-6-trini@konsulko.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20251218232255.3934258-1-trini@konsulko.com>", "References": "<20251218232255.3934258-1-trini@konsulko.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.39", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>", "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de", "X-Virus-Status": "Clean" }, "content": "These are only upstream changes and nothing local.\n\nSigned-off-by: Tom Rini <trini@konsulko.com>\n---\n lib/lzma/7zTypes.h | 249 +++++++++++++++----\n lib/lzma/Compiler.h | 9 +-\n lib/lzma/LzmaDec.c | 571 +++++++++++++++++++++++++++----------------\n lib/lzma/LzmaDec.h | 57 +++--\n lib/lzma/LzmaTools.c | 4 +-\n 5 files changed, 605 insertions(+), 285 deletions(-)", "diff": "diff --git a/lib/lzma/7zTypes.h b/lib/lzma/7zTypes.h\nindex 953db1afc49e..65b3af63c751 100644\n--- a/lib/lzma/7zTypes.h\n+++ b/lib/lzma/7zTypes.h\n@@ -1,5 +1,5 @@\n /* 7zTypes.h -- Basic types\n-2013-11-12 : Igor Pavlov : Public domain */\n+2018-08-04 : Igor Pavlov : Public domain */\n \n #ifndef __7Z_TYPES_H\n #define __7Z_TYPES_H\n@@ -10,6 +10,18 @@\n \n #include <stddef.h>\n \n+#ifndef EXTERN_C_BEGIN\n+#ifdef __cplusplus\n+#define EXTERN_C_BEGIN extern \"C\" {\n+#define EXTERN_C_END }\n+#else\n+#define EXTERN_C_BEGIN\n+#define EXTERN_C_END\n+#endif\n+#endif\n+\n+EXTERN_C_BEGIN\n+\n #define SZ_OK 0\n \n #define SZ_ERROR_DATA 1\n@@ -30,13 +42,23 @@\n \n typedef int SRes;\n \n+\n #ifdef _WIN32\n+\n /* typedef DWORD WRes; */\n typedef unsigned WRes;\n+#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x)\n+\n #else\n+\n typedef int WRes;\n+#define MY__FACILITY_WIN32 7\n+#define MY__FACILITY__WRes MY__FACILITY_WIN32\n+#define MY_SRes_HRESULT_FROM_WRes(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (MY__FACILITY__WRes << 16) | 0x80000000)))\n+\n #endif\n \n+\n #ifndef RINOK\n #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }\n #endif\n@@ -81,10 +103,18 @@ typedef UInt32 SizeT;\n typedef size_t SizeT;\n #endif\n \n-typedef int Bool;\n+typedef int BoolInt;\n+/* typedef BoolInt Bool; */\n #define True 1\n #define False 0\n \n+\n+#ifdef _WIN32\n+#define MY_STD_CALL __stdcall\n+#else\n+#define MY_STD_CALL\n+#endif\n+\n #ifdef _MSC_VER\n \n #if _MSC_VER >= 1300\n@@ -93,47 +123,72 @@ typedef int Bool;\n #define MY_NO_INLINE\n #endif\n \n+#define MY_FORCE_INLINE __forceinline\n+\n #define MY_CDECL __cdecl\n #define MY_FAST_CALL __fastcall\n \n #else\n \n #define MY_NO_INLINE\n+#define MY_FORCE_INLINE\n #define MY_CDECL\n #define MY_FAST_CALL\n \n+/* inline keyword : for C++ / C99 */\n+\n+/* GCC, clang: */\n+/*\n+#if defined (__GNUC__) && (__GNUC__ >= 4)\n+#define MY_FORCE_INLINE __attribute__((always_inline))\n+#define MY_NO_INLINE __attribute__((noinline))\n+#endif\n+*/\n+\n #endif\n \n+\n /* The following interfaces use first parameter as pointer to structure */\n \n-typedef struct\n+typedef struct IByteIn IByteIn;\n+struct IByteIn\n {\n- Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */\n-} IByteIn;\n+ Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */\n+};\n+#define IByteIn_Read(p) (p)->Read(p)\n \n-typedef struct\n+\n+typedef struct IByteOut IByteOut;\n+struct IByteOut\n {\n- void (*Write)(void *p, Byte b);\n-} IByteOut;\n+ void (*Write)(const IByteOut *p, Byte b);\n+};\n+#define IByteOut_Write(p, b) (p)->Write(p, b)\n \n-typedef struct\n+\n+typedef struct ISeqInStream ISeqInStream;\n+struct ISeqInStream\n {\n- SRes (*Read)(void *p, void *buf, size_t *size);\n+ SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size);\n /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n (output(*size) < input(*size)) is allowed */\n-} ISeqInStream;\n+};\n+#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size)\n \n /* it can return SZ_ERROR_INPUT_EOF */\n-SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);\n-SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);\n-SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);\n+SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size);\n+SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType);\n+SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf);\n \n-typedef struct\n+\n+typedef struct ISeqOutStream ISeqOutStream;\n+struct ISeqOutStream\n {\n- size_t (*Write)(void *p, const void *buf, size_t size);\n+ size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size);\n /* Returns: result - the number of actually written bytes.\n (result < size) means error */\n-} ISeqOutStream;\n+};\n+#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size)\n \n typedef enum\n {\n@@ -142,78 +197,162 @@ typedef enum\n SZ_SEEK_END = 2\n } ESzSeek;\n \n-typedef struct\n+\n+typedef struct ISeekInStream ISeekInStream;\n+struct ISeekInStream\n {\n- SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */\n- SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n-} ISeekInStream;\n+ SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */\n+ SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin);\n+};\n+#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size)\n+#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)\n \n-typedef struct\n+\n+typedef struct ILookInStream ILookInStream;\n+struct ILookInStream\n {\n- SRes (*Look)(void *p, const void **buf, size_t *size);\n+ SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size);\n /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n (output(*size) > input(*size)) is not allowed\n (output(*size) < input(*size)) is allowed */\n- SRes (*Skip)(void *p, size_t offset);\n+ SRes (*Skip)(const ILookInStream *p, size_t offset);\n /* offset must be <= output(*size) of Look */\n \n- SRes (*Read)(void *p, void *buf, size_t *size);\n+ SRes (*Read)(const ILookInStream *p, void *buf, size_t *size);\n /* reads directly (without buffer). It's same as ISeqInStream::Read */\n- SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n-} ILookInStream;\n+ SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin);\n+};\n+\n+#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size)\n+#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset)\n+#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size)\n+#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)\n+\n \n-SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);\n-SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);\n+SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size);\n+SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset);\n \n /* reads via ILookInStream::Read */\n-SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);\n-SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);\n+SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType);\n+SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size);\n+\n \n-#define LookToRead_BUF_SIZE (1 << 14)\n \n typedef struct\n {\n- ILookInStream s;\n- ISeekInStream *realStream;\n+ ILookInStream vt;\n+ const ISeekInStream *realStream;\n+ \n size_t pos;\n- size_t size;\n- Byte buf[LookToRead_BUF_SIZE];\n-} CLookToRead;\n+ size_t size; /* it's data size */\n+ \n+ /* the following variables must be set outside */\n+ Byte *buf;\n+ size_t bufSize;\n+} CLookToRead2;\n+\n+void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead);\n+\n+#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; }\n \n-void LookToRead_CreateVTable(CLookToRead *p, int lookahead);\n-void LookToRead_Init(CLookToRead *p);\n \n typedef struct\n {\n- ISeqInStream s;\n- ILookInStream *realStream;\n+ ISeqInStream vt;\n+ const ILookInStream *realStream;\n } CSecToLook;\n \n void SecToLook_CreateVTable(CSecToLook *p);\n \n+\n+\n typedef struct\n {\n- ISeqInStream s;\n- ILookInStream *realStream;\n+ ISeqInStream vt;\n+ const ILookInStream *realStream;\n } CSecToRead;\n \n void SecToRead_CreateVTable(CSecToRead *p);\n \n-typedef struct\n+\n+typedef struct ICompressProgress ICompressProgress;\n+\n+struct ICompressProgress\n {\n- SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);\n+ SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize);\n /* Returns: result. (result != SZ_OK) means break.\n Value (UInt64)(Int64)-1 for size means unknown value. */\n-} ICompressProgress;\n+};\n+#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize)\n \n-typedef struct\n+\n+\n+typedef struct ISzAlloc ISzAlloc;\n+typedef const ISzAlloc * ISzAllocPtr;\n+\n+struct ISzAlloc\n {\n- void *(*Alloc)(void *p, size_t size);\n- void (*Free)(void *p, void *address); /* address can be 0 */\n-} ISzAlloc;\n+ void *(*Alloc)(ISzAllocPtr p, size_t size);\n+ void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */\n+};\n+\n+#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size)\n+#define ISzAlloc_Free(p, a) (p)->Free(p, a)\n+\n+/* deprecated */\n+#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size)\n+#define IAlloc_Free(p, a) ISzAlloc_Free(p, a)\n+\n+\n+\n+\n+\n+#ifndef MY_offsetof\n+ #ifdef offsetof\n+ #define MY_offsetof(type, m) offsetof(type, m)\n+ /*\n+ #define MY_offsetof(type, m) FIELD_OFFSET(type, m)\n+ */\n+ #else\n+ #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m))\n+ #endif\n+#endif\n+\n+\n+\n+#ifndef MY_container_of\n+\n+/*\n+#define MY_container_of(ptr, type, m) container_of(ptr, type, m)\n+#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m)\n+#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m)))\n+#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m))))\n+*/\n+\n+/*\n+ GCC shows warning: \"perhaps the 'offsetof' macro was used incorrectly\"\n+ GCC 3.4.4 : classes with constructor\n+ GCC 4.8.1 : classes with non-public variable members\"\n+*/\n+\n+#define MY_container_of(ptr, type, m) ((type *)((char *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m)))\n+\n+\n+#endif\n+\n+#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(ptr))\n+\n+/*\n+#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)\n+*/\n+#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m)\n+\n+#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)\n+/*\n+#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m)\n+*/\n+\n \n-#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)\n-#define IAlloc_Free(p, a) (p)->Free((p), a)\n \n #ifdef _WIN32\n \n@@ -225,10 +364,12 @@ typedef struct\n #else\n \n #define CHAR_PATH_SEPARATOR '/'\n-#define WCHAR_PATH_SEPARATOR u'/'\n+#define WCHAR_PATH_SEPARATOR L'/'\n #define STRING_PATH_SEPARATOR \"/\"\n-#define WSTRING_PATH_SEPARATOR u\"/\"\n+#define WSTRING_PATH_SEPARATOR L\"/\"\n \n #endif\n \n+EXTERN_C_END\n+\n #endif\ndiff --git a/lib/lzma/Compiler.h b/lib/lzma/Compiler.h\nindex 6e964897e1ee..0cc409d8a864 100644\n--- a/lib/lzma/Compiler.h\n+++ b/lib/lzma/Compiler.h\n@@ -1,5 +1,5 @@\n-/* Compiler.h -- Compiler ypes\n-2013-11-12 : Igor Pavlov : Public domain */\n+/* Compiler.h\n+2017-04-03 : Igor Pavlov : Public domain */\n \n #ifndef __7Z_COMPILER_H\n #define __7Z_COMPILER_H\n@@ -18,11 +18,16 @@\n #else\n #pragma warning(disable : 4511) // copy constructor could not be generated\n #pragma warning(disable : 4512) // assignment operator could not be generated\n+ #pragma warning(disable : 4514) // unreferenced inline function has been removed\n #pragma warning(disable : 4702) // unreachable code\n #pragma warning(disable : 4710) // not inlined\n+ #pragma warning(disable : 4714) // function marked as __forceinline not inlined\n #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information\n #endif\n \n #endif\n \n+#define UNUSED_VAR(x) (void)x;\n+/* #define UNUSED_VAR(x) x=x; */\n+\n #endif\ndiff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c\nindex 53196e37076b..3319c7cf4938 100644\n--- a/lib/lzma/LzmaDec.c\n+++ b/lib/lzma/LzmaDec.c\n@@ -1,13 +1,14 @@\n /* LzmaDec.c -- LZMA Decoder\n-2015-01-01 : Igor Pavlov : Public domain */\n+2018-07-04 : Igor Pavlov : Public domain */\n \n #include \"Precomp.h\"\n \n #include <config.h>\n #include <watchdog.h>\n-#include \"LzmaDec.h\"\n \n #include <linux/string.h>\n+/* #include \"CpuArch.h\" */\n+#include \"LzmaDec.h\"\n \n #define kNumTopBits 24\n #define kTopValue ((UInt32)1 << kNumTopBits)\n@@ -20,15 +21,22 @@\n \n #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }\n \n-#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)\n #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));\n #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));\n #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \\\n { UPDATE_0(p); i = (i + i); A0; } else \\\n { UPDATE_1(p); i = (i + i) + 1; A1; }\n-#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)\n \n-#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }\n+#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); }\n+\n+#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \\\n+ { UPDATE_0(p + i); A0; } else \\\n+ { UPDATE_1(p + i); A1; }\n+#define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; )\n+#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; )\n+#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; )\n+\n #define TREE_DECODE(probs, limit, i) \\\n { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }\n \n@@ -48,16 +56,19 @@\n i -= 0x40; }\n #endif\n \n-#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol)\n+#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol)\n #define MATCHED_LITER_DEC \\\n- matchByte <<= 1; \\\n- bit = (matchByte & offs); \\\n- probLit = prob + offs + bit + symbol; \\\n- GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)\n+ matchByte += matchByte; \\\n+ bit = offs; \\\n+ offs &= matchByte; \\\n+ probLit = prob + (offs + bit + symbol); \\\n+ GET_BIT2(probLit, symbol, offs ^= bit; , ;)\n+\n+\n \n #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }\n \n-#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)\n #define UPDATE_0_CHECK range = bound;\n #define UPDATE_1_CHECK range -= bound; code -= bound;\n #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \\\n@@ -67,24 +78,29 @@\n #define TREE_DECODE_CHECK(probs, limit, i) \\\n { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }\n \n+\n+#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \\\n+ { UPDATE_0_CHECK; i += m; m += m; } else \\\n+ { UPDATE_1_CHECK; m += m; i += m; }\n+\n+\n #define kNumPosBitsMax 4\n #define kNumPosStatesMax (1 << kNumPosBitsMax)\n \n #define kLenNumLowBits 3\n #define kLenNumLowSymbols (1 << kLenNumLowBits)\n-#define kLenNumMidBits 3\n-#define kLenNumMidSymbols (1 << kLenNumMidBits)\n #define kLenNumHighBits 8\n #define kLenNumHighSymbols (1 << kLenNumHighBits)\n \n-#define LenChoice 0\n-#define LenChoice2 (LenChoice + 1)\n-#define LenLow (LenChoice2 + 1)\n-#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))\n-#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))\n+#define LenLow 0\n+#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits))\n #define kNumLenProbs (LenHigh + kLenNumHighSymbols)\n \n+#define LenChoice LenLow\n+#define LenChoice2 (LenLow + (1 << kLenNumLowBits))\n+\n #define kNumStates 12\n+#define kNumStates2 16\n #define kNumLitStates 7\n \n #define kStartPosModelIndex 4\n@@ -98,54 +114,117 @@\n #define kAlignTableSize (1 << kNumAlignBits)\n \n #define kMatchMinLen 2\n-#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)\n+\n+/* External ASM code needs same CLzmaProb array layout. So don't change it. */\n \n-#define IsMatch 0\n-#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))\n+/* (probs_1664) is faster and better for code size at some platforms */\n+/*\n+#ifdef MY_CPU_X86_OR_AMD64\n+*/\n+#define kStartOffset 1664\n+#define GET_PROBS p->probs_1664\n+/*\n+#define GET_PROBS p->probs + kStartOffset\n+#else\n+#define kStartOffset 0\n+#define GET_PROBS p->probs\n+#endif\n+*/\n+\n+#define SpecPos (-kStartOffset)\n+#define IsRep0Long (SpecPos + kNumFullDistances)\n+#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax))\n+#define LenCoder (RepLenCoder + kNumLenProbs)\n+#define IsMatch (LenCoder + kNumLenProbs)\n+#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax))\n+#define IsRep (Align + kAlignTableSize)\n #define IsRepG0 (IsRep + kNumStates)\n #define IsRepG1 (IsRepG0 + kNumStates)\n #define IsRepG2 (IsRepG1 + kNumStates)\n-#define IsRep0Long (IsRepG2 + kNumStates)\n-#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))\n-#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))\n-#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)\n-#define LenCoder (Align + kAlignTableSize)\n-#define RepLenCoder (LenCoder + kNumLenProbs)\n-#define Literal (RepLenCoder + kNumLenProbs)\n+#define PosSlot (IsRepG2 + kNumStates)\n+#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))\n+#define NUM_BASE_PROBS (Literal + kStartOffset)\n \n-#define LZMA_BASE_SIZE 1846\n-#define LZMA_LIT_SIZE 768\n-\n-#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))\n+#if Align != 0 && kStartOffset != 0\n+ #error Stop_Compiling_Bad_LZMA_kAlign\n+#endif\n \n-#if Literal != LZMA_BASE_SIZE\n-StopCompilingDueBUG\n+#if NUM_BASE_PROBS != 1984\n+ #error Stop_Compiling_Bad_LZMA_PROBS\n #endif\n \n+\n+#define LZMA_LIT_SIZE 0x300\n+\n+#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))\n+\n+\n+#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4)\n+#define COMBINED_PS_STATE (posState + state)\n+#define GET_LEN_STATE (posState)\n+\n #define LZMA_DIC_MIN (1 << 12)\n \n-/* First LZMA-symbol is always decoded.\n-And it decodes new LZMA-symbols while (buf < bufLimit), but \"buf\" is without last normalization\n+/*\n+p->remainLen : shows status of LZMA decoder:\n+ < kMatchSpecLenStart : normal remain\n+ = kMatchSpecLenStart : finished\n+ = kMatchSpecLenStart + 1 : need init range coder\n+ = kMatchSpecLenStart + 2 : need init range coder and state\n+*/\n+\n+/* ---------- LZMA_DECODE_REAL ---------- */\n+/*\n+LzmaDec_DecodeReal_3() can be implemented in external ASM file.\n+3 - is the code compatibility version of that function for check at link time.\n+*/\n+\n+#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3\n+\n+/*\n+LZMA_DECODE_REAL()\n+In:\n+ RangeCoder is normalized\n+ if (p->dicPos == limit)\n+ {\n+ LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases.\n+ So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol\n+ is not END_OF_PAYALOAD_MARKER, then function returns error code.\n+ }\n+\n+Processing:\n+ first LZMA symbol will be decoded in any case\n+ All checks for limits are at the end of main loop,\n+ It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit),\n+ RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked.\n+\n Out:\n+ RangeCoder is normalized\n Result:\n SZ_OK - OK\n SZ_ERROR_DATA - Error\n p->remainLen:\n < kMatchSpecLenStart : normal remain\n = kMatchSpecLenStart : finished\n- = kMatchSpecLenStart + 1 : Flush marker\n- = kMatchSpecLenStart + 2 : State Init Marker\n */\n \n-static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n-{\n- CLzmaProb *probs = p->probs;\n \n- unsigned state = p->state;\n+#ifdef _LZMA_DEC_OPT\n+\n+int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit);\n+\n+#else\n+\n+static\n+int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n+{\n+ CLzmaProb *probs = GET_PROBS;\n+ unsigned state = (unsigned)p->state;\n UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];\n unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;\n- unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;\n unsigned lc = p->prop.lc;\n+ unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);\n \n Byte *dic = p->dic;\n SizeT dicBufSize = p->dicBufSize;\n@@ -165,20 +244,20 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n CLzmaProb *prob;\n UInt32 bound;\n unsigned ttt;\n- unsigned posState = processedPos & pbMask;\n+ unsigned posState = CALC_POS_STATE(processedPos, pbMask);\n \n if (!(loop++ & 1023))\n \t schedule();\n \n- prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n+ prob = probs + IsMatch + COMBINED_PS_STATE;\n IF_BIT_0(prob)\n {\n unsigned symbol;\n UPDATE_0(prob);\n prob = probs + Literal;\n- if (checkDicSize != 0 || processedPos != 0)\n- prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +\n- (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));\n+ if (processedPos != 0 || checkDicSize != 0)\n+ prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);\n+ processedPos++;\n \n if (state < kNumLitStates)\n {\n@@ -199,7 +278,7 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n }\n else\n {\n- unsigned matchByte = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n+ unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n unsigned offs = 0x100;\n state -= (state < 10) ? 3 : 6;\n symbol = 1;\n@@ -226,11 +305,11 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n }\n #endif\n }\n+\n dic[dicPos++] = (Byte)symbol;\n- processedPos++;\n continue;\n }\n- else\n+\n {\n UPDATE_1(prob);\n prob = probs + IsRep + state;\n@@ -243,17 +322,20 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n else\n {\n UPDATE_1(prob);\n+ /*\n+ // that case was checked before with kBadRepCode\n if (checkDicSize == 0 && processedPos == 0)\n return SZ_ERROR_DATA;\n+ */\n prob = probs + IsRepG0 + state;\n IF_BIT_0(prob)\n {\n UPDATE_0(prob);\n- prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n+ prob = probs + IsRep0Long + COMBINED_PS_STATE;\n IF_BIT_0(prob)\n {\n UPDATE_0(prob);\n- dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n+ dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n dicPos++;\n processedPos++;\n state = state < kNumLitStates ? 9 : 11;\n@@ -294,15 +376,17 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n state = state < kNumLitStates ? 8 : 11;\n prob = probs + RepLenCoder;\n }\n+\n+ #ifdef _LZMA_SIZE_OPT\n {\n- unsigned limit, offset;\n+ unsigned lim, offset;\n CLzmaProb *probLen = prob + LenChoice;\n IF_BIT_0(probLen)\n {\n UPDATE_0(probLen);\n- probLen = prob + LenLow + (posState << kLenNumLowBits);\n+ probLen = prob + LenLow + GET_LEN_STATE;\n offset = 0;\n- limit = (1 << kLenNumLowBits);\n+ lim = (1 << kLenNumLowBits);\n }\n else\n {\n@@ -311,21 +395,57 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n IF_BIT_0(probLen)\n {\n UPDATE_0(probLen);\n- probLen = prob + LenMid + (posState << kLenNumMidBits);\n+ probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);\n offset = kLenNumLowSymbols;\n- limit = (1 << kLenNumMidBits);\n+ lim = (1 << kLenNumLowBits);\n }\n else\n {\n UPDATE_1(probLen);\n probLen = prob + LenHigh;\n- offset = kLenNumLowSymbols + kLenNumMidSymbols;\n- limit = (1 << kLenNumHighBits);\n+ offset = kLenNumLowSymbols * 2;\n+ lim = (1 << kLenNumHighBits);\n }\n }\n- TREE_DECODE(probLen, limit, len);\n+ TREE_DECODE(probLen, lim, len);\n len += offset;\n }\n+ #else\n+ {\n+ CLzmaProb *probLen = prob + LenChoice;\n+ IF_BIT_0(probLen)\n+ {\n+ UPDATE_0(probLen);\n+ probLen = prob + LenLow + GET_LEN_STATE;\n+ len = 1;\n+ TREE_GET_BIT(probLen, len);\n+ TREE_GET_BIT(probLen, len);\n+ TREE_GET_BIT(probLen, len);\n+ len -= 8;\n+ }\n+ else\n+ {\n+ UPDATE_1(probLen);\n+ probLen = prob + LenChoice2;\n+ IF_BIT_0(probLen)\n+ {\n+ UPDATE_0(probLen);\n+ probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);\n+ len = 1;\n+ TREE_GET_BIT(probLen, len);\n+ TREE_GET_BIT(probLen, len);\n+ TREE_GET_BIT(probLen, len);\n+ }\n+ else\n+ {\n+ UPDATE_1(probLen);\n+ probLen = prob + LenHigh;\n+ TREE_DECODE(probLen, (1 << kLenNumHighBits), len);\n+ len += kLenNumLowSymbols * 2;\n+ }\n+ }\n+ }\n+ #endif\n \n if (state >= kNumStates)\n {\n@@ -336,28 +456,26 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n if (distance >= kStartPosModelIndex)\n {\n unsigned posSlot = (unsigned)distance;\n- int numDirectBits = (int)(((distance >> 1) - 1));\n+ unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));\n distance = (2 | (distance & 1));\n if (posSlot < kEndPosModelIndex)\n {\n distance <<= numDirectBits;\n- prob = probs + SpecPos + distance - posSlot - 1;\n+ prob = probs + SpecPos;\n {\n- UInt32 mask = 1;\n- unsigned i = 1;\n-\n+ UInt32 m = 1;\n+ distance++;\n do\n {\n- GET_BIT2(prob + i, i, ; , distance |= mask);\n- mask <<= 1;\n+ REV_BIT_VAR(prob, distance, m);\n }\n- while (--numDirectBits != 0);\n+ while (--numDirectBits);\n+ distance -= m;\n }\n }\n else\n {\n numDirectBits -= kNumAlignBits;\n-\n do\n {\n NORMALIZE\n@@ -379,64 +497,69 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n }\n */\n }\n- while (--numDirectBits != 0);\n+ while (--numDirectBits);\n prob = probs + Align;\n distance <<= kNumAlignBits;\n {\n unsigned i = 1;\n- GET_BIT2(prob + i, i, ; , distance |= 1);\n- GET_BIT2(prob + i, i, ; , distance |= 2);\n- GET_BIT2(prob + i, i, ; , distance |= 4);\n- GET_BIT2(prob + i, i, ; , distance |= 8);\n+ REV_BIT_CONST(prob, i, 1);\n+ REV_BIT_CONST(prob, i, 2);\n+ REV_BIT_CONST(prob, i, 4);\n+ REV_BIT_LAST (prob, i, 8);\n+ distance |= i;\n }\n if (distance == (UInt32)0xFFFFFFFF)\n {\n- len += kMatchSpecLenStart;\n+ len = kMatchSpecLenStart;\n state -= kNumStates;\n break;\n }\n }\n }\n+\n rep3 = rep2;\n rep2 = rep1;\n rep1 = rep0;\n rep0 = distance + 1;\n- if (checkDicSize == 0)\n+ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;\n+ if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize))\n {\n- if (distance >= processedPos)\n- return SZ_ERROR_DATA;\n- }\n- else if (distance >= checkDicSize)\n+ p->dicPos = dicPos;\n return SZ_ERROR_DATA;\n- state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;\n+ }\n }\n \n len += kMatchMinLen;\n \n- if (limit == dicPos)\n- return SZ_ERROR_DATA;\n {\n- SizeT rem = limit - dicPos;\n- unsigned curLen = ((rem < len) ? (unsigned)rem : len);\n- SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);\n+ SizeT rem;\n+ unsigned curLen;\n+ SizeT pos;\n+\n+ if ((rem = limit - dicPos) == 0)\n+ {\n+ p->dicPos = dicPos;\n+ return SZ_ERROR_DATA;\n+ }\n \n- processedPos += curLen;\n+ curLen = ((rem < len) ? (unsigned)rem : len);\n+ pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);\n+\n+ processedPos += (UInt32)curLen;\n \n len -= curLen;\n- if (pos + curLen <= dicBufSize)\n+ if (curLen <= dicBufSize - pos)\n {\n Byte *dest = dic + dicPos;\n ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;\n const Byte *lim = dest + curLen;\n- dicPos += curLen;\n-\n+ dicPos += (SizeT)curLen;\n do\n *(dest) = (Byte)*(dest + src);\n while (++dest != lim);\n }\n else\n {\n-\n do\n {\n dic[dicPos++] = dic[pos];\n@@ -453,20 +576,22 @@ static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte\n schedule();\n \n NORMALIZE;\n+\n p->buf = buf;\n p->range = range;\n p->code = code;\n- p->remainLen = len;\n+ p->remainLen = (UInt32)len;\n p->dicPos = dicPos;\n p->processedPos = processedPos;\n p->reps[0] = rep0;\n p->reps[1] = rep1;\n p->reps[2] = rep2;\n p->reps[3] = rep3;\n- p->state = state;\n+ p->state = (UInt32)state;\n \n return SZ_OK;\n }\n+#endif\n \n static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)\n {\n@@ -475,26 +600,35 @@ static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)\n Byte *dic = p->dic;\n SizeT dicPos = p->dicPos;\n SizeT dicBufSize = p->dicBufSize;\n- unsigned len = p->remainLen;\n- UInt32 rep0 = p->reps[0];\n- if (limit - dicPos < len)\n- len = (unsigned)(limit - dicPos);\n+ unsigned len = (unsigned)p->remainLen;\n+ SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */\n+ SizeT rem = limit - dicPos;\n+ if (rem < len)\n+ len = (unsigned)(rem);\n \n if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)\n p->checkDicSize = p->prop.dicSize;\n \n- p->processedPos += len;\n- p->remainLen -= len;\n+ p->processedPos += (UInt32)len;\n+ p->remainLen -= (UInt32)len;\n while (len != 0)\n {\n len--;\n- dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n+ dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];\n dicPos++;\n }\n p->dicPos = dicPos;\n }\n }\n \n+\n+#define kRange0 0xFFFFFFFF\n+#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))\n+#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)))\n+#if kBadRepCode != (0xC0000000 - 0x400)\n+ #error Stop_Compiling_Bad_LZMA_Check\n+#endif\n+\n static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n {\n do\n@@ -505,18 +639,21 @@ static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte\n UInt32 rem = p->prop.dicSize - p->processedPos;\n if (limit - p->dicPos > rem)\n limit2 = p->dicPos + rem;\n+\n+ if (p->processedPos == 0)\n+ if (p->code >= kBadRepCode)\n+ return SZ_ERROR_DATA;\n }\n- RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));\n- if (p->processedPos >= p->prop.dicSize)\n+\n+ RINOK(LZMA_DECODE_REAL(p, limit2, bufLimit));\n+\n+ if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize)\n p->checkDicSize = p->prop.dicSize;\n+\n LzmaDec_WriteRem(p, limit);\n }\n while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);\n \n- if (p->remainLen > kMatchSpecLenStart)\n- {\n- p->remainLen = kMatchSpecLenStart;\n- }\n return 0;\n }\n \n@@ -533,17 +670,17 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n UInt32 range = p->range;\n UInt32 code = p->code;\n const Byte *bufLimit = buf + inSize;\n- CLzmaProb *probs = p->probs;\n- unsigned state = p->state;\n+ const CLzmaProb *probs = GET_PROBS;\n+ unsigned state = (unsigned)p->state;\n ELzmaDummy res;\n \n {\n- CLzmaProb *prob;\n+ const CLzmaProb *prob;\n UInt32 bound;\n unsigned ttt;\n- unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);\n+ unsigned posState = CALC_POS_STATE(p->processedPos, (1 << p->prop.pb) - 1);\n \n- prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n+ prob = probs + IsMatch + COMBINED_PS_STATE;\n IF_BIT_0_CHECK(prob)\n {\n UPDATE_0_CHECK\n@@ -552,9 +689,9 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n \n prob = probs + Literal;\n if (p->checkDicSize != 0 || p->processedPos != 0)\n- prob += (LZMA_LIT_SIZE *\n- ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +\n- (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));\n+ prob += ((UInt32)LZMA_LIT_SIZE *\n+ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +\n+ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));\n \n if (state < kNumLitStates)\n {\n@@ -564,17 +701,18 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n else\n {\n unsigned matchByte = p->dic[p->dicPos - p->reps[0] +\n- ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];\n+ (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];\n unsigned offs = 0x100;\n unsigned symbol = 1;\n do\n {\n unsigned bit;\n- CLzmaProb *probLit;\n- matchByte <<= 1;\n- bit = (matchByte & offs);\n- probLit = prob + offs + bit + symbol;\n- GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)\n+ const CLzmaProb *probLit;\n+ matchByte += matchByte;\n+ bit = offs;\n+ offs &= matchByte;\n+ probLit = prob + (offs + bit + symbol);\n+ GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; )\n }\n while (symbol < 0x100);\n }\n@@ -601,7 +739,7 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n IF_BIT_0_CHECK(prob)\n {\n UPDATE_0_CHECK;\n- prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n+ prob = probs + IsRep0Long + COMBINED_PS_STATE;\n IF_BIT_0_CHECK(prob)\n {\n UPDATE_0_CHECK;\n@@ -640,11 +778,11 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n }\n {\n unsigned limit, offset;\n- CLzmaProb *probLen = prob + LenChoice;\n+ const CLzmaProb *probLen = prob + LenChoice;\n IF_BIT_0_CHECK(probLen)\n {\n UPDATE_0_CHECK;\n- probLen = prob + LenLow + (posState << kLenNumLowBits);\n+ probLen = prob + LenLow + GET_LEN_STATE;\n offset = 0;\n limit = 1 << kLenNumLowBits;\n }\n@@ -655,15 +793,15 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n IF_BIT_0_CHECK(probLen)\n {\n UPDATE_0_CHECK;\n- probLen = prob + LenMid + (posState << kLenNumMidBits);\n+ probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);\n offset = kLenNumLowSymbols;\n- limit = 1 << kLenNumMidBits;\n+ limit = 1 << kLenNumLowBits;\n }\n else\n {\n UPDATE_1_CHECK;\n probLen = prob + LenHigh;\n- offset = kLenNumLowSymbols + kLenNumMidSymbols;\n+ offset = kLenNumLowSymbols * 2;\n limit = 1 << kLenNumHighBits;\n }\n }\n@@ -675,18 +813,18 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n {\n unsigned posSlot;\n prob = probs + PosSlot +\n- ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<\n+ ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) <<\n kNumPosSlotBits);\n TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);\n if (posSlot >= kStartPosModelIndex)\n {\n- int numDirectBits = ((posSlot >> 1) - 1);\n+ unsigned numDirectBits = ((posSlot >> 1) - 1);\n \n /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */\n \n if (posSlot < kEndPosModelIndex)\n {\n- prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;\n+ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits);\n }\n else\n {\n@@ -698,17 +836,18 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n code -= range & (((code - range) >> 31) - 1);\n /* if (code >= range) code -= range; */\n }\n- while (--numDirectBits != 0);\n+ while (--numDirectBits);\n prob = probs + Align;\n numDirectBits = kNumAlignBits;\n }\n {\n unsigned i = 1;\n+ unsigned m = 1;\n do\n {\n- GET_BIT_CHECK(prob + i, i);\n+ REV_BIT_CHECK(prob, i, m);\n }\n- while (--numDirectBits != 0);\n+ while (--numDirectBits);\n }\n }\n }\n@@ -718,27 +857,20 @@ static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inS\n return res;\n }\n \n-static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)\n-{\n- p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);\n- p->range = 0xFFFFFFFF;\n- p->needFlush = 0;\n-}\n \n-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n+void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState)\n {\n- p->needFlush = 1;\n- p->remainLen = 0;\n+ p->remainLen = kMatchSpecLenStart + 1;\n p->tempBufSize = 0;\n \n if (initDic)\n {\n p->processedPos = 0;\n p->checkDicSize = 0;\n- p->needInitState = 1;\n+ p->remainLen = kMatchSpecLenStart + 2;\n }\n if (initState)\n- p->needInitState = 1;\n+ p->remainLen = kMatchSpecLenStart + 2;\n }\n \n void LzmaDec_Init(CLzmaDec *p)\n@@ -747,48 +879,54 @@ void LzmaDec_Init(CLzmaDec *p)\n LzmaDec_InitDicAndState(p, True, True);\n }\n \n-static void LzmaDec_InitStateReal(CLzmaDec *p)\n-{\n- UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));\n- UInt32 i;\n- CLzmaProb *probs = p->probs;\n- for (i = 0; i < numProbs; i++)\n- probs[i] = kBitModelTotal >> 1;\n- p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;\n- p->state = 0;\n- p->needInitState = 0;\n-}\n \n SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n ELzmaFinishMode finishMode, ELzmaStatus *status)\n {\n SizeT inSize = *srcLen;\n (*srcLen) = 0;\n- LzmaDec_WriteRem(p, dicLimit);\n \n *status = LZMA_STATUS_NOT_SPECIFIED;\n \n- while (p->remainLen != kMatchSpecLenStart)\n+ if (p->remainLen > kMatchSpecLenStart)\n {\n- int checkEndMarkNow;\n+ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)\n+ p->tempBuf[p->tempBufSize++] = *src++;\n+ if (p->tempBufSize != 0 && p->tempBuf[0] != 0)\n+ return SZ_ERROR_DATA;\n+ if (p->tempBufSize < RC_INIT_SIZE)\n+ {\n+ *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n+ return SZ_OK;\n+ }\n+ p->code =\n+ ((UInt32)p->tempBuf[1] << 24)\n+ | ((UInt32)p->tempBuf[2] << 16)\n+ | ((UInt32)p->tempBuf[3] << 8)\n+ | ((UInt32)p->tempBuf[4]);\n+ p->range = 0xFFFFFFFF;\n+ p->tempBufSize = 0;\n+\n+ if (p->remainLen > kMatchSpecLenStart + 1)\n+ {\n+ SizeT numProbs = LzmaProps_GetNumProbs(&p->prop);\n+ SizeT i;\n+ CLzmaProb *probs = p->probs;\n+ for (i = 0; i < numProbs; i++)\n+ probs[i] = kBitModelTotal >> 1;\n+ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;\n+ p->state = 0;\n+ }\n \n- if (p->needFlush != 0)\n- {\n- for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)\n- p->tempBuf[p->tempBufSize++] = *src++;\n- if (p->tempBufSize < RC_INIT_SIZE)\n- {\n- *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n- return SZ_OK;\n- }\n- if (p->tempBuf[0] != 0)\n- return SZ_ERROR_DATA;\n+ p->remainLen = 0;\n+ }\n \n- LzmaDec_InitRc(p, p->tempBuf);\n- p->tempBufSize = 0;\n- }\n+ LzmaDec_WriteRem(p, dicLimit);\n+\n+ while (p->remainLen != kMatchSpecLenStart)\n+ {\n+ int checkEndMarkNow = 0;\n \n- checkEndMarkNow = 0;\n if (p->dicPos >= dicLimit)\n {\n if (p->remainLen == 0 && p->code == 0)\n@@ -809,9 +947,6 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr\n checkEndMarkNow = 1;\n }\n \n- if (p->needInitState)\n- LzmaDec_InitStateReal(p);\n-\n if (p->tempBufSize == 0)\n {\n SizeT processed;\n@@ -852,10 +987,10 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr\n p->tempBufSize = rem;\n if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n {\n- int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);\n+ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, (SizeT)rem);\n if (dummyRes == DUMMY_ERROR)\n {\n- (*srcLen) += lookAhead;\n+ (*srcLen) += (SizeT)lookAhead;\n *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n return SZ_OK;\n }\n@@ -868,18 +1003,30 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr\n p->buf = p->tempBuf;\n if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)\n return SZ_ERROR_DATA;\n- lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));\n- (*srcLen) += lookAhead;\n+\n+ {\n+ unsigned kkk = (unsigned)(p->buf - p->tempBuf);\n+ if (rem < kkk)\n+ return SZ_ERROR_FAIL; /* some internal error */\n+ rem -= kkk;\n+ if (lookAhead < rem)\n+ return SZ_ERROR_FAIL; /* some internal error */\n+ lookAhead -= rem;\n+ }\n+ (*srcLen) += (SizeT)lookAhead;\n src += lookAhead;\n- inSize -= lookAhead;\n+ inSize -= (SizeT)lookAhead;\n p->tempBufSize = 0;\n }\n }\n- if (p->code == 0)\n- *status = LZMA_STATUS_FINISHED_WITH_MARK;\n- return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;\n+\n+ if (p->code != 0)\n+ return SZ_ERROR_DATA;\n+ *status = LZMA_STATUS_FINISHED_WITH_MARK;\n+ return SZ_OK;\n }\n \n+\n SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)\n {\n SizeT outSize = *destLen;\n@@ -920,19 +1067,19 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr\n }\n }\n \n-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc)\n {\n- alloc->Free(alloc, p->probs);\n- p->probs = 0;\n+ ISzAlloc_Free(alloc, p->probs);\n+ p->probs = NULL;\n }\n \n-static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)\n+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc)\n {\n- alloc->Free(alloc, p->dic);\n- p->dic = 0;\n+ ISzAlloc_Free(alloc, p->dic);\n+ p->dic = NULL;\n }\n \n-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)\n+void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc)\n {\n LzmaDec_FreeProbs(p, alloc);\n LzmaDec_FreeDict(p, alloc);\n@@ -956,29 +1103,30 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n if (d >= (9 * 5 * 5))\n return SZ_ERROR_UNSUPPORTED;\n \n- p->lc = d % 9;\n+ p->lc = (Byte)(d % 9);\n d /= 9;\n- p->pb = d / 5;\n- p->lp = d % 5;\n+ p->pb = (Byte)(d / 5);\n+ p->lp = (Byte)(d % 5);\n \n return SZ_OK;\n }\n \n-static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)\n+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc)\n {\n UInt32 numProbs = LzmaProps_GetNumProbs(propNew);\n- if (p->probs == 0 || numProbs != p->numProbs)\n+ if (!p->probs || numProbs != p->numProbs)\n {\n LzmaDec_FreeProbs(p, alloc);\n- p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));\n- p->numProbs = numProbs;\n- if (p->probs == 0)\n+ p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb));\n+ if (!p->probs)\n return SZ_ERROR_MEM;\n+ p->probs_1664 = p->probs + 1664;\n+ p->numProbs = numProbs;\n }\n return SZ_OK;\n }\n \n-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)\n {\n CLzmaProps propNew;\n RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n@@ -987,18 +1135,28 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, I\n return SZ_OK;\n }\n \n-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)\n {\n CLzmaProps propNew;\n SizeT dicBufSize;\n RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n- dicBufSize = propNew.dicSize;\n- if (p->dic == 0 || dicBufSize != p->dicBufSize)\n+\n+ {\n+ UInt32 dictSize = propNew.dicSize;\n+ SizeT mask = ((UInt32)1 << 12) - 1;\n+ if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1;\n+ else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;;\n+ dicBufSize = ((SizeT)dictSize + mask) & ~mask;\n+ if (dicBufSize < dictSize)\n+ dicBufSize = dictSize;\n+ }\n+\n+ if (!p->dic || dicBufSize != p->dicBufSize)\n {\n LzmaDec_FreeDict(p, alloc);\n- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);\n- if (p->dic == 0)\n+ p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize);\n+ if (!p->dic)\n {\n LzmaDec_FreeProbs(p, alloc);\n return SZ_ERROR_MEM;\n@@ -1011,7 +1169,7 @@ SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAll\n \n SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n- ELzmaStatus *status, ISzAlloc *alloc)\n+ ELzmaStatus *status, ISzAllocPtr alloc)\n {\n CLzmaDec p;\n SRes res;\n@@ -1028,7 +1186,6 @@ SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n *srcLen = inSize;\n res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);\n *destLen = p.dicPos;\n-\n if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)\n res = SZ_ERROR_INPUT_EOF;\n LzmaDec_FreeProbs(&p, alloc);\ndiff --git a/lib/lzma/LzmaDec.h b/lib/lzma/LzmaDec.h\nindex 1e266991fd08..f3702f5ce608 100644\n--- a/lib/lzma/LzmaDec.h\n+++ b/lib/lzma/LzmaDec.h\n@@ -1,20 +1,25 @@\n /* LzmaDec.h -- LZMA Decoder\n-2013-01-18 : Igor Pavlov : Public domain */\n+2018-04-21 : Igor Pavlov : Public domain */\n \n #ifndef __LZMA_DEC_H\n #define __LZMA_DEC_H\n \n #include \"7zTypes.h\"\n \n+EXTERN_C_BEGIN\n+\n /* #define _LZMA_PROB32 */\n /* _LZMA_PROB32 can increase the speed on some CPUs,\n but memory usage for CLzmaDec::probs will be doubled in that case */\n \n+typedef\n #ifdef _LZMA_PROB32\n-#define CLzmaProb UInt32\n+ UInt32\n #else\n-#define CLzmaProb UInt16\n+ UInt16\n #endif\n+ CLzmaProb;\n+\n \n /* ---------- LZMA Properties ---------- */\n \n@@ -22,7 +27,10 @@\n \n typedef struct _CLzmaProps\n {\n- unsigned lc, lp, pb;\n+ Byte lc;\n+ Byte lp;\n+ Byte pb;\n+ Byte _pad_;\n UInt32 dicSize;\n } CLzmaProps;\n \n@@ -34,6 +42,7 @@ Returns:\n \n SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n \n+\n /* ---------- LZMA Decoder state ---------- */\n \n /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.\n@@ -43,32 +52,34 @@ SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n \n typedef struct\n {\n+ /* Don't change this structure. ASM code can use it. */\n CLzmaProps prop;\n CLzmaProb *probs;\n+ CLzmaProb *probs_1664;\n Byte *dic;\n- const Byte *buf;\n- UInt32 range, code;\n- SizeT dicPos;\n SizeT dicBufSize;\n+ SizeT dicPos;\n+ const Byte *buf;\n+ UInt32 range;\n+ UInt32 code;\n UInt32 processedPos;\n UInt32 checkDicSize;\n- unsigned state;\n UInt32 reps[4];\n- unsigned remainLen;\n- int needFlush;\n- int needInitState;\n+ UInt32 state;\n+ UInt32 remainLen;\n+\n UInt32 numProbs;\n unsigned tempBufSize;\n Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];\n } CLzmaDec;\n \n-#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }\n+#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; }\n \n void LzmaDec_Init(CLzmaDec *p);\n \n /* There are two types of LZMA streams:\n- 0) Stream with end mark. That end mark adds about 6 bytes to compressed size.\n- 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n+ - Stream with end mark. That end mark adds about 6 bytes to compressed size.\n+ - Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n \n typedef enum\n {\n@@ -102,6 +113,7 @@ typedef enum\n \n /* ELzmaStatus is used only as output value for function call */\n \n+\n /* ---------- Interfaces ---------- */\n \n /* There are 3 levels of interfaces:\n@@ -111,6 +123,7 @@ typedef enum\n You can select any of these interfaces, but don't mix functions from different\n groups for same object. */\n \n+\n /* There are two variants to allocate state for Dictionary Interface:\n 1) LzmaDec_Allocate / LzmaDec_Free\n 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs\n@@ -123,11 +136,11 @@ LzmaDec_Allocate* can return:\n SZ_ERROR_UNSUPPORTED - Unsupported properties\n */\n \n-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);\n-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);\n+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);\n+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc);\n \n-SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);\n-void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);\n+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc);\n+void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc);\n \n /* ---------- Dictionary Interface ---------- */\n \n@@ -136,7 +149,7 @@ void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);\n You must work with CLzmaDec variables directly in this interface.\n \n STEPS:\n- LzmaDec_Constr()\n+ LzmaDec_Construct()\n LzmaDec_Allocate()\n for (each new stream)\n {\n@@ -173,6 +186,7 @@ Returns:\n SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,\n const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n \n+\n /* ---------- Buffer Interface ---------- */\n \n /* It's zlib-like interface.\n@@ -189,6 +203,7 @@ finishMode:\n SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,\n const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n \n+\n /* ---------- One Call Interface ---------- */\n \n /* LzmaDecode\n@@ -212,6 +227,8 @@ Returns:\n \n SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n- ELzmaStatus *status, ISzAlloc *alloc);\n+ ELzmaStatus *status, ISzAllocPtr alloc);\n+\n+EXTERN_C_END\n \n #endif\ndiff --git a/lib/lzma/LzmaTools.c b/lib/lzma/LzmaTools.c\nindex 400d606784ea..28c42d7293c8 100644\n--- a/lib/lzma/LzmaTools.c\n+++ b/lib/lzma/LzmaTools.c\n@@ -33,8 +33,8 @@\n #include <linux/string.h>\n #include <malloc.h>\n \n-static void *SzAlloc(void *p, size_t size) { return malloc(size); }\n-static void SzFree(void *p, void *address) { free(address); }\n+static void *SzAlloc(ISzAllocPtr p, size_t size) { return malloc(size); }\n+static void SzFree(ISzAllocPtr p, void *address) { free(address); }\n \n int lzmaBuffToBuffDecompress(unsigned char *outStream, SizeT *uncompressedSize,\n \t\t\t const unsigned char *inStream, SizeT length)\n", "prefixes": [ "RFC", "5/9" ] }