Welcome to mirror list, hosted at ThFree Co, Russian Federation.

RarVol.h « Rar « Archive « 7zip « CPP - github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d0f91de6cdadec3d4211bb1279745505e452440c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// RarVol.h

#ifndef __ARCHIVE_RAR_VOL_H
#define __ARCHIVE_RAR_VOL_H

#include "../../../Common/StringConvert.h"

#include "RarHeader.h"

namespace NArchive {
namespace NRar {

inline bool IsDigit(wchar_t c)
{
  return c >= L'0' && c <= L'9';
}

class CVolumeName
{
  bool _first;
  bool _newStyle;
  UString _unchangedPart;
  UString _changedPart;
  UString _afterPart;
public:
  CVolumeName(): _newStyle(true) {};

  bool InitName(const UString &name, bool newStyle = true)
  {
    _first = true;
    _newStyle = newStyle;
    int dotPos = name.ReverseFind_Dot();
    UString basePart = name;

    if (dotPos >= 0)
    {
      UString ext = name.Ptr(dotPos + 1);
      if (ext.IsEqualTo_Ascii_NoCase("rar"))
      {
        _afterPart = name.Ptr(dotPos);
        basePart = name.Left(dotPos);
      }
      else if (ext.IsEqualTo_Ascii_NoCase("exe"))
      {
        _afterPart.SetFromAscii(".rar");
        basePart = name.Left(dotPos);
      }
      else if (!_newStyle)
      {
        if (ext.IsEqualTo_Ascii_NoCase("000") ||
            ext.IsEqualTo_Ascii_NoCase("001") ||
            ext.IsEqualTo_Ascii_NoCase("r00") ||
            ext.IsEqualTo_Ascii_NoCase("r01"))
        {
          _afterPart.Empty();
          _first = false;
          _changedPart = ext;
          _unchangedPart = name.Left(dotPos + 1);
          return true;
        }
      }
    }

    if (!_newStyle)
    {
      _afterPart.Empty();
      _unchangedPart = basePart;
      _unchangedPart += L'.';
      _changedPart.SetFromAscii("r00");
      return true;
    }

    if (basePart.IsEmpty())
      return false;
    unsigned i = basePart.Len();
    
    do
      if (!IsDigit(basePart[i - 1]))
        break;
    while (--i);
    
    _unchangedPart = basePart.Left(i);
    _changedPart = basePart.Ptr(i);
    return true;
  }

  /*
  void MakeBeforeFirstName()
  {
    unsigned len = _changedPart.Len();
    _changedPart.Empty();
    for (unsigned i = 0; i < len; i++)
      _changedPart += L'0';
  }
  */

  UString GetNextName()
  {
    if (_newStyle || !_first)
    {
      unsigned i = _changedPart.Len();
      for (;;)
      {
        wchar_t c = _changedPart[--i];
        if (c == L'9')
        {
          c = L'0';
          _changedPart.ReplaceOneCharAtPos(i, c);
          if (i == 0)
          {
            _changedPart.InsertAtFront(L'1');
            break;
          }
          continue;
        }
        c++;
        _changedPart.ReplaceOneCharAtPos(i, c);
        break;
      }
    }
    
    _first = false;
    return _unchangedPart + _changedPart + _afterPart;
  }
};

}}

#endif