wok diff grub4dos/stuff/lzma.diff @ rev 16153

Up slitaz-dev-tools (2.1)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Mar 28 12:44:24 2014 +0000 (2014-03-28)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/grub4dos/stuff/lzma.diff	Fri Mar 28 12:44:24 2014 +0000
     1.3 @@ -0,0 +1,1761 @@
     1.4 +From http://code.google.com/p/grub4dos-chenall/issues/detail?id=6
     1.5 +
     1.6 +diff -Naur ../grub4dos-chenall-r63/stage2/common.c ./stage2/common.c
     1.7 +--- grub4dos-chenall-r63/stage2/common.c	2010-11-19 12:41:03.196955000 +0700
     1.8 ++++ grub4dos/stage2/common.c	2010-11-23 21:28:26.509102100 +0700
     1.9 +@@ -143,6 +143,7 @@
    1.10 +   [ERR_WRITE_GZIP_FILE] = "Attempt to write a gzip file",
    1.11 +   [ERR_FUNC_CALL] = "Invalid function call",
    1.12 + //  [ERR_WRITE_TO_NON_MEM_DRIVE] = "Only RAM drives can be written when running in a script",
    1.13 ++  [ERR_NOT_ENOUGH_MEMORY] = "Not enough memory",
    1.14 + 
    1.15 + };
    1.16 + 
    1.17 +diff -Naur ../grub4dos-chenall-r63/stage2/dec_lzma.c ./stage2/dec_lzma.c
    1.18 +--- grub4dos-chenall-r63/stage2/dec_lzma.c	1970-01-01 07:00:00.000000000 +0700
    1.19 ++++ grub4dos/stage2/dec_lzma.c	2010-11-28 22:12:06.452791800 +0700
    1.20 +@@ -0,0 +1,1384 @@
    1.21 ++/*
    1.22 ++ *  GRUB4DOS  --  GRand Unified Bootloader
    1.23 ++ *  Copyright (C) 1999  Free Software Foundation, Inc.
    1.24 ++ *
    1.25 ++ *  This program is free software; you can redistribute it and/or modify
    1.26 ++ *  it under the terms of the GNU General Public License as published by
    1.27 ++ *  the Free Software Foundation; either version 2 of the License, or
    1.28 ++ *  (at your option) any later version.
    1.29 ++ *
    1.30 ++ *  This program is distributed in the hope that it will be useful,
    1.31 ++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.32 ++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.33 ++ *  GNU General Public License for more details.
    1.34 ++ *
    1.35 ++ *  You should have received a copy of the GNU General Public License
    1.36 ++ *  along with this program; if not, write to the Free Software
    1.37 ++ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    1.38 ++ */
    1.39 ++
    1.40 ++/*
    1.41 ++ *  Most of this file is derives from LZMA SDK 9.12 beta 
    1.42 ++ *  files Types.h, LzmaDec.h, LzmaDec.c by Igor Pavlov
    1.43 ++ *  It has been modified for used in GRUB4DOS.
    1.44 ++ */
    1.45 ++
    1.46 ++#ifndef NO_DECOMPRESSION
    1.47 ++
    1.48 ++#include "shared.h"
    1.49 ++#include "decomp.h"
    1.50 ++
    1.51 ++/* Types.h -- Basic types
    1.52 ++2010-03-11 : Igor Pavlov : Public domain */
    1.53 ++
    1.54 ++#define SZ_OK 0
    1.55 ++
    1.56 ++#define SZ_ERROR_DATA 1
    1.57 ++#define SZ_ERROR_MEM 2
    1.58 ++#define SZ_ERROR_CRC 3
    1.59 ++#define SZ_ERROR_UNSUPPORTED 4
    1.60 ++#define SZ_ERROR_PARAM 5
    1.61 ++#define SZ_ERROR_INPUT_EOF 6
    1.62 ++#define SZ_ERROR_OUTPUT_EOF 7
    1.63 ++#define SZ_ERROR_READ 8
    1.64 ++#define SZ_ERROR_WRITE 9
    1.65 ++#define SZ_ERROR_PROGRESS 10
    1.66 ++#define SZ_ERROR_FAIL 11
    1.67 ++#define SZ_ERROR_THREAD 12
    1.68 ++
    1.69 ++#define SZ_ERROR_ARCHIVE 16
    1.70 ++#define SZ_ERROR_NO_ARCHIVE 17
    1.71 ++
    1.72 ++typedef int SRes;
    1.73 ++typedef int WRes;
    1.74 ++
    1.75 ++#ifndef RINOK
    1.76 ++#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
    1.77 ++#endif
    1.78 ++
    1.79 ++typedef unsigned char Byte;
    1.80 ++typedef short Int16;
    1.81 ++typedef unsigned short UInt16;
    1.82 ++
    1.83 ++typedef int Int32;
    1.84 ++typedef unsigned int UInt32;
    1.85 ++
    1.86 ++typedef long long int Int64;
    1.87 ++typedef unsigned long long int UInt64;
    1.88 ++
    1.89 ++typedef UInt32 SizeT;
    1.90 ++typedef int ptrdiff_t;
    1.91 ++
    1.92 ++typedef int Bool;
    1.93 ++#define True 1
    1.94 ++#define False 0
    1.95 ++
    1.96 ++#define MY_STD_CALL
    1.97 ++#define MY_CDECL
    1.98 ++#define MY_FAST_CALL
    1.99 ++
   1.100 ++typedef struct
   1.101 ++{
   1.102 ++  void *(*Alloc)(void *p, SizeT size);
   1.103 ++  void (*Free)(void *p, void *address); /* address can be 0 */
   1.104 ++} ISzAlloc;
   1.105 ++
   1.106 ++#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
   1.107 ++#define IAlloc_Free(p, a) (p)->Free((p), a)
   1.108 ++
   1.109 ++/* -------------------------------------------------------------------------- */
   1.110 ++
   1.111 ++/* LzmaDec.h -- LZMA Decoder
   1.112 ++2009-02-07 : Igor Pavlov : Public domain */
   1.113 ++
   1.114 ++/* #define _LZMA_PROB32 */
   1.115 ++/* _LZMA_PROB32 can increase the speed on some CPUs,
   1.116 ++   but memory usage for CLzmaDec::probs will be doubled in that case */
   1.117 ++
   1.118 ++#ifdef _LZMA_PROB32
   1.119 ++#define UIntLzmaProb UInt32
   1.120 ++#else
   1.121 ++#define UIntLzmaProb UInt16
   1.122 ++#endif
   1.123 ++
   1.124 ++
   1.125 ++/* ---------- LZMA Properties ---------- */
   1.126 ++
   1.127 ++#define LZMA_PROPS_SIZE 5
   1.128 ++
   1.129 ++typedef struct _CLzmaProps
   1.130 ++{
   1.131 ++  unsigned lc, lp, pb;
   1.132 ++  UInt32 dicSize;
   1.133 ++} CLzmaProps;
   1.134 ++
   1.135 ++/* LzmaProps_Decode - decodes properties
   1.136 ++Returns:
   1.137 ++  SZ_OK
   1.138 ++  SZ_ERROR_UNSUPPORTED - Unsupported properties
   1.139 ++*/
   1.140 ++
   1.141 ++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
   1.142 ++
   1.143 ++
   1.144 ++/* ---------- LZMA Decoder state ---------- */
   1.145 ++
   1.146 ++/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
   1.147 ++   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
   1.148 ++
   1.149 ++#define LZMA_REQUIRED_INPUT_MAX 20
   1.150 ++
   1.151 ++typedef struct
   1.152 ++{
   1.153 ++  CLzmaProps prop;
   1.154 ++  UIntLzmaProb *probs;
   1.155 ++  const Byte *buf;
   1.156 ++  UInt32 range, code;
   1.157 ++  Byte   *dic; 
   1.158 ++  UInt32 dicPos;
   1.159 ++  UInt32 dicBufSize;
   1.160 ++  Byte   *inp;
   1.161 ++  UInt32 inpPos, inpSize;
   1.162 ++  UInt32 inpBufSize;
   1.163 ++  UInt32 processedPos;
   1.164 ++  UInt32 checkDicSize;
   1.165 ++  unsigned state;
   1.166 ++  UInt32 reps[4];
   1.167 ++  unsigned remainLen;
   1.168 ++  int needFlush;
   1.169 ++  int needInitState;
   1.170 ++  UInt32 numProbs;
   1.171 ++  unsigned tempBufSize;
   1.172 ++  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
   1.173 ++  UInt64 inpFilePos;
   1.174 ++  UInt64 dicFilePos;
   1.175 ++  struct {
   1.176 ++      UInt64 fmax, fpos;
   1.177 ++  } filec, fileu;
   1.178 ++} CLzmaDec;
   1.179 ++
   1.180 ++#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
   1.181 ++
   1.182 ++void LzmaDec_Init(CLzmaDec *p);
   1.183 ++
   1.184 ++/* There are two types of LZMA streams:
   1.185 ++     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
   1.186 ++     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
   1.187 ++
   1.188 ++typedef enum
   1.189 ++{
   1.190 ++  LZMA_FINISH_ANY,   /* finish at any point */
   1.191 ++  LZMA_FINISH_END    /* block must be finished at the end */
   1.192 ++} ELzmaFinishMode;
   1.193 ++
   1.194 ++/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
   1.195 ++
   1.196 ++   You must use LZMA_FINISH_END, when you know that current output buffer
   1.197 ++   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
   1.198 ++
   1.199 ++   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
   1.200 ++   and output value of destLen will be less than output buffer size limit.
   1.201 ++   You can check status result also.
   1.202 ++
   1.203 ++   You can use multiple checks to test data integrity after full decompression:
   1.204 ++     1) Check Result and "status" variable.
   1.205 ++     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
   1.206 ++     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
   1.207 ++        You must use correct finish mode in that case. */
   1.208 ++
   1.209 ++typedef enum
   1.210 ++{
   1.211 ++  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
   1.212 ++  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
   1.213 ++  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
   1.214 ++  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
   1.215 ++  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
   1.216 ++} ELzmaStatus;
   1.217 ++
   1.218 ++/* ELzmaStatus is used only as output value for function call */
   1.219 ++
   1.220 ++
   1.221 ++/* ---------- Interfaces ---------- */
   1.222 ++
   1.223 ++/* There are 3 levels of interfaces:
   1.224 ++     1) Dictionary Interface
   1.225 ++     2) Buffer Interface
   1.226 ++     3) One Call Interface
   1.227 ++   You can select any of these interfaces, but don't mix functions from different
   1.228 ++   groups for same object. */
   1.229 ++
   1.230 ++
   1.231 ++/* There are two variants to allocate state for Dictionary Interface:
   1.232 ++     1) LzmaDec_Allocate / LzmaDec_Free
   1.233 ++     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
   1.234 ++   You can use variant 2, if you set dictionary buffer manually.
   1.235 ++   For Buffer Interface you must always use variant 1.
   1.236 ++
   1.237 ++LzmaDec_Allocate* can return:
   1.238 ++  SZ_OK
   1.239 ++  SZ_ERROR_MEM         - Memory allocation error
   1.240 ++  SZ_ERROR_UNSUPPORTED - Unsupported properties
   1.241 ++*/
   1.242 ++   
   1.243 ++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
   1.244 ++void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
   1.245 ++
   1.246 ++SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
   1.247 ++void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
   1.248 ++
   1.249 ++/* ---------- Dictionary Interface ---------- */
   1.250 ++
   1.251 ++/* You can use it, if you want to eliminate the overhead for data copying from
   1.252 ++   dictionary to some other external buffer.
   1.253 ++   You must work with CLzmaDec variables directly in this interface.
   1.254 ++
   1.255 ++   STEPS:
   1.256 ++     LzmaDec_Constr()
   1.257 ++     LzmaDec_Allocate()
   1.258 ++     for (each new stream)
   1.259 ++     {
   1.260 ++       LzmaDec_Init()
   1.261 ++       while (it needs more decompression)
   1.262 ++       {
   1.263 ++         LzmaDec_DecodeToDic()
   1.264 ++         use data from CLzmaDec::dic and update CLzmaDec::dicPos
   1.265 ++       }
   1.266 ++     }
   1.267 ++     LzmaDec_Free()
   1.268 ++*/
   1.269 ++
   1.270 ++/* LzmaDec_DecodeToDic
   1.271 ++   
   1.272 ++   The decoding to internal dictionary buffer (CLzmaDec::dic).
   1.273 ++   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
   1.274 ++
   1.275 ++finishMode:
   1.276 ++  It has meaning only if the decoding reaches output limit (dicLimit).
   1.277 ++  LZMA_FINISH_ANY - Decode just dicLimit bytes.
   1.278 ++  LZMA_FINISH_END - Stream must be finished after dicLimit.
   1.279 ++
   1.280 ++Returns:
   1.281 ++  SZ_OK
   1.282 ++    status:
   1.283 ++      LZMA_STATUS_FINISHED_WITH_MARK
   1.284 ++      LZMA_STATUS_NOT_FINISHED
   1.285 ++      LZMA_STATUS_NEEDS_MORE_INPUT
   1.286 ++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
   1.287 ++  SZ_ERROR_DATA - Data error
   1.288 ++*/
   1.289 ++
   1.290 ++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
   1.291 ++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
   1.292 ++
   1.293 ++
   1.294 ++/* ---------- Buffer Interface ---------- */
   1.295 ++
   1.296 ++/* It's zlib-like interface.
   1.297 ++   See LzmaDec_DecodeToDic description for information about STEPS and return results,
   1.298 ++   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
   1.299 ++   to work with CLzmaDec variables manually.
   1.300 ++
   1.301 ++finishMode:
   1.302 ++  It has meaning only if the decoding reaches output limit (*destLen).
   1.303 ++  LZMA_FINISH_ANY - Decode just destLen bytes.
   1.304 ++  LZMA_FINISH_END - Stream must be finished after (*destLen).
   1.305 ++*/
   1.306 ++
   1.307 ++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
   1.308 ++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
   1.309 ++
   1.310 ++
   1.311 ++/* ---------- One Call Interface ---------- */
   1.312 ++
   1.313 ++/* LzmaDecode
   1.314 ++
   1.315 ++finishMode:
   1.316 ++  It has meaning only if the decoding reaches output limit (*destLen).
   1.317 ++  LZMA_FINISH_ANY - Decode just destLen bytes.
   1.318 ++  LZMA_FINISH_END - Stream must be finished after (*destLen).
   1.319 ++
   1.320 ++Returns:
   1.321 ++  SZ_OK
   1.322 ++    status:
   1.323 ++      LZMA_STATUS_FINISHED_WITH_MARK
   1.324 ++      LZMA_STATUS_NOT_FINISHED
   1.325 ++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
   1.326 ++  SZ_ERROR_DATA - Data error
   1.327 ++  SZ_ERROR_MEM  - Memory allocation error
   1.328 ++  SZ_ERROR_UNSUPPORTED - Unsupported properties
   1.329 ++  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
   1.330 ++*/
   1.331 ++
   1.332 ++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
   1.333 ++    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
   1.334 ++    ELzmaStatus *status, ISzAlloc *alloc);
   1.335 ++
   1.336 ++/* -------------------------------------------------------------------------- */
   1.337 ++
   1.338 ++/* LzmaDec.c -- LZMA Decoder
   1.339 ++2009-09-20 : Igor Pavlov : Public domain */
   1.340 ++
   1.341 ++//#include "LzmaDec.h"
   1.342 ++
   1.343 ++//#include <string.h>
   1.344 ++
   1.345 ++#define kNumTopBits 24
   1.346 ++#define kTopValue ((UInt32)1 << kNumTopBits)
   1.347 ++
   1.348 ++#define kNumBitModelTotalBits 11
   1.349 ++#define kBitModelTotal (1 << kNumBitModelTotalBits)
   1.350 ++#define kNumMoveBits 5
   1.351 ++
   1.352 ++#define RC_INIT_SIZE 5
   1.353 ++
   1.354 ++#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
   1.355 ++
   1.356 ++#define TEST_BIT_0(p) ({ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; (code < bound);})
   1.357 ++#define UPDATE_0(p) range = bound; *(p) = (UIntLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
   1.358 ++#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (UIntLzmaProb)(ttt - (ttt >> kNumMoveBits));
   1.359 ++#define GET_BIT2(p, i, A0, A1) if(TEST_BIT_0(p)) \
   1.360 ++  { UPDATE_0(p); i = (i + i); A0; } else \
   1.361 ++  { UPDATE_1(p); i = (i + i) + 1; A1; }
   1.362 ++#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
   1.363 ++
   1.364 ++#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
   1.365 ++#define TREE_DECODE(probs, limit, i) \
   1.366 ++  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
   1.367 ++
   1.368 ++/* #define _LZMA_SIZE_OPT */
   1.369 ++
   1.370 ++#ifdef _LZMA_SIZE_OPT
   1.371 ++#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
   1.372 ++#else
   1.373 ++#define TREE_6_DECODE(probs, i) \
   1.374 ++  { i = 1; \
   1.375 ++  TREE_GET_BIT(probs, i); \
   1.376 ++  TREE_GET_BIT(probs, i); \
   1.377 ++  TREE_GET_BIT(probs, i); \
   1.378 ++  TREE_GET_BIT(probs, i); \
   1.379 ++  TREE_GET_BIT(probs, i); \
   1.380 ++  TREE_GET_BIT(probs, i); \
   1.381 ++  i -= 0x40; }
   1.382 ++#endif
   1.383 ++
   1.384 ++#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
   1.385 ++
   1.386 ++#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
   1.387 ++#define UPDATE_0_CHECK range = bound;
   1.388 ++#define UPDATE_1_CHECK range -= bound; code -= bound;
   1.389 ++#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
   1.390 ++  { UPDATE_0_CHECK; i = (i + i); A0; } else \
   1.391 ++  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
   1.392 ++#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
   1.393 ++#define TREE_DECODE_CHECK(probs, limit, i) \
   1.394 ++  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
   1.395 ++
   1.396 ++
   1.397 ++#define kNumPosBitsMax 4
   1.398 ++#define kNumPosStatesMax (1 << kNumPosBitsMax)
   1.399 ++
   1.400 ++#define kLenNumLowBits 3
   1.401 ++#define kLenNumLowSymbols (1 << kLenNumLowBits)
   1.402 ++#define kLenNumMidBits 3
   1.403 ++#define kLenNumMidSymbols (1 << kLenNumMidBits)
   1.404 ++#define kLenNumHighBits 8
   1.405 ++#define kLenNumHighSymbols (1 << kLenNumHighBits)
   1.406 ++
   1.407 ++#define LenChoice 0
   1.408 ++#define LenChoice2 (LenChoice + 1)
   1.409 ++#define LenLow (LenChoice2 + 1)
   1.410 ++#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
   1.411 ++#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
   1.412 ++#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
   1.413 ++
   1.414 ++
   1.415 ++#define kNumStates 12
   1.416 ++#define kNumLitStates 7
   1.417 ++
   1.418 ++#define kStartPosModelIndex 4
   1.419 ++#define kEndPosModelIndex 14
   1.420 ++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
   1.421 ++
   1.422 ++#define kNumPosSlotBits 6
   1.423 ++#define kNumLenToPosStates 4
   1.424 ++
   1.425 ++#define kNumAlignBits 4
   1.426 ++#define kAlignTableSize (1 << kNumAlignBits)
   1.427 ++
   1.428 ++#define kMatchMinLen 2
   1.429 ++#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
   1.430 ++
   1.431 ++#define IsMatch 0
   1.432 ++#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
   1.433 ++#define IsRepG0 (IsRep + kNumStates)
   1.434 ++#define IsRepG1 (IsRepG0 + kNumStates)
   1.435 ++#define IsRepG2 (IsRepG1 + kNumStates)
   1.436 ++#define IsRep0Long (IsRepG2 + kNumStates)
   1.437 ++#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
   1.438 ++#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
   1.439 ++#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
   1.440 ++#define LenCoder (Align + kAlignTableSize)
   1.441 ++#define RepLenCoder (LenCoder + kNumLenProbs)
   1.442 ++#define Literal (RepLenCoder + kNumLenProbs)
   1.443 ++
   1.444 ++#define LZMA_BASE_SIZE 1846
   1.445 ++#define LZMA_LIT_SIZE 768
   1.446 ++
   1.447 ++#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
   1.448 ++
   1.449 ++#if Literal != LZMA_BASE_SIZE
   1.450 ++StopCompilingDueBUG
   1.451 ++#endif
   1.452 ++
   1.453 ++#define LZMA_DIC_MIN (1 << 12)
   1.454 ++
   1.455 ++/* First LZMA-symbol is always decoded.
   1.456 ++And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
   1.457 ++Out:
   1.458 ++  Result:
   1.459 ++    SZ_OK - OK
   1.460 ++    SZ_ERROR_DATA - Error
   1.461 ++  p->remainLen:
   1.462 ++    < kMatchSpecLenStart : normal remain
   1.463 ++    = kMatchSpecLenStart : finished
   1.464 ++    = kMatchSpecLenStart + 1 : Flush marker
   1.465 ++    = kMatchSpecLenStart + 2 : State Init Marker
   1.466 ++*/
   1.467 ++
   1.468 ++static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
   1.469 ++{
   1.470 ++  UIntLzmaProb *probs = p->probs;
   1.471 ++
   1.472 ++  unsigned state = p->state;
   1.473 ++  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
   1.474 ++  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
   1.475 ++  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
   1.476 ++  unsigned lc = p->prop.lc;
   1.477 ++
   1.478 ++  Byte *dic = p->dic;
   1.479 ++  SizeT dicBufSize = p->dicBufSize;
   1.480 ++  SizeT dicPos = p->dicPos;
   1.481 ++  
   1.482 ++  UInt32 processedPos = p->processedPos;
   1.483 ++  UInt32 checkDicSize = p->checkDicSize;
   1.484 ++  unsigned len = 0;
   1.485 ++
   1.486 ++  const Byte *buf = p->buf;
   1.487 ++  UInt32 range = p->range;
   1.488 ++  UInt32 code = p->code;
   1.489 ++
   1.490 ++  do
   1.491 ++  {
   1.492 ++    UIntLzmaProb *prob;
   1.493 ++    UInt32 bound;
   1.494 ++    unsigned ttt;
   1.495 ++    unsigned posState = processedPos & pbMask;
   1.496 ++
   1.497 ++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
   1.498 ++    if(TEST_BIT_0(prob))
   1.499 ++    {
   1.500 ++      unsigned symbol;
   1.501 ++      UPDATE_0(prob);
   1.502 ++      prob = probs + Literal;
   1.503 ++      if (checkDicSize != 0 || processedPos != 0)
   1.504 ++        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
   1.505 ++        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
   1.506 ++
   1.507 ++      if (state < kNumLitStates)
   1.508 ++      {
   1.509 ++        state -= (state < 4) ? state : 3;
   1.510 ++        symbol = 1;
   1.511 ++        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
   1.512 ++      }
   1.513 ++      else
   1.514 ++      {
   1.515 ++        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
   1.516 ++        unsigned offs = 0x100;
   1.517 ++        state -= (state < 10) ? 3 : 6;
   1.518 ++        symbol = 1;
   1.519 ++        do
   1.520 ++        {
   1.521 ++          unsigned bit;
   1.522 ++          UIntLzmaProb *probLit;
   1.523 ++          matchByte <<= 1;
   1.524 ++          bit = (matchByte & offs);
   1.525 ++          probLit = prob + offs + bit + symbol;
   1.526 ++          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
   1.527 ++        }
   1.528 ++        while (symbol < 0x100);
   1.529 ++      }
   1.530 ++      dic[dicPos++] = (Byte)symbol;
   1.531 ++      processedPos++;
   1.532 ++      continue;
   1.533 ++    }
   1.534 ++    else
   1.535 ++    {
   1.536 ++      UPDATE_1(prob);
   1.537 ++      prob = probs + IsRep + state;
   1.538 ++      if(TEST_BIT_0(prob))
   1.539 ++      {
   1.540 ++        UPDATE_0(prob);
   1.541 ++        state += kNumStates;
   1.542 ++        prob = probs + LenCoder;
   1.543 ++      }
   1.544 ++      else
   1.545 ++      {
   1.546 ++        UPDATE_1(prob);
   1.547 ++        if (checkDicSize == 0 && processedPos == 0)
   1.548 ++          return SZ_ERROR_DATA;
   1.549 ++        prob = probs + IsRepG0 + state;
   1.550 ++        if(TEST_BIT_0(prob))
   1.551 ++        {
   1.552 ++          UPDATE_0(prob);
   1.553 ++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
   1.554 ++          if(TEST_BIT_0(prob))
   1.555 ++          {
   1.556 ++            UPDATE_0(prob);
   1.557 ++            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
   1.558 ++            dicPos++;
   1.559 ++            processedPos++;
   1.560 ++            state = state < kNumLitStates ? 9 : 11;
   1.561 ++            continue;
   1.562 ++          }
   1.563 ++          UPDATE_1(prob);
   1.564 ++        }
   1.565 ++        else
   1.566 ++        {
   1.567 ++          UInt32 distance;
   1.568 ++          UPDATE_1(prob);
   1.569 ++          prob = probs + IsRepG1 + state;
   1.570 ++          if(TEST_BIT_0(prob))
   1.571 ++          {
   1.572 ++            UPDATE_0(prob);
   1.573 ++            distance = rep1;
   1.574 ++          }
   1.575 ++          else
   1.576 ++          {
   1.577 ++            UPDATE_1(prob);
   1.578 ++            prob = probs + IsRepG2 + state;
   1.579 ++            if(TEST_BIT_0(prob))
   1.580 ++            {
   1.581 ++              UPDATE_0(prob);
   1.582 ++              distance = rep2;
   1.583 ++            }
   1.584 ++            else
   1.585 ++            {
   1.586 ++              UPDATE_1(prob);
   1.587 ++              distance = rep3;
   1.588 ++              rep3 = rep2;
   1.589 ++            }
   1.590 ++            rep2 = rep1;
   1.591 ++          }
   1.592 ++          rep1 = rep0;
   1.593 ++          rep0 = distance;
   1.594 ++        }
   1.595 ++        state = state < kNumLitStates ? 8 : 11;
   1.596 ++        prob = probs + RepLenCoder;
   1.597 ++      }
   1.598 ++      {
   1.599 ++        unsigned limit, offset;
   1.600 ++        UIntLzmaProb *probLen = prob + LenChoice;
   1.601 ++        if(TEST_BIT_0(probLen))
   1.602 ++        {
   1.603 ++          UPDATE_0(probLen);
   1.604 ++          probLen = prob + LenLow + (posState << kLenNumLowBits);
   1.605 ++          offset = 0;
   1.606 ++          limit = (1 << kLenNumLowBits);
   1.607 ++        }
   1.608 ++        else
   1.609 ++        {
   1.610 ++          UPDATE_1(probLen);
   1.611 ++          probLen = prob + LenChoice2;
   1.612 ++          if(TEST_BIT_0(probLen))
   1.613 ++          {
   1.614 ++            UPDATE_0(probLen);
   1.615 ++            probLen = prob + LenMid + (posState << kLenNumMidBits);
   1.616 ++            offset = kLenNumLowSymbols;
   1.617 ++            limit = (1 << kLenNumMidBits);
   1.618 ++          }
   1.619 ++          else
   1.620 ++          {
   1.621 ++            UPDATE_1(probLen);
   1.622 ++            probLen = prob + LenHigh;
   1.623 ++            offset = kLenNumLowSymbols + kLenNumMidSymbols;
   1.624 ++            limit = (1 << kLenNumHighBits);
   1.625 ++          }
   1.626 ++        }
   1.627 ++        TREE_DECODE(probLen, limit, len);
   1.628 ++        len += offset;
   1.629 ++      }
   1.630 ++
   1.631 ++      if (state >= kNumStates)
   1.632 ++      {
   1.633 ++        UInt32 distance;
   1.634 ++        prob = probs + PosSlot +
   1.635 ++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
   1.636 ++        TREE_6_DECODE(prob, distance);
   1.637 ++        if (distance >= kStartPosModelIndex)
   1.638 ++        {
   1.639 ++          unsigned posSlot = (unsigned)distance;
   1.640 ++          int numDirectBits = (int)(((distance >> 1) - 1));
   1.641 ++          distance = (2 | (distance & 1));
   1.642 ++          if (posSlot < kEndPosModelIndex)
   1.643 ++          {
   1.644 ++            distance <<= numDirectBits;
   1.645 ++            prob = probs + SpecPos + distance - posSlot - 1;
   1.646 ++            {
   1.647 ++              UInt32 mask = 1;
   1.648 ++              unsigned i = 1;
   1.649 ++              do
   1.650 ++              {
   1.651 ++                GET_BIT2(prob + i, i, ; , distance |= mask);
   1.652 ++                mask <<= 1;
   1.653 ++              }
   1.654 ++              while (--numDirectBits != 0);
   1.655 ++            }
   1.656 ++          }
   1.657 ++          else
   1.658 ++          {
   1.659 ++            numDirectBits -= kNumAlignBits;
   1.660 ++            do
   1.661 ++            {
   1.662 ++              NORMALIZE
   1.663 ++              range >>= 1;
   1.664 ++              
   1.665 ++              {
   1.666 ++                UInt32 t;
   1.667 ++                code -= range;
   1.668 ++                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
   1.669 ++                distance = (distance << 1) + (t + 1);
   1.670 ++                code += range & t;
   1.671 ++              }
   1.672 ++              /*
   1.673 ++              distance <<= 1;
   1.674 ++              if (code >= range)
   1.675 ++              {
   1.676 ++                code -= range;
   1.677 ++                distance |= 1;
   1.678 ++              }
   1.679 ++              */
   1.680 ++            }
   1.681 ++            while (--numDirectBits != 0);
   1.682 ++            prob = probs + Align;
   1.683 ++            distance <<= kNumAlignBits;
   1.684 ++            {
   1.685 ++              unsigned i = 1;
   1.686 ++              GET_BIT2(prob + i, i, ; , distance |= 1);
   1.687 ++              GET_BIT2(prob + i, i, ; , distance |= 2);
   1.688 ++              GET_BIT2(prob + i, i, ; , distance |= 4);
   1.689 ++              GET_BIT2(prob + i, i, ; , distance |= 8);
   1.690 ++            }
   1.691 ++            if (distance == (UInt32)0xFFFFFFFF)
   1.692 ++            {
   1.693 ++              len += kMatchSpecLenStart;
   1.694 ++              state -= kNumStates;
   1.695 ++              break;
   1.696 ++            }
   1.697 ++          }
   1.698 ++        }
   1.699 ++        rep3 = rep2;
   1.700 ++        rep2 = rep1;
   1.701 ++        rep1 = rep0;
   1.702 ++        rep0 = distance + 1;
   1.703 ++        if (checkDicSize == 0)
   1.704 ++        {
   1.705 ++          if (distance >= processedPos)
   1.706 ++            return SZ_ERROR_DATA;
   1.707 ++        }
   1.708 ++        else if (distance >= checkDicSize)
   1.709 ++          return SZ_ERROR_DATA;
   1.710 ++        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
   1.711 ++      }
   1.712 ++
   1.713 ++      len += kMatchMinLen;
   1.714 ++
   1.715 ++      if (limit == dicPos)
   1.716 ++        return SZ_ERROR_DATA;
   1.717 ++      {
   1.718 ++        SizeT rem = limit - dicPos;
   1.719 ++        unsigned curLen = ((rem < len) ? (unsigned)rem : len);
   1.720 ++        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
   1.721 ++
   1.722 ++        processedPos += curLen;
   1.723 ++
   1.724 ++        len -= curLen;
   1.725 ++        if (pos + curLen <= dicBufSize)
   1.726 ++        {
   1.727 ++          Byte *dest = dic + dicPos;
   1.728 ++          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
   1.729 ++          const Byte *lim = dest + curLen;
   1.730 ++          dicPos += curLen;
   1.731 ++          do
   1.732 ++            *(dest) = (Byte)(*(dest + src));
   1.733 ++          while (++dest != lim);
   1.734 ++        }
   1.735 ++        else
   1.736 ++        {
   1.737 ++          do
   1.738 ++          {
   1.739 ++            dic[dicPos++] = dic[pos];
   1.740 ++            if (++pos == dicBufSize)
   1.741 ++              pos = 0;
   1.742 ++          }
   1.743 ++          while (--curLen != 0);
   1.744 ++        }
   1.745 ++      }
   1.746 ++    }
   1.747 ++  }
   1.748 ++  while (dicPos < limit && buf < bufLimit);
   1.749 ++  NORMALIZE;
   1.750 ++  p->buf = buf;
   1.751 ++  p->range = range;
   1.752 ++  p->code = code;
   1.753 ++  p->remainLen = len;
   1.754 ++  p->dicPos = dicPos;
   1.755 ++  p->processedPos = processedPos;
   1.756 ++  p->reps[0] = rep0;
   1.757 ++  p->reps[1] = rep1;
   1.758 ++  p->reps[2] = rep2;
   1.759 ++  p->reps[3] = rep3;
   1.760 ++  p->state = state;
   1.761 ++
   1.762 ++  return SZ_OK;
   1.763 ++}
   1.764 ++
   1.765 ++static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
   1.766 ++{
   1.767 ++  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
   1.768 ++  {
   1.769 ++    Byte *dic = p->dic;
   1.770 ++    SizeT dicPos = p->dicPos;
   1.771 ++    SizeT dicBufSize = p->dicBufSize;
   1.772 ++    unsigned len = p->remainLen;
   1.773 ++    UInt32 rep0 = p->reps[0];
   1.774 ++    if (limit - dicPos < len)
   1.775 ++      len = (unsigned)(limit - dicPos);
   1.776 ++
   1.777 ++    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
   1.778 ++      p->checkDicSize = p->prop.dicSize;
   1.779 ++
   1.780 ++    p->processedPos += len;
   1.781 ++    p->remainLen -= len;
   1.782 ++    while (len-- != 0)
   1.783 ++    {
   1.784 ++      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
   1.785 ++      dicPos++;
   1.786 ++    }
   1.787 ++    p->dicPos = dicPos;
   1.788 ++  }
   1.789 ++}
   1.790 ++
   1.791 ++static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
   1.792 ++{
   1.793 ++  do
   1.794 ++  {
   1.795 ++    SizeT limit2 = limit;
   1.796 ++    if (p->checkDicSize == 0)
   1.797 ++    {
   1.798 ++      UInt32 rem = p->prop.dicSize - p->processedPos;
   1.799 ++      if (limit - p->dicPos > rem)
   1.800 ++        limit2 = p->dicPos + rem;
   1.801 ++    }
   1.802 ++    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
   1.803 ++    if (p->processedPos >= p->prop.dicSize)
   1.804 ++      p->checkDicSize = p->prop.dicSize;
   1.805 ++    LzmaDec_WriteRem(p, limit);
   1.806 ++  }
   1.807 ++  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
   1.808 ++
   1.809 ++  if (p->remainLen > kMatchSpecLenStart)
   1.810 ++  {
   1.811 ++    p->remainLen = kMatchSpecLenStart;
   1.812 ++  }
   1.813 ++  return 0;
   1.814 ++}
   1.815 ++
   1.816 ++typedef enum
   1.817 ++{
   1.818 ++  DUMMY_ERROR, /* unexpected end of input stream */
   1.819 ++  DUMMY_LIT,
   1.820 ++  DUMMY_MATCH,
   1.821 ++  DUMMY_REP
   1.822 ++} ELzmaDummy;
   1.823 ++
   1.824 ++static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
   1.825 ++{
   1.826 ++  UInt32 range = p->range;
   1.827 ++  UInt32 code = p->code;
   1.828 ++  const Byte *bufLimit = buf + inSize;
   1.829 ++  UIntLzmaProb *probs = p->probs;
   1.830 ++  unsigned state = p->state;
   1.831 ++  ELzmaDummy res;
   1.832 ++
   1.833 ++  {
   1.834 ++    UIntLzmaProb *prob;
   1.835 ++    UInt32 bound;
   1.836 ++    unsigned ttt;
   1.837 ++    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
   1.838 ++
   1.839 ++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
   1.840 ++    IF_BIT_0_CHECK(prob)
   1.841 ++    {
   1.842 ++      UPDATE_0_CHECK
   1.843 ++
   1.844 ++      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
   1.845 ++
   1.846 ++      prob = probs + Literal;
   1.847 ++      if (p->checkDicSize != 0 || p->processedPos != 0)
   1.848 ++        prob += (LZMA_LIT_SIZE *
   1.849 ++          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
   1.850 ++          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
   1.851 ++
   1.852 ++      if (state < kNumLitStates)
   1.853 ++      {
   1.854 ++        unsigned symbol = 1;
   1.855 ++        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
   1.856 ++      }
   1.857 ++      else
   1.858 ++      {
   1.859 ++        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
   1.860 ++            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
   1.861 ++        unsigned offs = 0x100;
   1.862 ++        unsigned symbol = 1;
   1.863 ++        do
   1.864 ++        {
   1.865 ++          unsigned bit;
   1.866 ++          UIntLzmaProb *probLit;
   1.867 ++          matchByte <<= 1;
   1.868 ++          bit = (matchByte & offs);
   1.869 ++          probLit = prob + offs + bit + symbol;
   1.870 ++          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
   1.871 ++        }
   1.872 ++        while (symbol < 0x100);
   1.873 ++      }
   1.874 ++      res = DUMMY_LIT;
   1.875 ++    }
   1.876 ++    else
   1.877 ++    {
   1.878 ++      unsigned len;
   1.879 ++      UPDATE_1_CHECK;
   1.880 ++
   1.881 ++      prob = probs + IsRep + state;
   1.882 ++      IF_BIT_0_CHECK(prob)
   1.883 ++      {
   1.884 ++        UPDATE_0_CHECK;
   1.885 ++        state = 0;
   1.886 ++        prob = probs + LenCoder;
   1.887 ++        res = DUMMY_MATCH;
   1.888 ++      }
   1.889 ++      else
   1.890 ++      {
   1.891 ++        UPDATE_1_CHECK;
   1.892 ++        res = DUMMY_REP;
   1.893 ++        prob = probs + IsRepG0 + state;
   1.894 ++        IF_BIT_0_CHECK(prob)
   1.895 ++        {
   1.896 ++          UPDATE_0_CHECK;
   1.897 ++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
   1.898 ++          IF_BIT_0_CHECK(prob)
   1.899 ++          {
   1.900 ++            UPDATE_0_CHECK;
   1.901 ++            NORMALIZE_CHECK;
   1.902 ++            return DUMMY_REP;
   1.903 ++          }
   1.904 ++          else
   1.905 ++          {
   1.906 ++            UPDATE_1_CHECK;
   1.907 ++          }
   1.908 ++        }
   1.909 ++        else
   1.910 ++        {
   1.911 ++          UPDATE_1_CHECK;
   1.912 ++          prob = probs + IsRepG1 + state;
   1.913 ++          IF_BIT_0_CHECK(prob)
   1.914 ++          {
   1.915 ++            UPDATE_0_CHECK;
   1.916 ++          }
   1.917 ++          else
   1.918 ++          {
   1.919 ++            UPDATE_1_CHECK;
   1.920 ++            prob = probs + IsRepG2 + state;
   1.921 ++            IF_BIT_0_CHECK(prob)
   1.922 ++            {
   1.923 ++              UPDATE_0_CHECK;
   1.924 ++            }
   1.925 ++            else
   1.926 ++            {
   1.927 ++              UPDATE_1_CHECK;
   1.928 ++            }
   1.929 ++          }
   1.930 ++        }
   1.931 ++        state = kNumStates;
   1.932 ++        prob = probs + RepLenCoder;
   1.933 ++      }
   1.934 ++      {
   1.935 ++        unsigned limit, offset;
   1.936 ++        UIntLzmaProb *probLen = prob + LenChoice;
   1.937 ++        IF_BIT_0_CHECK(probLen)
   1.938 ++        {
   1.939 ++          UPDATE_0_CHECK;
   1.940 ++          probLen = prob + LenLow + (posState << kLenNumLowBits);
   1.941 ++          offset = 0;
   1.942 ++          limit = 1 << kLenNumLowBits;
   1.943 ++        }
   1.944 ++        else
   1.945 ++        {
   1.946 ++          UPDATE_1_CHECK;
   1.947 ++          probLen = prob + LenChoice2;
   1.948 ++          IF_BIT_0_CHECK(probLen)
   1.949 ++          {
   1.950 ++            UPDATE_0_CHECK;
   1.951 ++            probLen = prob + LenMid + (posState << kLenNumMidBits);
   1.952 ++            offset = kLenNumLowSymbols;
   1.953 ++            limit = 1 << kLenNumMidBits;
   1.954 ++          }
   1.955 ++          else
   1.956 ++          {
   1.957 ++            UPDATE_1_CHECK;
   1.958 ++            probLen = prob + LenHigh;
   1.959 ++            offset = kLenNumLowSymbols + kLenNumMidSymbols;
   1.960 ++            limit = 1 << kLenNumHighBits;
   1.961 ++          }
   1.962 ++        }
   1.963 ++        TREE_DECODE_CHECK(probLen, limit, len);
   1.964 ++        len += offset;
   1.965 ++      }
   1.966 ++
   1.967 ++      if (state < 4)
   1.968 ++      {
   1.969 ++        unsigned posSlot;
   1.970 ++        prob = probs + PosSlot +
   1.971 ++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
   1.972 ++            kNumPosSlotBits);
   1.973 ++        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
   1.974 ++        if (posSlot >= kStartPosModelIndex)
   1.975 ++        {
   1.976 ++          int numDirectBits = ((posSlot >> 1) - 1);
   1.977 ++
   1.978 ++          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
   1.979 ++
   1.980 ++          if (posSlot < kEndPosModelIndex)
   1.981 ++          {
   1.982 ++            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
   1.983 ++          }
   1.984 ++          else
   1.985 ++          {
   1.986 ++            numDirectBits -= kNumAlignBits;
   1.987 ++            do
   1.988 ++            {
   1.989 ++              NORMALIZE_CHECK
   1.990 ++              range >>= 1;
   1.991 ++              code -= range & (((code - range) >> 31) - 1);
   1.992 ++              /* if (code >= range) code -= range; */
   1.993 ++            }
   1.994 ++            while (--numDirectBits != 0);
   1.995 ++            prob = probs + Align;
   1.996 ++            numDirectBits = kNumAlignBits;
   1.997 ++          }
   1.998 ++          {
   1.999 ++            unsigned i = 1;
  1.1000 ++            do
  1.1001 ++            {
  1.1002 ++              GET_BIT_CHECK(prob + i, i);
  1.1003 ++            }
  1.1004 ++            while (--numDirectBits != 0);
  1.1005 ++          }
  1.1006 ++        }
  1.1007 ++      }
  1.1008 ++    }
  1.1009 ++  }
  1.1010 ++  NORMALIZE_CHECK;
  1.1011 ++  return res;
  1.1012 ++}
  1.1013 ++
  1.1014 ++
  1.1015 ++static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
  1.1016 ++{
  1.1017 ++  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
  1.1018 ++  p->range = 0xFFFFFFFF;
  1.1019 ++  p->needFlush = 0;
  1.1020 ++}
  1.1021 ++
  1.1022 ++void LzmaDec_Init(CLzmaDec *p)
  1.1023 ++{
  1.1024 ++  p->dicFilePos = 0;
  1.1025 ++  p->dicPos = 0;
  1.1026 ++  p->needFlush = 1;
  1.1027 ++  p->remainLen = 0;
  1.1028 ++  p->tempBufSize = 0;
  1.1029 ++  p->processedPos = 0;
  1.1030 ++  p->checkDicSize = 0;
  1.1031 ++  p->needInitState = 1;
  1.1032 ++  p->needInitState = 1;
  1.1033 ++}
  1.1034 ++
  1.1035 ++static void LzmaDec_InitStateReal(CLzmaDec *p)
  1.1036 ++{
  1.1037 ++  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
  1.1038 ++  UInt32 i;
  1.1039 ++  UIntLzmaProb *probs = p->probs;
  1.1040 ++  for (i = 0; i < numProbs; i++)
  1.1041 ++    probs[i] = kBitModelTotal >> 1;
  1.1042 ++  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
  1.1043 ++  p->state = 0;
  1.1044 ++  p->needInitState = 0;
  1.1045 ++}
  1.1046 ++
  1.1047 ++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
  1.1048 ++    ELzmaFinishMode finishMode, ELzmaStatus *status)
  1.1049 ++{
  1.1050 ++  SizeT inSize = *srcLen;
  1.1051 ++  (*srcLen) = 0;
  1.1052 ++  LzmaDec_WriteRem(p, dicLimit);
  1.1053 ++  
  1.1054 ++  *status = LZMA_STATUS_NOT_SPECIFIED;
  1.1055 ++
  1.1056 ++  while (p->remainLen != kMatchSpecLenStart)
  1.1057 ++  {
  1.1058 ++      int checkEndMarkNow;
  1.1059 ++
  1.1060 ++      if (p->needFlush != 0)
  1.1061 ++      {
  1.1062 ++        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
  1.1063 ++          p->tempBuf[p->tempBufSize++] = *src++;
  1.1064 ++        if (p->tempBufSize < RC_INIT_SIZE)
  1.1065 ++        {
  1.1066 ++          *status = LZMA_STATUS_NEEDS_MORE_INPUT;
  1.1067 ++          return SZ_OK;
  1.1068 ++        }
  1.1069 ++        if (p->tempBuf[0] != 0)
  1.1070 ++          return SZ_ERROR_DATA;
  1.1071 ++
  1.1072 ++        LzmaDec_InitRc(p, p->tempBuf);
  1.1073 ++        p->tempBufSize = 0;
  1.1074 ++      }
  1.1075 ++
  1.1076 ++      checkEndMarkNow = 0;
  1.1077 ++      if (p->dicPos >= dicLimit)
  1.1078 ++      {
  1.1079 ++        if (p->remainLen == 0 && p->code == 0)
  1.1080 ++        {
  1.1081 ++          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
  1.1082 ++          return SZ_OK;
  1.1083 ++        }
  1.1084 ++        if (finishMode == LZMA_FINISH_ANY)
  1.1085 ++        {
  1.1086 ++          *status = LZMA_STATUS_NOT_FINISHED;
  1.1087 ++          return SZ_OK;
  1.1088 ++        }
  1.1089 ++        if (p->remainLen != 0)
  1.1090 ++        {
  1.1091 ++          *status = LZMA_STATUS_NOT_FINISHED;
  1.1092 ++          return SZ_ERROR_DATA;
  1.1093 ++        }
  1.1094 ++        checkEndMarkNow = 1;
  1.1095 ++      }
  1.1096 ++
  1.1097 ++      if (p->needInitState)
  1.1098 ++        LzmaDec_InitStateReal(p);
  1.1099 ++  
  1.1100 ++      if (p->tempBufSize == 0)
  1.1101 ++      {
  1.1102 ++        SizeT processed;
  1.1103 ++        const Byte *bufLimit;
  1.1104 ++        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
  1.1105 ++        {
  1.1106 ++          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
  1.1107 ++          if (dummyRes == DUMMY_ERROR)
  1.1108 ++          {
  1.1109 ++            memcpy(p->tempBuf, src, inSize);
  1.1110 ++            p->tempBufSize = (unsigned)inSize;
  1.1111 ++            (*srcLen) += inSize;
  1.1112 ++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
  1.1113 ++            return SZ_OK;
  1.1114 ++          }
  1.1115 ++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
  1.1116 ++          {
  1.1117 ++            *status = LZMA_STATUS_NOT_FINISHED;
  1.1118 ++            return SZ_ERROR_DATA;
  1.1119 ++          }
  1.1120 ++          bufLimit = src;
  1.1121 ++        }
  1.1122 ++        else
  1.1123 ++          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
  1.1124 ++        p->buf = src;
  1.1125 ++        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
  1.1126 ++          return SZ_ERROR_DATA;
  1.1127 ++        processed = (SizeT)(p->buf - src);
  1.1128 ++        (*srcLen) += processed;
  1.1129 ++        src += processed;
  1.1130 ++        inSize -= processed;
  1.1131 ++      }
  1.1132 ++      else
  1.1133 ++      {
  1.1134 ++        unsigned rem = p->tempBufSize, lookAhead = 0;
  1.1135 ++        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
  1.1136 ++          p->tempBuf[rem++] = src[lookAhead++];
  1.1137 ++        p->tempBufSize = rem;
  1.1138 ++        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
  1.1139 ++        {
  1.1140 ++          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
  1.1141 ++          if (dummyRes == DUMMY_ERROR)
  1.1142 ++          {
  1.1143 ++            (*srcLen) += lookAhead;
  1.1144 ++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
  1.1145 ++            return SZ_OK;
  1.1146 ++          }
  1.1147 ++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
  1.1148 ++          {
  1.1149 ++            *status = LZMA_STATUS_NOT_FINISHED;
  1.1150 ++            return SZ_ERROR_DATA;
  1.1151 ++          }
  1.1152 ++        }
  1.1153 ++        p->buf = p->tempBuf;
  1.1154 ++        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
  1.1155 ++          return SZ_ERROR_DATA;
  1.1156 ++        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
  1.1157 ++        (*srcLen) += lookAhead;
  1.1158 ++        src += lookAhead;
  1.1159 ++        inSize -= lookAhead;
  1.1160 ++        p->tempBufSize = 0;
  1.1161 ++      }
  1.1162 ++  }
  1.1163 ++  if (p->code == 0)
  1.1164 ++    *status = LZMA_STATUS_FINISHED_WITH_MARK;
  1.1165 ++  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
  1.1166 ++}
  1.1167 ++
  1.1168 ++/* -------------------------------------------------------------------------- */
  1.1169 ++
  1.1170 ++#define ReadUnalignedUInt32(p) ((UInt32)((Byte*)(p))[0] | ((UInt32)((Byte*)(p))[1]<<8) | ((UInt32)((Byte*)(p))[2]<<16) | ((UInt32)((Byte*)(p))[3]<<24))
  1.1171 ++#define ReadUnalignedUInt64(p) (ReadUnalignedUInt32(p) | ((UInt64)ReadUnalignedUInt32((Byte*)(p)+4)<<32))
  1.1172 ++
  1.1173 ++CLzmaDec lzmadec;
  1.1174 ++
  1.1175 ++static unsigned long malloc_top = 0;
  1.1176 ++static void *grub_malloc(unsigned long size)
  1.1177 ++{
  1.1178 ++       if (!malloc_top)
  1.1179 ++               malloc_top = RAW_ADDR ((saved_mem_upper << 10) + 0x100000);
  1.1180 ++       malloc_top = (malloc_top - size) & ~3;
  1.1181 ++       return (void *) malloc_top;
  1.1182 ++}
  1.1183 ++#define grub_free(x)
  1.1184 ++
  1.1185 ++int
  1.1186 ++dec_lzma_open (void)
  1.1187 ++// return 1=success or 0=failure
  1.1188 ++{
  1.1189 ++    unsigned char header[13];
  1.1190 ++    unsigned char d;
  1.1191 ++
  1.1192 ++    if (no_decompression) return 0;
  1.1193 ++
  1.1194 ++    // Now it does not support openning more than 1 file at a time. 
  1.1195 ++    // Make sure previously allocated memory blocks is freed. 
  1.1196 ++    // Don't need this line if grub_close is called for every openned file before grub_open is called for next file.
  1.1197 ++    dec_lzma_close();
  1.1198 ++
  1.1199 ++    filepos = 0;
  1.1200 ++    if (grub_read ((char *)header, 13, 0xedde0d90) == 13) 
  1.1201 ++    {
  1.1202 ++	// check header
  1.1203 ++	lzmadec.prop.dicSize = ReadUnalignedUInt32(header+1);
  1.1204 ++	if (lzmadec.prop.dicSize < LZMA_DIC_MIN)
  1.1205 ++	    lzmadec.prop.dicSize = LZMA_DIC_MIN;
  1.1206 ++	d = header[0];
  1.1207 ++	if (d < 9*5*5)
  1.1208 ++	{
  1.1209 ++	    // valid LZMA file
  1.1210 ++	    lzmadec.prop.lc = d % 9; d /= 9;
  1.1211 ++	    lzmadec.prop.lp = d % 5;
  1.1212 ++	    lzmadec.prop.pb = d / 5;
  1.1213 ++	    lzmadec.fileu.fmax = ReadUnalignedUInt64(header+5);
  1.1214 ++	    lzmadec.fileu.fpos = 0;
  1.1215 ++	    lzmadec.dicBufSize = lzmadec.prop.dicSize;
  1.1216 ++	    lzmadec.dic = (Byte*) grub_malloc(lzmadec.dicBufSize);
  1.1217 ++	    //grub_printf("LZMA allocate memory\n");
  1.1218 ++	    if (lzmadec.dic)
  1.1219 ++	    {
  1.1220 ++		lzmadec.numProbs = LzmaProps_GetNumProbs(&lzmadec.prop);
  1.1221 ++		lzmadec.probs = (UIntLzmaProb *) grub_malloc(lzmadec.numProbs * sizeof(UIntLzmaProb));
  1.1222 ++		if (lzmadec.probs)
  1.1223 ++		{
  1.1224 ++		    lzmadec.inpBufSize = 0x8000;
  1.1225 ++		    lzmadec.inp = (Byte*) grub_malloc(lzmadec.inpBufSize);
  1.1226 ++		    if (lzmadec.inp)
  1.1227 ++		    {
  1.1228 ++			lzmadec.inpFilePos = 0;
  1.1229 ++			lzmadec.inpPos = 0;
  1.1230 ++			lzmadec.inpSize = 0;
  1.1231 ++			LzmaDec_Init(&lzmadec);
  1.1232 ++			decomp_type = 1;
  1.1233 ++			compressed_file = 1;
  1.1234 ++			lzmadec.filec.fmax = filemax; filemax = lzmadec.fileu.fmax;
  1.1235 ++			lzmadec.filec.fpos = filepos; filepos = lzmadec.fileu.fpos;
  1.1236 ++			// success
  1.1237 ++			//grub_printf("LZMA open success\n");
  1.1238 ++			errnum = 0;
  1.1239 ++			return 1;
  1.1240 ++		    }
  1.1241 ++		    else
  1.1242 ++		    {
  1.1243 ++			errnum = ERR_NOT_ENOUGH_MEMORY;
  1.1244 ++		    }
  1.1245 ++		    grub_free(lzmadec.probs); lzmadec.probs = 0;
  1.1246 ++		}
  1.1247 ++		else
  1.1248 ++		{
  1.1249 ++		    errnum = ERR_NOT_ENOUGH_MEMORY;
  1.1250 ++		}
  1.1251 ++		grub_free(lzmadec.dic); lzmadec.dic = 0;
  1.1252 ++	    }
  1.1253 ++	    else
  1.1254 ++	    {
  1.1255 ++		errnum = ERR_NOT_ENOUGH_MEMORY;
  1.1256 ++	    }
  1.1257 ++	}
  1.1258 ++	else
  1.1259 ++	{
  1.1260 ++	    //grub_printf("LZMA allocate memory\n");
  1.1261 ++	    errnum = ERR_BAD_GZIP_HEADER;
  1.1262 ++	}
  1.1263 ++    }
  1.1264 ++    else
  1.1265 ++    {
  1.1266 ++	//grub_printf("LZMA error reading header\n");
  1.1267 ++	errnum = ERR_BAD_GZIP_HEADER;
  1.1268 ++    }
  1.1269 ++    //grub_printf("LZMA open fail\n");
  1.1270 ++    filepos = 0;
  1.1271 ++    return 0;
  1.1272 ++}
  1.1273 ++
  1.1274 ++void
  1.1275 ++dec_lzma_close (void)
  1.1276 ++{
  1.1277 ++    if (lzmadec.inp  ) { grub_free(lzmadec.inp  ); lzmadec.inp   = 0; }
  1.1278 ++    if (lzmadec.dic  ) { grub_free(lzmadec.dic  ); lzmadec.dic   = 0; }
  1.1279 ++    if (lzmadec.probs) { grub_free(lzmadec.probs); lzmadec.probs = 0; }
  1.1280 ++}
  1.1281 ++
  1.1282 ++unsigned long
  1.1283 ++dec_lzma_read (char *buf, unsigned long len, unsigned long write)
  1.1284 ++{
  1.1285 ++    UInt64 outTx, outSkip;
  1.1286 ++    //grub_printf("LZMA read buf=%ld len=%ld dic=%d inp=%d\n",buf,len,lzmadec.dic,lzmadec.inp);
  1.1287 ++
  1.1288 ++    compressed_file = 0;
  1.1289 ++    lzmadec.fileu.fmax = filemax; filemax = lzmadec.filec.fmax;
  1.1290 ++    lzmadec.fileu.fpos = filepos; filepos = lzmadec.filec.fpos;
  1.1291 ++    /* Now filepos, filemax is of compressed file 
  1.1292 ++     * fileu.fpos, fileu.fmax is of uncompressed data
  1.1293 ++     * filec is not used
  1.1294 ++     */
  1.1295 ++
  1.1296 ++    /*
  1.1297 ++     * When dicPos>0,
  1.1298 ++     *   dic[0 ... dicPos-1] contains 
  1.1299 ++     *   uncompressed_data [dicFilePos ... dicFilePos+dicPos-1].
  1.1300 ++     * When dicFilePos>0,
  1.1301 ++     *   dic[dicPos ... dicBufSize-1] contains 
  1.1302 ++     *   uncompressed_data [dicFilePos-dicBufSize+dicFilePos ... dicFilePos-1]
  1.1303 ++     */
  1.1304 ++    /* do we reset decompression to the beginning of the file? */
  1.1305 ++    if (lzmadec.dicFilePos && (lzmadec.fileu.fpos < lzmadec.dicFilePos-lzmadec.dicBufSize+lzmadec.dicFilePos))
  1.1306 ++    {
  1.1307 ++	LzmaDec_Init(&lzmadec);
  1.1308 ++	filepos = 13;
  1.1309 ++	lzmadec.inpPos = lzmadec.inpSize = 0;
  1.1310 ++    }
  1.1311 ++
  1.1312 ++    outTx = 0;
  1.1313 ++    outSkip = lzmadec.fileu.fpos - lzmadec.dicFilePos;
  1.1314 ++    //grub_printf("fileu.fpos=%ld dicFilePos=%ld\n",lzmadec.fileu.fpos,lzmadec.dicFilePos);
  1.1315 ++
  1.1316 ++    /* Copy uncompressed data from upper part of dic. dic[dicPos]...dic[dicBufSize-1] */
  1.1317 ++    if (lzmadec.dicFilePos > lzmadec.fileu.fpos)
  1.1318 ++    {
  1.1319 ++	UInt32 outTxCur = lzmadec.dicFilePos - lzmadec.fileu.fpos;
  1.1320 ++	if (outTxCur > len) outTxCur = len;
  1.1321 ++	if (buf)
  1.1322 ++	{
  1.1323 ++	    grub_memmove(buf, lzmadec.dic+outSkip+lzmadec.dicBufSize, outTxCur); 
  1.1324 ++	    buf += outTxCur; 
  1.1325 ++	}
  1.1326 ++	outSkip = 0;
  1.1327 ++	outTx += outTxCur; 
  1.1328 ++	lzmadec.fileu.fpos += outTxCur; 
  1.1329 ++	len -= outTxCur; 
  1.1330 ++    }
  1.1331 ++
  1.1332 ++    while (len!=0)
  1.1333 ++    {
  1.1334 ++	SizeT inSizeCur, dicLimit;
  1.1335 ++	UInt32 dicPos;
  1.1336 ++	ELzmaStatus status;
  1.1337 ++	SRes res;
  1.1338 ++
  1.1339 ++	/* Copy uncompressed data from lower part of dic. dic[0]...dic[dicPos-1] */
  1.1340 ++	//grub_printf("Loop len=%ld outSkip=%ld dicPos=%d\n",len,outSkip,lzmadec.dicPos);
  1.1341 ++	if (outSkip < lzmadec.dicPos)
  1.1342 ++	{
  1.1343 ++	    UInt32 outTxCur = lzmadec.dicPos - outSkip; 
  1.1344 ++	    //grub_printf("Copy %d byte ",outTxCur);
  1.1345 ++	    if (buf)
  1.1346 ++	    {
  1.1347 ++		grub_memmove(buf, lzmadec.dic+outSkip, outTxCur); 
  1.1348 ++		buf += outTxCur; 
  1.1349 ++	    }
  1.1350 ++	    outSkip = lzmadec.dicPos;
  1.1351 ++	    outTx += outTxCur; 
  1.1352 ++	    lzmadec.fileu.fpos += outTxCur; 
  1.1353 ++	    len -= outTxCur; 
  1.1354 ++	    //grub_printf(" remaining len=%ld\n",len);
  1.1355 ++	    if (len==0) break;
  1.1356 ++	}
  1.1357 ++	/* All existing wanted data from dic have been copied. We will add more data to dic. */
  1.1358 ++	/* Read more input if there is no unprocessed input left. */
  1.1359 ++	if (lzmadec.inpPos == lzmadec.inpSize)
  1.1360 ++	{
  1.1361 ++	    UInt32 inTxCur = (filemax-filepos<lzmadec.inpBufSize)?filemax-filepos:lzmadec.inpBufSize;
  1.1362 ++	    lzmadec.inpFilePos = filepos;
  1.1363 ++	    lzmadec.inpPos = 0;
  1.1364 ++	    //grub_printf("read inp %d ",inTxCur);
  1.1365 ++	    lzmadec.inpSize = grub_read(lzmadec.inp, inTxCur, 0xedde0d90);
  1.1366 ++	    //grub_printf("->%d\n",lzmadec.inpSize);
  1.1367 ++	}
  1.1368 ++	inSizeCur = lzmadec.inpSize - lzmadec.inpPos;
  1.1369 ++
  1.1370 ++	/* Prepare output dicPos, dicLimit. */
  1.1371 ++	if (lzmadec.dicPos == lzmadec.dicBufSize)
  1.1372 ++	{
  1.1373 ++	    lzmadec.dicPos = 0;
  1.1374 ++	    outSkip -= lzmadec.dicBufSize;
  1.1375 ++	}
  1.1376 ++	dicPos = lzmadec.dicPos;
  1.1377 ++	dicLimit = (lzmadec.dicBufSize-dicPos < len)? lzmadec.dicBufSize: dicPos+len;
  1.1378 ++
  1.1379 ++	/* Do decompression. */
  1.1380 ++	//grub_printf("DecodeToDic dicPos=%d limit=%d inPos=%d inSize=%d ",dicPos,dicLimit,lzmadec.inpPos,inSizeCur);
  1.1381 ++	status = LZMA_STATUS_NOT_SPECIFIED;
  1.1382 ++	res = LzmaDec_DecodeToDic(&lzmadec, dicLimit, lzmadec.inp+lzmadec.inpPos, &inSizeCur, LZMA_FINISH_ANY, &status);
  1.1383 ++	//grub_printf("->%d\n",inSizeCur);
  1.1384 ++	lzmadec.inpPos += inSizeCur;
  1.1385 ++	if (inSizeCur==0 && lzmadec.dicPos==dicPos)
  1.1386 ++	{
  1.1387 ++	    /* Error */
  1.1388 ++	    //grub_printf("No more input and output\n");
  1.1389 ++	    break;
  1.1390 ++	}
  1.1391 ++    }
  1.1392 ++    compressed_file = 1;
  1.1393 ++    lzmadec.filec.fmax = filemax; filemax = lzmadec.fileu.fmax;
  1.1394 ++    lzmadec.filec.fpos = filepos; filepos = lzmadec.fileu.fpos;
  1.1395 ++    /* Now filepos, file max is of uncompressed data
  1.1396 ++     * filec.fpos, filwc.fmax is of compressed file
  1.1397 ++     * fileu is not used
  1.1398 ++     */
  1.1399 ++
  1.1400 ++    //grub_printf("LZMA read end %ld\n",outTx);
  1.1401 ++    return outTx;
  1.1402 ++}
  1.1403 ++
  1.1404 ++#endif /* ! NO_DECOMPRESSION */
  1.1405 +diff -Naur ../grub4dos-chenall-r63/stage2/decomp.h ./stage2/decomp.h
  1.1406 +--- grub4dos-chenall-r63/stage2/decomp.h	1970-01-01 07:00:00.000000000 +0700
  1.1407 ++++ grub4dos/stage2/decomp.h	2010-11-28 13:51:54.687217000 +0700
  1.1408 +@@ -0,0 +1,36 @@
  1.1409 ++/* decomp.h - abstract decompression interface */
  1.1410 ++/*
  1.1411 ++ *  GRUB  --  GRand Unified Bootloader
  1.1412 ++ *  Copyright (C) 1999,2000,2001,2004  Free Software Foundation, Inc.
  1.1413 ++ *
  1.1414 ++ *  This program is free software; you can redistribute it and/or modify
  1.1415 ++ *  it under the terms of the GNU General Public License as published by
  1.1416 ++ *  the Free Software Foundation; either version 2 of the License, or
  1.1417 ++ *  (at your option) any later version.
  1.1418 ++ *
  1.1419 ++ *  This program is distributed in the hope that it will be useful,
  1.1420 ++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  1.1421 ++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1.1422 ++ *  GNU General Public License for more details.
  1.1423 ++ *
  1.1424 ++ *  You should have received a copy of the GNU General Public License
  1.1425 ++ *  along with this program; if not, write to the Free Software
  1.1426 ++ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1.1427 ++ */
  1.1428 ++
  1.1429 ++#ifndef ASM_FILE
  1.1430 ++
  1.1431 ++struct decomp_entry
  1.1432 ++{
  1.1433 ++  char *name;
  1.1434 ++  int (*open_func) (void);
  1.1435 ++  void (*close_func) (void);
  1.1436 ++  unsigned long (*read_func) (char *buf, unsigned long len, unsigned long write);
  1.1437 ++};
  1.1438 ++
  1.1439 ++#define NUM_DECOM 2
  1.1440 ++
  1.1441 ++extern struct decomp_entry decomp_table[NUM_DECOM];
  1.1442 ++extern int decomp_type;
  1.1443 ++
  1.1444 ++#endif
  1.1445 +\ No newline at end of file
  1.1446 +diff -Naur ../grub4dos-chenall-r63/stage2/disk_io.c ./stage2/disk_io.c
  1.1447 +--- grub4dos-chenall-r63/stage2/disk_io.c	2010-08-12 14:22:47.111207000 +0700
  1.1448 ++++ grub4dos/stage2/disk_io.c	2010-11-28 20:26:39.089887300 +0700
  1.1449 +@@ -21,6 +21,7 @@
  1.1450 + 
  1.1451 + #include <shared.h>
  1.1452 + #include <filesys.h>
  1.1453 ++#include <decomp.h>
  1.1454 + #include <iso9660.h>
  1.1455 + 
  1.1456 + #ifdef SUPPORT_NETBOOT
  1.1457 +@@ -1872,7 +1873,16 @@
  1.1458 + #ifdef NO_DECOMPRESSION
  1.1459 +       return 1;
  1.1460 + #else
  1.1461 +-      return gunzip_test_header ();
  1.1462 ++      if (no_decompression)
  1.1463 ++	return 1;
  1.1464 ++      int i;
  1.1465 ++      i = strlen(open_filename);
  1.1466 ++      if (i>=5 && strcmp(open_filename+i-5,".lzma")==0)
  1.1467 ++        dec_lzma_open ();
  1.1468 ++      else
  1.1469 ++        gunzip_test_header ();
  1.1470 ++      errnum = 0;
  1.1471 ++      return 1;
  1.1472 + #endif
  1.1473 +     }
  1.1474 + 
  1.1475 +@@ -1903,7 +1903,7 @@
  1.1476 +   {
  1.1477 +     if (write == 0x900ddeed)
  1.1478 + 	return !(errnum = ERR_WRITE_GZIP_FILE);
  1.1479 +-    return gunzip_read (buf, len);
  1.1480 ++    return decomp_table[decomp_type].read_func (buf, len, write);
  1.1481 +   }
  1.1482 + #endif /* NO_DECOMPRESSION */
  1.1483 + 
  1.1484 +@@ -1978,6 +1982,12 @@
  1.1485 + void
  1.1486 + grub_close (void)
  1.1487 + {
  1.1488 ++#ifndef NO_DECOMPRESSION
  1.1489 ++  if (compressed_file)
  1.1490 ++      decomp_table[decomp_type].close_func ();
  1.1491 ++  compressed_file = 0;
  1.1492 ++#endif /* NO_DECOMPRESSION */
  1.1493 ++
  1.1494 + #ifndef NO_BLOCK_FILES
  1.1495 +   if (block_file)
  1.1496 +     return;
  1.1497 +diff -Naur ../grub4dos-chenall-r63/stage2/gunzip.c ./stage2/gunzip.c
  1.1498 +--- grub4dos-chenall-r63/stage2/gunzip.c	2010-07-26 19:35:48.440546000 +0700
  1.1499 ++++ grub4dos/stage2/gunzip.c	2010-11-28 14:20:56.983870700 +0700
  1.1500 +@@ -129,6 +129,8 @@
  1.1501 + 
  1.1502 + #include "filesys.h"
  1.1503 + 
  1.1504 ++#include "decomp.h"
  1.1505 ++
  1.1506 + /* so we can disable decompression  */
  1.1507 + #ifdef GRUB_UTIL
  1.1508 + int no_decompression = 0;
  1.1509 +@@ -137,6 +139,15 @@
  1.1510 + /* used to tell if "read" should be redirected to "gunzip_read" */
  1.1511 + int compressed_file;
  1.1512 + 
  1.1513 ++/* identify active decompressor */
  1.1514 ++int decomp_type;
  1.1515 ++
  1.1516 ++struct decomp_entry decomp_table[NUM_DECOM] =
  1.1517 ++{
  1.1518 ++	{"gz",gunzip_test_header,gunzip_close,gunzip_read},
  1.1519 ++	{"lzma",dec_lzma_open,dec_lzma_close,dec_lzma_read}
  1.1520 ++};
  1.1521 ++
  1.1522 + /* internal variables only */
  1.1523 + static unsigned long long gzip_data_offset;
  1.1524 + static unsigned long long gzip_filepos;
  1.1525 +@@ -227,6 +238,7 @@
  1.1526 + /* Little-Endian defines for the 2-byte magic number for gzip files */
  1.1527 + #define GZIP_HDR_LE      0x8B1F
  1.1528 + #define OLD_GZIP_HDR_LE  0x9E1F
  1.1529 ++#define LZMA_HDR_LE      0x005D
  1.1530 + 
  1.1531 + /* Compression methods (see algorithm.doc) */
  1.1532 + #define STORED      0
  1.1533 +@@ -281,10 +292,18 @@
  1.1534 +   if (no_decompression
  1.1535 +       || grub_read ((char *)buf, 10, 0xedde0d90) != 10
  1.1536 +       || ((*((unsigned short *) buf) != GZIP_HDR_LE)
  1.1537 +-	  && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE)))
  1.1538 ++	  && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE)
  1.1539 ++	  && (*((unsigned short *) buf) != LZMA_HDR_LE)))
  1.1540 +     {
  1.1541 +       filepos = 0;
  1.1542 +       return ! errnum;
  1.1543 ++    }
  1.1544 ++
  1.1545 ++  if (*((unsigned short *) buf) == LZMA_HDR_LE)
  1.1546 ++    {
  1.1547 ++      filepos = 0;
  1.1548 ++      dec_lzma_open();
  1.1549 ++      return 1;
  1.1550 +     }
  1.1551 + 
  1.1552 +   /*
  1.1553 +@@ -323,6 +334,7 @@
  1.1554 + 
  1.1555 +   initialize_tables ();
  1.1556 + 
  1.1557 ++  decomp_type = 0;
  1.1558 +   compressed_file = 1;
  1.1559 +   gunzip_swap_values ();
  1.1560 +   /*
  1.1561 +@@ -334,6 +346,11 @@
  1.1562 +   return 1;
  1.1563 + }
  1.1564 + 
  1.1565 ++void 
  1.1566 ++gunzip_close (void)
  1.1567 ++{
  1.1568 ++}
  1.1569 ++
  1.1570 + 
  1.1571 + /* Huffman code lookup table entry--this entry is four bytes for machines
  1.1572 +    that have 16-bit pointers (e.g. PC's in the small or medium model).
  1.1573 +@@ -1190,7 +1226,7 @@
  1.1574 + 
  1.1575 + 
  1.1576 + unsigned long
  1.1577 +-gunzip_read (char *buf, unsigned long len)
  1.1578 ++gunzip_read (char *buf, unsigned long len, unsigned long write)
  1.1579 + {
  1.1580 +   unsigned long ret = 0;
  1.1581 + 
  1.1582 +diff -Naur ../grub4dos-chenall-r63/stage2/Makefile.am ./stage2/Makefile.am
  1.1583 +--- grub4dos-chenall-r63/stage2/Makefile.am	2010-08-12 14:22:47.111207000 +0700
  1.1584 ++++ grub4dos/stage2/Makefile.am	2010-11-28 16:35:18.724975900 +0700
  1.1585 +@@ -16,6 +16,7 @@
  1.1586 + # The library for /sbin/grub.
  1.1587 + noinst_LIBRARIES = libgrub.a
  1.1588 + libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
  1.1589 ++	dec_lzma.c \
  1.1590 + 	disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ntfs.c fsys_ffs.c fsys_iso9660.c \
  1.1591 + 	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
  1.1592 + 	fsys_vstafs.c fsys_xfs.c fsys_pxe.c gunzip.c md5.c serial.c stage2.c \
  1.1593 +@@ -100,7 +101,7 @@
  1.1594 + 
  1.1595 + # For stage2 target.
  1.1596 + pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
  1.1597 +-	cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
  1.1598 ++	cmdline.c common.c console.c dec_lzma.c disk_io.c fsys_ext2fs.c \
  1.1599 + 	fsys_fat.c fsys_ntfs.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
  1.1600 + 	fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c fsys_pxe.c gunzip.c \
  1.1601 + 	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c graphics.c
  1.1602 +diff -Naur ../grub4dos-chenall-r63/stage2/Makefile.in ./stage2/Makefile.in
  1.1603 +--- grub4dos-chenall-r63/stage2/Makefile.in	2010-08-12 14:22:47.111207000 +0700
  1.1604 ++++ grub4dos/stage2/Makefile.in	2010-11-28 16:38:22.871508400 +0700
  1.1605 +@@ -104,10 +104,11 @@
  1.1606 + am_libgrub_a_OBJECTS = libgrub_a-boot.$(OBJEXT) \
  1.1607 + 	libgrub_a-builtins.$(OBJEXT) libgrub_a-char_io.$(OBJEXT) \
  1.1608 + 	libgrub_a-cmdline.$(OBJEXT) libgrub_a-common.$(OBJEXT) \
  1.1609 +-	libgrub_a-disk_io.$(OBJEXT) libgrub_a-fsys_ext2fs.$(OBJEXT) \
  1.1610 +-	libgrub_a-fsys_fat.$(OBJEXT) libgrub_a-fsys_ntfs.$(OBJEXT) \
  1.1611 +-	libgrub_a-fsys_ffs.$(OBJEXT) libgrub_a-fsys_iso9660.$(OBJEXT) \
  1.1612 +-	libgrub_a-fsys_jfs.$(OBJEXT) libgrub_a-fsys_minix.$(OBJEXT) \
  1.1613 ++	libgrub_a-dec_lzma.$(OBJEXT) libgrub_a-disk_io.$(OBJEXT) \
  1.1614 ++	libgrub_a-fsys_ext2fs.$(OBJEXT) libgrub_a-fsys_fat.$(OBJEXT) \
  1.1615 ++	libgrub_a-fsys_ntfs.$(OBJEXT) libgrub_a-fsys_ffs.$(OBJEXT) \
  1.1616 ++	libgrub_a-fsys_iso9660.$(OBJEXT) libgrub_a-fsys_jfs.$(OBJEXT) \
  1.1617 ++	libgrub_a-fsys_minix.$(OBJEXT) \
  1.1618 + 	libgrub_a-fsys_reiserfs.$(OBJEXT) \
  1.1619 + 	libgrub_a-fsys_ufs2.$(OBJEXT) libgrub_a-fsys_vstafs.$(OBJEXT) \
  1.1620 + 	libgrub_a-fsys_xfs.$(OBJEXT) libgrub_a-fsys_pxe.$(OBJEXT) \
  1.1621 +@@ -131,6 +132,7 @@
  1.1622 + 	diskless_exec-char_io.$(OBJEXT) \
  1.1623 + 	diskless_exec-cmdline.$(OBJEXT) diskless_exec-common.$(OBJEXT) \
  1.1624 + 	diskless_exec-console.$(OBJEXT) \
  1.1625 ++	diskless_exec-dec_lzma.$(OBJEXT) \
  1.1626 + 	diskless_exec-disk_io.$(OBJEXT) \
  1.1627 + 	diskless_exec-fsys_ext2fs.$(OBJEXT) \
  1.1628 + 	diskless_exec-fsys_fat.$(OBJEXT) \
  1.1629 +@@ -247,6 +249,7 @@
  1.1630 + 	pre_stage2_exec-cmdline.$(OBJEXT) \
  1.1631 + 	pre_stage2_exec-common.$(OBJEXT) \
  1.1632 + 	pre_stage2_exec-console.$(OBJEXT) \
  1.1633 ++	pre_stage2_exec-dec_lzma.$(OBJEXT) \
  1.1634 + 	pre_stage2_exec-disk_io.$(OBJEXT) \
  1.1635 + 	pre_stage2_exec-fsys_ext2fs.$(OBJEXT) \
  1.1636 + 	pre_stage2_exec-fsys_fat.$(OBJEXT) \
  1.1637 +@@ -512,6 +513,7 @@
  1.1638 + # The library for /sbin/grub.
  1.1639 + noinst_LIBRARIES = libgrub.a
  1.1640 + libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
  1.1641 ++	dec_lzma.c \
  1.1642 + 	disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ntfs.c fsys_ffs.c fsys_iso9660.c \
  1.1643 + 	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
  1.1644 + 	fsys_vstafs.c fsys_xfs.c fsys_pxe.c gunzip.c md5.c serial.c stage2.c \
  1.1645 +@@ -559,7 +563,7 @@
  1.1646 + 
  1.1647 + # For stage2 target.
  1.1648 + pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
  1.1649 +-	cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
  1.1650 ++	cmdline.c common.c console.c dec_lzma.c disk_io.c fsys_ext2fs.c \
  1.1651 + 	fsys_fat.c fsys_ntfs.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
  1.1652 + 	fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c fsys_pxe.c gunzip.c \
  1.1653 + 	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c graphics.c
  1.1654 +@@ -878,6 +882,7 @@
  1.1655 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-cmdline.Po@am__quote@
  1.1656 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-common.Po@am__quote@
  1.1657 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-console.Po@am__quote@
  1.1658 ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-dec_lzma.Po@am__quote@
  1.1659 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-disk_io.Po@am__quote@
  1.1660 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_ext2fs.Po@am__quote@
  1.1661 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_fat.Po@am__quote@
  1.1662 +@@ -935,6 +940,7 @@
  1.1663 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-char_io.Po@am__quote@
  1.1664 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-cmdline.Po@am__quote@
  1.1665 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-common.Po@am__quote@
  1.1666 ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-dec_lzma.Po@am__quote@
  1.1667 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-disk_io.Po@am__quote@
  1.1668 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_ext2fs.Po@am__quote@
  1.1669 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_fat.Po@am__quote@
  1.1670 +@@ -974,6 +980,7 @@
  1.1671 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-cmdline.Po@am__quote@
  1.1672 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-common.Po@am__quote@
  1.1673 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-console.Po@am__quote@
  1.1674 ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-dec_lzma.Po@am__quote@
  1.1675 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-disk_io.Po@am__quote@
  1.1676 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_ext2fs.Po@am__quote@
  1.1677 + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_fat.Po@am__quote@
  1.1678 +@@ -1315,6 +1322,20 @@
  1.1679 + @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1680 + @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-common.obj `if test -f 'common.c'; then $(CYGPATH_W) 'common.c'; else $(CYGPATH_W) '$(srcdir)/common.c'; fi`
  1.1681 + 
  1.1682 ++libgrub_a-dec_lzma.o: dec_lzma.c
  1.1683 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-dec_lzma.o -MD -MP -MF "$(DEPDIR)/libgrub_a-dec_lzma.Tpo" -c -o libgrub_a-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c; \
  1.1684 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libgrub_a-dec_lzma.Tpo" "$(DEPDIR)/libgrub_a-dec_lzma.Po"; else rm -f "$(DEPDIR)/libgrub_a-dec_lzma.Tpo"; exit 1; fi
  1.1685 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='libgrub_a-dec_lzma.o' libtool=no @AMDEPBACKSLASH@
  1.1686 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1687 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c
  1.1688 ++
  1.1689 ++libgrub_a-dec_lzma.obj: dec_lzma.c
  1.1690 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-dec_lzma.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-dec_lzma.Tpo" -c -o libgrub_a-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`; \
  1.1691 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libgrub_a-dec_lzma.Tpo" "$(DEPDIR)/libgrub_a-dec_lzma.Po"; else rm -f "$(DEPDIR)/libgrub_a-dec_lzma.Tpo"; exit 1; fi
  1.1692 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='libgrub_a-dec_lzma.obj' libtool=no @AMDEPBACKSLASH@
  1.1693 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1694 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`
  1.1695 ++
  1.1696 + libgrub_a-disk_io.o: disk_io.c
  1.1697 + @am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-disk_io.o -MD -MP -MF "$(DEPDIR)/libgrub_a-disk_io.Tpo" -c -o libgrub_a-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c; \
  1.1698 + @am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libgrub_a-disk_io.Tpo" "$(DEPDIR)/libgrub_a-disk_io.Po"; else rm -f "$(DEPDIR)/libgrub_a-disk_io.Tpo"; exit 1; fi
  1.1699 +@@ -1693,6 +1714,20 @@
  1.1700 + @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1701 + @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-console.obj `if test -f 'console.c'; then $(CYGPATH_W) 'console.c'; else $(CYGPATH_W) '$(srcdir)/console.c'; fi`
  1.1702 + 
  1.1703 ++diskless_exec-dec_lzma.o: dec_lzma.c
  1.1704 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-dec_lzma.o -MD -MP -MF "$(DEPDIR)/diskless_exec-dec_lzma.Tpo" -c -o diskless_exec-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c; \
  1.1705 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/diskless_exec-dec_lzma.Tpo" "$(DEPDIR)/diskless_exec-dec_lzma.Po"; else rm -f "$(DEPDIR)/diskless_exec-dec_lzma.Tpo"; exit 1; fi
  1.1706 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='diskless_exec-dec_lzma.o' libtool=no @AMDEPBACKSLASH@
  1.1707 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1708 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c
  1.1709 ++
  1.1710 ++diskless_exec-dec_lzma.obj: dec_lzma.c
  1.1711 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-dec_lzma.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-dec_lzma.Tpo" -c -o diskless_exec-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`; \
  1.1712 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/diskless_exec-dec_lzma.Tpo" "$(DEPDIR)/diskless_exec-dec_lzma.Po"; else rm -f "$(DEPDIR)/diskless_exec-dec_lzma.Tpo"; exit 1; fi
  1.1713 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='diskless_exec-dec_lzma.obj' libtool=no @AMDEPBACKSLASH@
  1.1714 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1715 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`
  1.1716 ++
  1.1717 + diskless_exec-disk_io.o: disk_io.c
  1.1718 + @am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-disk_io.o -MD -MP -MF "$(DEPDIR)/diskless_exec-disk_io.Tpo" -c -o diskless_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c; \
  1.1719 + @am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/diskless_exec-disk_io.Tpo" "$(DEPDIR)/diskless_exec-disk_io.Po"; else rm -f "$(DEPDIR)/diskless_exec-disk_io.Tpo"; exit 1; fi
  1.1720 +@@ -2687,6 +2722,20 @@
  1.1721 + @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1722 + @am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-console.obj `if test -f 'console.c'; then $(CYGPATH_W) 'console.c'; else $(CYGPATH_W) '$(srcdir)/console.c'; fi`
  1.1723 + 
  1.1724 ++pre_stage2_exec-dec_lzma.o: dec_lzma.c
  1.1725 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-dec_lzma.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo" -c -o pre_stage2_exec-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c; \
  1.1726 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo" "$(DEPDIR)/pre_stage2_exec-dec_lzma.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo"; exit 1; fi
  1.1727 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='pre_stage2_exec-dec_lzma.o' libtool=no @AMDEPBACKSLASH@
  1.1728 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1729 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-dec_lzma.o `test -f 'dec_lzma.c' || echo '$(srcdir)/'`dec_lzma.c
  1.1730 ++
  1.1731 ++pre_stage2_exec-dec_lzma.obj: dec_lzma.c
  1.1732 ++@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-dec_lzma.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo" -c -o pre_stage2_exec-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`; \
  1.1733 ++@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo" "$(DEPDIR)/pre_stage2_exec-dec_lzma.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-dec_lzma.Tpo"; exit 1; fi
  1.1734 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dec_lzma.c' object='pre_stage2_exec-dec_lzma.obj' libtool=no @AMDEPBACKSLASH@
  1.1735 ++@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  1.1736 ++@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-dec_lzma.obj `if test -f 'dec_lzma.c'; then $(CYGPATH_W) 'dec_lzma.c'; else $(CYGPATH_W) '$(srcdir)/dec_lzma.c'; fi`
  1.1737 ++
  1.1738 + pre_stage2_exec-disk_io.o: disk_io.c
  1.1739 + @am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-disk_io.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-disk_io.Tpo" -c -o pre_stage2_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c; \
  1.1740 + @am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/pre_stage2_exec-disk_io.Tpo" "$(DEPDIR)/pre_stage2_exec-disk_io.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-disk_io.Tpo"; exit 1; fi
  1.1741 +diff -Naur ../grub4dos-chenall-r63/stage2/shared.h ./stage2/shared.h
  1.1742 +--- grub4dos-chenall-r63/stage2/shared.h	2010-11-17 15:33:51.826683000 +0700
  1.1743 ++++ grub4dos/stage2/shared.h	2010-11-27 01:16:46.996893700 +0700
  1.1744 +@@ -640,6 +640,7 @@
  1.1745 +   ERR_WRITE_GZIP_FILE,
  1.1746 +   ERR_FUNC_CALL,
  1.1747 + //  ERR_WRITE_TO_NON_MEM_DRIVE,
  1.1748 ++  ERR_NOT_ENOUGH_MEMORY,
  1.1749 + 
  1.1750 +   MAX_ERR_NUM
  1.1751 + } grub_error_t;
  1.1752 +@@ -1185,7 +1186,11 @@
  1.1753 + #ifndef NO_DECOMPRESSION
  1.1754 + /* Compression support. */
  1.1755 + int gunzip_test_header (void);
  1.1756 +-unsigned long gunzip_read (char *buf, unsigned long len);
  1.1757 ++void gunzip_close (void);
  1.1758 ++unsigned long gunzip_read (char *buf, unsigned long len, unsigned long write);
  1.1759 ++int dec_lzma_open (void);
  1.1760 ++void dec_lzma_close (void);
  1.1761 ++unsigned long dec_lzma_read (char *buf, unsigned long len, unsigned long write);
  1.1762 + #endif /* NO_DECOMPRESSION */
  1.1763 + 
  1.1764 + int rawread (unsigned long drive, unsigned long sector, unsigned long byte_offset, unsigned long byte_len, char *buf, unsigned long write);