Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA_C/LzmaDecode.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   LzmaDecode.c
        !             3:   LZMA Decoder (optimized for Speed version)
        !             4:   
        !             5:   LZMA SDK 4.17 Copyright (c) 1999-2005 Igor Pavlov (2005-04-05)
        !             6:   http://www.7-zip.org/
        !             7: 
        !             8:   LZMA SDK is licensed under two licenses:
        !             9:   1) GNU Lesser General Public License (GNU LGPL)
        !            10:   2) Common Public License (CPL)
        !            11:   It means that you can select one of these two licenses and 
        !            12:   follow rules of that license.
        !            13: 
        !            14:   SPECIAL EXCEPTION:
        !            15:   Igor Pavlov, as the author of this Code, expressly permits you to 
        !            16:   statically or dynamically link your Code (or bind by name) to the 
        !            17:   interfaces of this file without subjecting your linked Code to the 
        !            18:   terms of the CPL or GNU LGPL. Any modifications or additions 
        !            19:   to this file, however, are subject to the LGPL or CPL terms.
        !            20: */
        !            21: 
        !            22: #include "LzmaDecode.h"
        !            23: 
        !            24: #ifndef Byte
        !            25: #define Byte unsigned char
        !            26: #endif
        !            27: 
        !            28: #define kNumTopBits 24
        !            29: #define kTopValue ((UInt32)1 << kNumTopBits)
        !            30: 
        !            31: #define kNumBitModelTotalBits 11
        !            32: #define kBitModelTotal (1 << kNumBitModelTotalBits)
        !            33: #define kNumMoveBits 5
        !            34: 
        !            35: #define RC_READ_BYTE (*Buffer++)
        !            36: 
        !            37: #define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
        !            38:   { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
        !            39: 
        !            40: #ifdef _LZMA_IN_CB
        !            41: 
        !            42: #define RC_TEST { if (Buffer == BufferLim) \
        !            43:   { UInt32 size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \
        !            44:   BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }}
        !            45: 
        !            46: #define RC_INIT Buffer = BufferLim = 0; RC_INIT2
        !            47: 
        !            48: #else
        !            49: 
        !            50: #define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }
        !            51: 
        !            52: #define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
        !            53:  
        !            54: #endif
        !            55: 
        !            56: #define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
        !            57: 
        !            58: #define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
        !            59: #define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
        !            60: #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
        !            61: 
        !            62: #define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
        !            63:   { UpdateBit0(p); mi <<= 1; A0; } else \
        !            64:   { UpdateBit1(p); mi = (mi + mi) + 1; A1; } 
        !            65:   
        !            66: #define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)               
        !            67: 
        !            68: #define RangeDecoderBitTreeDecode(probs, numLevels, res) \
        !            69:   { int i = numLevels; res = 1; \
        !            70:   do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
        !            71:   res -= (1 << numLevels); }
        !            72: 
        !            73: 
        !            74: #define kNumPosBitsMax 4
        !            75: #define kNumPosStatesMax (1 << kNumPosBitsMax)
        !            76: 
        !            77: #define kLenNumLowBits 3
        !            78: #define kLenNumLowSymbols (1 << kLenNumLowBits)
        !            79: #define kLenNumMidBits 3
        !            80: #define kLenNumMidSymbols (1 << kLenNumMidBits)
        !            81: #define kLenNumHighBits 8
        !            82: #define kLenNumHighSymbols (1 << kLenNumHighBits)
        !            83: 
        !            84: #define LenChoice 0
        !            85: #define LenChoice2 (LenChoice + 1)
        !            86: #define LenLow (LenChoice2 + 1)
        !            87: #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
        !            88: #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
        !            89: #define kNumLenProbs (LenHigh + kLenNumHighSymbols) 
        !            90: 
        !            91: 
        !            92: #define kNumStates 12
        !            93: #define kNumLitStates 7
        !            94: 
        !            95: #define kStartPosModelIndex 4
        !            96: #define kEndPosModelIndex 14
        !            97: #define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
        !            98: 
        !            99: #define kNumPosSlotBits 6
        !           100: #define kNumLenToPosStates 4
        !           101: 
        !           102: #define kNumAlignBits 4
        !           103: #define kAlignTableSize (1 << kNumAlignBits)
        !           104: 
        !           105: #define kMatchMinLen 2
        !           106: 
        !           107: #define IsMatch 0
        !           108: #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
        !           109: #define IsRepG0 (IsRep + kNumStates)
        !           110: #define IsRepG1 (IsRepG0 + kNumStates)
        !           111: #define IsRepG2 (IsRepG1 + kNumStates)
        !           112: #define IsRep0Long (IsRepG2 + kNumStates)
        !           113: #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
        !           114: #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
        !           115: #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
        !           116: #define LenCoder (Align + kAlignTableSize)
        !           117: #define RepLenCoder (LenCoder + kNumLenProbs)
        !           118: #define Literal (RepLenCoder + kNumLenProbs)
        !           119: 
        !           120: #if Literal != LZMA_BASE_SIZE
        !           121: StopCompilingDueBUG
        !           122: #endif
        !           123: 
        !           124: #ifdef _LZMA_OUT_READ
        !           125: 
        !           126: typedef struct _LzmaVarState
        !           127: {
        !           128:   Byte *Buffer;
        !           129:   Byte *BufferLim;
        !           130:   UInt32 Range;
        !           131:   UInt32 Code;
        !           132:   #ifdef _LZMA_IN_CB
        !           133:   ILzmaInCallback *InCallback;
        !           134:   #endif
        !           135:   Byte *Dictionary;
        !           136:   UInt32 DictionarySize;
        !           137:   UInt32 DictionaryPos;
        !           138:   UInt32 GlobalPos;
        !           139:   UInt32 Reps[4];
        !           140:   int lc;
        !           141:   int lp;
        !           142:   int pb;
        !           143:   int State;
        !           144:   int RemainLen;
        !           145:   Byte TempDictionary[4];
        !           146: } LzmaVarState;
        !           147: 
        !           148: int LzmaDecoderInit(
        !           149:     unsigned char *buffer, UInt32 bufferSize,
        !           150:     int lc, int lp, int pb,
        !           151:     unsigned char *dictionary, UInt32 dictionarySize,
        !           152:     #ifdef _LZMA_IN_CB
        !           153:     ILzmaInCallback *InCallback
        !           154:     #else
        !           155:     unsigned char *inStream, UInt32 inSize
        !           156:     #endif
        !           157:     )
        !           158: {
        !           159:   Byte *Buffer;
        !           160:   Byte *BufferLim;
        !           161:   UInt32 Range;
        !           162:   UInt32 Code;
        !           163:   LzmaVarState *vs = (LzmaVarState *)buffer;
        !           164:   CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
        !           165:   UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
        !           166:   UInt32 i;
        !           167:   if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))
        !           168:     return LZMA_RESULT_NOT_ENOUGH_MEM;
        !           169:   vs->Dictionary = dictionary;
        !           170:   vs->DictionarySize = dictionarySize;
        !           171:   vs->DictionaryPos = 0;
        !           172:   vs->GlobalPos = 0;
        !           173:   vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;
        !           174:   vs->lc = lc;
        !           175:   vs->lp = lp;
        !           176:   vs->pb = pb;
        !           177:   vs->State = 0;
        !           178:   vs->RemainLen = 0;
        !           179:   dictionary[dictionarySize - 1] = 0;
        !           180:   for (i = 0; i < numProbs; i++)
        !           181:     p[i] = kBitModelTotal >> 1; 
        !           182: 
        !           183:   #ifdef _LZMA_IN_CB
        !           184:   RC_INIT;
        !           185:   #else
        !           186:   RC_INIT(inStream, inSize);
        !           187:   #endif
        !           188:   vs->Buffer = Buffer;
        !           189:   vs->BufferLim = BufferLim;
        !           190:   vs->Range = Range;
        !           191:   vs->Code = Code;
        !           192:   #ifdef _LZMA_IN_CB
        !           193:   vs->InCallback = InCallback;
        !           194:   #endif
        !           195: 
        !           196:   return LZMA_RESULT_OK;
        !           197: }
        !           198: 
        !           199: int LzmaDecode(unsigned char *buffer, 
        !           200:     unsigned char *outStream, UInt32 outSize,
        !           201:     UInt32 *outSizeProcessed)
        !           202: {
        !           203:   LzmaVarState *vs = (LzmaVarState *)buffer;
        !           204:   Byte *Buffer = vs->Buffer;
        !           205:   Byte *BufferLim = vs->BufferLim;
        !           206:   UInt32 Range = vs->Range;
        !           207:   UInt32 Code = vs->Code;
        !           208:   #ifdef _LZMA_IN_CB
        !           209:   ILzmaInCallback *InCallback = vs->InCallback;
        !           210:   #endif
        !           211:   CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
        !           212:   int state = vs->State;
        !           213:   Byte previousByte;
        !           214:   UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
        !           215:   UInt32 nowPos = 0;
        !           216:   UInt32 posStateMask = (1 << (vs->pb)) - 1;
        !           217:   UInt32 literalPosMask = (1 << (vs->lp)) - 1;
        !           218:   int lc = vs->lc;
        !           219:   int len = vs->RemainLen;
        !           220:   UInt32 globalPos = vs->GlobalPos;
        !           221: 
        !           222:   Byte *dictionary = vs->Dictionary;
        !           223:   UInt32 dictionarySize = vs->DictionarySize;
        !           224:   UInt32 dictionaryPos = vs->DictionaryPos;
        !           225: 
        !           226:   Byte tempDictionary[4];
        !           227:   if (dictionarySize == 0)
        !           228:   {
        !           229:     dictionary = tempDictionary;
        !           230:     dictionarySize = 1;
        !           231:     tempDictionary[0] = vs->TempDictionary[0];
        !           232:   }
        !           233: 
        !           234:   if (len == -1)
        !           235:   {
        !           236:     *outSizeProcessed = 0;
        !           237:     return LZMA_RESULT_OK;
        !           238:   }
        !           239: 
        !           240:   while(len != 0 && nowPos < outSize)
        !           241:   {
        !           242:     UInt32 pos = dictionaryPos - rep0;
        !           243:     if (pos >= dictionarySize)
        !           244:       pos += dictionarySize;
        !           245:     outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
        !           246:     if (++dictionaryPos == dictionarySize)
        !           247:       dictionaryPos = 0;
        !           248:     len--;
        !           249:   }
        !           250:   if (dictionaryPos == 0)
        !           251:     previousByte = dictionary[dictionarySize - 1];
        !           252:   else
        !           253:     previousByte = dictionary[dictionaryPos - 1];
        !           254: #else
        !           255: 
        !           256: int LzmaDecode(
        !           257:     Byte *buffer, UInt32 bufferSize,
        !           258:     int lc, int lp, int pb,
        !           259:     #ifdef _LZMA_IN_CB
        !           260:     ILzmaInCallback *InCallback,
        !           261:     #else
        !           262:     unsigned char *inStream, UInt32 inSize,
        !           263:     #endif
        !           264:     unsigned char *outStream, UInt32 outSize,
        !           265:     UInt32 *outSizeProcessed)
        !           266: {
        !           267:   UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
        !           268:   CProb *p = (CProb *)buffer;
        !           269: 
        !           270:   UInt32 i;
        !           271:   int state = 0;
        !           272:   Byte previousByte = 0;
        !           273:   UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
        !           274:   UInt32 nowPos = 0;
        !           275:   UInt32 posStateMask = (1 << pb) - 1;
        !           276:   UInt32 literalPosMask = (1 << lp) - 1;
        !           277:   int len = 0;
        !           278:   
        !           279:   Byte *Buffer;
        !           280:   Byte *BufferLim;
        !           281:   UInt32 Range;
        !           282:   UInt32 Code;
        !           283:   
        !           284:   if (bufferSize < numProbs * sizeof(CProb))
        !           285:     return LZMA_RESULT_NOT_ENOUGH_MEM;
        !           286:   for (i = 0; i < numProbs; i++)
        !           287:     p[i] = kBitModelTotal >> 1;
        !           288:   
        !           289: 
        !           290:   #ifdef _LZMA_IN_CB
        !           291:   RC_INIT;
        !           292:   #else
        !           293:   RC_INIT(inStream, inSize);
        !           294:   #endif
        !           295: #endif
        !           296: 
        !           297:   *outSizeProcessed = 0;
        !           298:   while(nowPos < outSize)
        !           299:   {
        !           300:     CProb *prob;
        !           301:     UInt32 bound;
        !           302:     int posState = (int)(
        !           303:         (nowPos 
        !           304:         #ifdef _LZMA_OUT_READ
        !           305:         + globalPos
        !           306:         #endif
        !           307:         )
        !           308:         & posStateMask);
        !           309: 
        !           310:     prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
        !           311:     IfBit0(prob)
        !           312:     {
        !           313:       int symbol = 1;
        !           314:       UpdateBit0(prob)
        !           315:       prob = p + Literal + (LZMA_LIT_SIZE * 
        !           316:         (((
        !           317:         (nowPos 
        !           318:         #ifdef _LZMA_OUT_READ
        !           319:         + globalPos
        !           320:         #endif
        !           321:         )
        !           322:         & literalPosMask) << lc) + (previousByte >> (8 - lc))));
        !           323: 
        !           324:       if (state >= kNumLitStates)
        !           325:       {
        !           326:         int matchByte;
        !           327:         #ifdef _LZMA_OUT_READ
        !           328:         UInt32 pos = dictionaryPos - rep0;
        !           329:         if (pos >= dictionarySize)
        !           330:           pos += dictionarySize;
        !           331:         matchByte = dictionary[pos];
        !           332:         #else
        !           333:         matchByte = outStream[nowPos - rep0];
        !           334:         #endif
        !           335:         do
        !           336:         {
        !           337:           int bit;
        !           338:           CProb *probLit;
        !           339:           matchByte <<= 1;
        !           340:           bit = (matchByte & 0x100);
        !           341:           probLit = prob + 0x100 + bit + symbol;
        !           342:           RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)
        !           343:         }
        !           344:         while (symbol < 0x100);
        !           345:       }
        !           346:       while (symbol < 0x100)
        !           347:       {
        !           348:         CProb *probLit = prob + symbol;
        !           349:         RC_GET_BIT(probLit, symbol)
        !           350:       }
        !           351:       previousByte = (Byte)symbol;
        !           352: 
        !           353:       outStream[nowPos++] = previousByte;
        !           354:       #ifdef _LZMA_OUT_READ
        !           355:       dictionary[dictionaryPos] = previousByte;
        !           356:       if (++dictionaryPos == dictionarySize)
        !           357:         dictionaryPos = 0;
        !           358:       #endif
        !           359:       if (state < 4) state = 0;
        !           360:       else if (state < 10) state -= 3;
        !           361:       else state -= 6;
        !           362:     }
        !           363:     else             
        !           364:     {
        !           365:       UpdateBit1(prob);
        !           366:       prob = p + IsRep + state;
        !           367:       IfBit0(prob)
        !           368:       {
        !           369:         UpdateBit0(prob);
        !           370:         rep3 = rep2;
        !           371:         rep2 = rep1;
        !           372:         rep1 = rep0;
        !           373:         state = state < kNumLitStates ? 0 : 3;
        !           374:         prob = p + LenCoder;
        !           375:       }
        !           376:       else
        !           377:       {
        !           378:         UpdateBit1(prob);
        !           379:         prob = p + IsRepG0 + state;
        !           380:         IfBit0(prob)
        !           381:         {
        !           382:           UpdateBit0(prob);
        !           383:           prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;
        !           384:           IfBit0(prob)
        !           385:           {
        !           386:             #ifdef _LZMA_OUT_READ
        !           387:             UInt32 pos;
        !           388:             #endif
        !           389:             UpdateBit0(prob);
        !           390:             if (nowPos 
        !           391:                 #ifdef _LZMA_OUT_READ
        !           392:                 + globalPos
        !           393:                 #endif
        !           394:                 == 0)
        !           395:               return LZMA_RESULT_DATA_ERROR;
        !           396:             state = state < kNumLitStates ? 9 : 11;
        !           397:             #ifdef _LZMA_OUT_READ
        !           398:             pos = dictionaryPos - rep0;
        !           399:             if (pos >= dictionarySize)
        !           400:               pos += dictionarySize;
        !           401:             previousByte = dictionary[pos];
        !           402:             dictionary[dictionaryPos] = previousByte;
        !           403:             if (++dictionaryPos == dictionarySize)
        !           404:               dictionaryPos = 0;
        !           405:             #else
        !           406:             previousByte = outStream[nowPos - rep0];
        !           407:             #endif
        !           408:             outStream[nowPos++] = previousByte;
        !           409:             continue;
        !           410:           }
        !           411:           else
        !           412:           {
        !           413:             UpdateBit1(prob);
        !           414:           }
        !           415:         }
        !           416:         else
        !           417:         {
        !           418:           UInt32 distance;
        !           419:           UpdateBit1(prob);
        !           420:           prob = p + IsRepG1 + state;
        !           421:           IfBit0(prob)
        !           422:           {
        !           423:             UpdateBit0(prob);
        !           424:             distance = rep1;
        !           425:           }
        !           426:           else 
        !           427:           {
        !           428:             UpdateBit1(prob);
        !           429:             prob = p + IsRepG2 + state;
        !           430:             IfBit0(prob)
        !           431:             {
        !           432:               UpdateBit0(prob);
        !           433:               distance = rep2;
        !           434:             }
        !           435:             else
        !           436:             {
        !           437:               UpdateBit1(prob);
        !           438:               distance = rep3;
        !           439:               rep3 = rep2;
        !           440:             }
        !           441:             rep2 = rep1;
        !           442:           }
        !           443:           rep1 = rep0;
        !           444:           rep0 = distance;
        !           445:         }
        !           446:         state = state < kNumLitStates ? 8 : 11;
        !           447:         prob = p + RepLenCoder;
        !           448:       }
        !           449:       {
        !           450:         int numBits, offset;
        !           451:         CProb *probLen = prob + LenChoice;
        !           452:         IfBit0(probLen)
        !           453:         {
        !           454:           UpdateBit0(probLen);
        !           455:           probLen = prob + LenLow + (posState << kLenNumLowBits);
        !           456:           offset = 0;
        !           457:           numBits = kLenNumLowBits;
        !           458:         }
        !           459:         else
        !           460:         {
        !           461:           UpdateBit1(probLen);
        !           462:           probLen = prob + LenChoice2;
        !           463:           IfBit0(probLen)
        !           464:           {
        !           465:             UpdateBit0(probLen);
        !           466:             probLen = prob + LenMid + (posState << kLenNumMidBits);
        !           467:             offset = kLenNumLowSymbols;
        !           468:             numBits = kLenNumMidBits;
        !           469:           }
        !           470:           else
        !           471:           {
        !           472:             UpdateBit1(probLen);
        !           473:             probLen = prob + LenHigh;
        !           474:             offset = kLenNumLowSymbols + kLenNumMidSymbols;
        !           475:             numBits = kLenNumHighBits;
        !           476:           }
        !           477:         }
        !           478:         RangeDecoderBitTreeDecode(probLen, numBits, len);
        !           479:         len += offset;
        !           480:       }
        !           481: 
        !           482:       if (state < 4)
        !           483:       {
        !           484:         int posSlot;
        !           485:         state += kNumLitStates;
        !           486:         prob = p + PosSlot +
        !           487:             ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << 
        !           488:             kNumPosSlotBits);
        !           489:         RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);
        !           490:         if (posSlot >= kStartPosModelIndex)
        !           491:         {
        !           492:           int numDirectBits = ((posSlot >> 1) - 1);
        !           493:           rep0 = (2 | ((UInt32)posSlot & 1));
        !           494:           if (posSlot < kEndPosModelIndex)
        !           495:           {
        !           496:             rep0 <<= numDirectBits;
        !           497:             prob = p + SpecPos + rep0 - posSlot - 1;
        !           498:           }
        !           499:           else
        !           500:           {
        !           501:             numDirectBits -= kNumAlignBits;
        !           502:             do
        !           503:             {
        !           504:               RC_NORMALIZE
        !           505:               Range >>= 1;
        !           506:               rep0 <<= 1;
        !           507:               if (Code >= Range)
        !           508:               {
        !           509:                 Code -= Range;
        !           510:                 rep0 |= 1;
        !           511:               }
        !           512:             }
        !           513:             while (--numDirectBits != 0);
        !           514:             prob = p + Align;
        !           515:             rep0 <<= kNumAlignBits;
        !           516:             numDirectBits = kNumAlignBits;
        !           517:           }
        !           518:           {
        !           519:             int i = 1;
        !           520:             int mi = 1;
        !           521:             do
        !           522:             {
        !           523:               CProb *prob3 = prob + mi;
        !           524:               RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
        !           525:               i <<= 1;
        !           526:             }
        !           527:             while(--numDirectBits != 0);
        !           528:           }
        !           529:         }
        !           530:         else
        !           531:           rep0 = posSlot;
        !           532:         if (++rep0 == (UInt32)(0))
        !           533:         {
        !           534:           /* it's for stream version */
        !           535:           len = -1;
        !           536:           break;
        !           537:         }
        !           538:       }
        !           539: 
        !           540:       len += kMatchMinLen;
        !           541:       if (rep0 > nowPos 
        !           542:         #ifdef _LZMA_OUT_READ
        !           543:         + globalPos || rep0 > dictionarySize
        !           544:         #endif
        !           545:         ) 
        !           546:         return LZMA_RESULT_DATA_ERROR;
        !           547:       do
        !           548:       {
        !           549:         #ifdef _LZMA_OUT_READ
        !           550:         UInt32 pos = dictionaryPos - rep0;
        !           551:         if (pos >= dictionarySize)
        !           552:           pos += dictionarySize;
        !           553:         previousByte = dictionary[pos];
        !           554:         dictionary[dictionaryPos] = previousByte;
        !           555:         if (++dictionaryPos == dictionarySize)
        !           556:           dictionaryPos = 0;
        !           557:         #else
        !           558:         previousByte = outStream[nowPos - rep0];
        !           559:         #endif
        !           560:         len--;
        !           561:         outStream[nowPos++] = previousByte;
        !           562:       }
        !           563:       while(len != 0 && nowPos < outSize);
        !           564:     }
        !           565:   }
        !           566:   RC_NORMALIZE;
        !           567: 
        !           568:   #ifdef _LZMA_OUT_READ
        !           569:   vs->Buffer = Buffer;
        !           570:   vs->BufferLim = BufferLim;
        !           571:   vs->Range = Range;
        !           572:   vs->Code = Code;
        !           573:   vs->DictionaryPos = dictionaryPos;
        !           574:   vs->GlobalPos = globalPos + nowPos;
        !           575:   vs->Reps[0] = rep0;
        !           576:   vs->Reps[1] = rep1;
        !           577:   vs->Reps[2] = rep2;
        !           578:   vs->Reps[3] = rep3;
        !           579:   vs->State = state;
        !           580:   vs->RemainLen = len;
        !           581:   vs->TempDictionary[0] = tempDictionary[0];
        !           582:   #endif
        !           583: 
        !           584:   *outSizeProcessed = nowPos;
        !           585:   return LZMA_RESULT_OK;
        !           586: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>