xref: /aosp_15_r20/external/lzma/CPP/Windows/PropVariantUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // PropVariantUtils.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "PropVariantUtils.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
10*f6dc9357SAndroid Build Coastguard Worker 
AddHex(AString & s,UInt32 v)11*f6dc9357SAndroid Build Coastguard Worker static void AddHex(AString &s, UInt32 v)
12*f6dc9357SAndroid Build Coastguard Worker {
13*f6dc9357SAndroid Build Coastguard Worker   char sz[16];
14*f6dc9357SAndroid Build Coastguard Worker   sz[0] = '0';
15*f6dc9357SAndroid Build Coastguard Worker   sz[1] = 'x';
16*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt32ToHex(v, sz + 2);
17*f6dc9357SAndroid Build Coastguard Worker   s += sz;
18*f6dc9357SAndroid Build Coastguard Worker }
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker 
TypePairToString(const CUInt32PCharPair * pairs,unsigned num,UInt32 value)21*f6dc9357SAndroid Build Coastguard Worker AString TypePairToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 value)
22*f6dc9357SAndroid Build Coastguard Worker {
23*f6dc9357SAndroid Build Coastguard Worker   char sz[16];
24*f6dc9357SAndroid Build Coastguard Worker   const char *p = NULL;
25*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < num; i++)
26*f6dc9357SAndroid Build Coastguard Worker   {
27*f6dc9357SAndroid Build Coastguard Worker     const CUInt32PCharPair &pair = pairs[i];
28*f6dc9357SAndroid Build Coastguard Worker     if (pair.Value == value)
29*f6dc9357SAndroid Build Coastguard Worker       p = pair.Name;
30*f6dc9357SAndroid Build Coastguard Worker   }
31*f6dc9357SAndroid Build Coastguard Worker   if (!p)
32*f6dc9357SAndroid Build Coastguard Worker   {
33*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToString(value, sz);
34*f6dc9357SAndroid Build Coastguard Worker     p = sz;
35*f6dc9357SAndroid Build Coastguard Worker   }
36*f6dc9357SAndroid Build Coastguard Worker   return (AString)p;
37*f6dc9357SAndroid Build Coastguard Worker }
38*f6dc9357SAndroid Build Coastguard Worker 
PairToProp(const CUInt32PCharPair * pairs,unsigned num,UInt32 value,NCOM::CPropVariant & prop)39*f6dc9357SAndroid Build Coastguard Worker void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker   prop = TypePairToString(pairs, num, value);
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker 
44*f6dc9357SAndroid Build Coastguard Worker 
TypeToString(const char * const table[],unsigned num,UInt32 value)45*f6dc9357SAndroid Build Coastguard Worker AString TypeToString(const char * const table[], unsigned num, UInt32 value)
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   char sz[16];
48*f6dc9357SAndroid Build Coastguard Worker   const char *p = NULL;
49*f6dc9357SAndroid Build Coastguard Worker   if (value < num)
50*f6dc9357SAndroid Build Coastguard Worker     p = table[value];
51*f6dc9357SAndroid Build Coastguard Worker   if (!p)
52*f6dc9357SAndroid Build Coastguard Worker   {
53*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToString(value, sz);
54*f6dc9357SAndroid Build Coastguard Worker     p = sz;
55*f6dc9357SAndroid Build Coastguard Worker   }
56*f6dc9357SAndroid Build Coastguard Worker   return (AString)p;
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker 
TypeToProp(const char * const table[],unsigned num,UInt32 value,NWindows::NCOM::CPropVariant & prop)59*f6dc9357SAndroid Build Coastguard Worker void TypeToProp(const char * const table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop)
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker   char sz[16];
62*f6dc9357SAndroid Build Coastguard Worker   const char *p = NULL;
63*f6dc9357SAndroid Build Coastguard Worker   if (value < num)
64*f6dc9357SAndroid Build Coastguard Worker     p = table[value];
65*f6dc9357SAndroid Build Coastguard Worker   if (!p)
66*f6dc9357SAndroid Build Coastguard Worker   {
67*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToString(value, sz);
68*f6dc9357SAndroid Build Coastguard Worker     p = sz;
69*f6dc9357SAndroid Build Coastguard Worker   }
70*f6dc9357SAndroid Build Coastguard Worker   prop = p;
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker 
FlagsToString(const char * const * names,unsigned num,UInt32 flags)74*f6dc9357SAndroid Build Coastguard Worker AString FlagsToString(const char * const *names, unsigned num, UInt32 flags)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   AString s;
77*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < num; i++)
78*f6dc9357SAndroid Build Coastguard Worker   {
79*f6dc9357SAndroid Build Coastguard Worker     UInt32 flag = (UInt32)1 << i;
80*f6dc9357SAndroid Build Coastguard Worker     if ((flags & flag) != 0)
81*f6dc9357SAndroid Build Coastguard Worker     {
82*f6dc9357SAndroid Build Coastguard Worker       const char *name = names[i];
83*f6dc9357SAndroid Build Coastguard Worker       if (name && name[0] != 0)
84*f6dc9357SAndroid Build Coastguard Worker       {
85*f6dc9357SAndroid Build Coastguard Worker         s.Add_OptSpaced(name);
86*f6dc9357SAndroid Build Coastguard Worker         flags &= ~flag;
87*f6dc9357SAndroid Build Coastguard Worker       }
88*f6dc9357SAndroid Build Coastguard Worker     }
89*f6dc9357SAndroid Build Coastguard Worker   }
90*f6dc9357SAndroid Build Coastguard Worker   if (flags != 0)
91*f6dc9357SAndroid Build Coastguard Worker   {
92*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space_if_NotEmpty();
93*f6dc9357SAndroid Build Coastguard Worker     AddHex(s, flags);
94*f6dc9357SAndroid Build Coastguard Worker   }
95*f6dc9357SAndroid Build Coastguard Worker   return s;
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker 
FlagsToString(const CUInt32PCharPair * pairs,unsigned num,UInt32 flags)98*f6dc9357SAndroid Build Coastguard Worker AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker   AString s;
101*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < num; i++)
102*f6dc9357SAndroid Build Coastguard Worker   {
103*f6dc9357SAndroid Build Coastguard Worker     const CUInt32PCharPair &p = pairs[i];
104*f6dc9357SAndroid Build Coastguard Worker     UInt32 flag = (UInt32)1 << (unsigned)p.Value;
105*f6dc9357SAndroid Build Coastguard Worker     if ((flags & flag) != 0)
106*f6dc9357SAndroid Build Coastguard Worker     {
107*f6dc9357SAndroid Build Coastguard Worker       if (p.Name[0] != 0)
108*f6dc9357SAndroid Build Coastguard Worker         s.Add_OptSpaced(p.Name);
109*f6dc9357SAndroid Build Coastguard Worker     }
110*f6dc9357SAndroid Build Coastguard Worker     flags &= ~flag;
111*f6dc9357SAndroid Build Coastguard Worker   }
112*f6dc9357SAndroid Build Coastguard Worker   if (flags != 0)
113*f6dc9357SAndroid Build Coastguard Worker   {
114*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space_if_NotEmpty();
115*f6dc9357SAndroid Build Coastguard Worker     AddHex(s, flags);
116*f6dc9357SAndroid Build Coastguard Worker   }
117*f6dc9357SAndroid Build Coastguard Worker   return s;
118*f6dc9357SAndroid Build Coastguard Worker }
119*f6dc9357SAndroid Build Coastguard Worker 
FlagsToProp(const char * const * names,unsigned num,UInt32 flags,NCOM::CPropVariant & prop)120*f6dc9357SAndroid Build Coastguard Worker void FlagsToProp(const char * const *names, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker   prop = FlagsToString(names, num, flags);
123*f6dc9357SAndroid Build Coastguard Worker }
124*f6dc9357SAndroid Build Coastguard Worker 
FlagsToProp(const CUInt32PCharPair * pairs,unsigned num,UInt32 flags,NCOM::CPropVariant & prop)125*f6dc9357SAndroid Build Coastguard Worker void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker   prop = FlagsToString(pairs, num, flags);
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker 
Flags64ToString(const CUInt32PCharPair * pairs,unsigned num,UInt64 flags)131*f6dc9357SAndroid Build Coastguard Worker static AString Flags64ToString(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags)
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker   AString s;
134*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < num; i++)
135*f6dc9357SAndroid Build Coastguard Worker   {
136*f6dc9357SAndroid Build Coastguard Worker     const CUInt32PCharPair &p = pairs[i];
137*f6dc9357SAndroid Build Coastguard Worker     UInt64 flag = (UInt64)1 << (unsigned)p.Value;
138*f6dc9357SAndroid Build Coastguard Worker     if ((flags & flag) != 0)
139*f6dc9357SAndroid Build Coastguard Worker     {
140*f6dc9357SAndroid Build Coastguard Worker       if (p.Name[0] != 0)
141*f6dc9357SAndroid Build Coastguard Worker         s.Add_OptSpaced(p.Name);
142*f6dc9357SAndroid Build Coastguard Worker     }
143*f6dc9357SAndroid Build Coastguard Worker     flags &= ~flag;
144*f6dc9357SAndroid Build Coastguard Worker   }
145*f6dc9357SAndroid Build Coastguard Worker   if (flags != 0)
146*f6dc9357SAndroid Build Coastguard Worker   {
147*f6dc9357SAndroid Build Coastguard Worker     {
148*f6dc9357SAndroid Build Coastguard Worker       char sz[32];
149*f6dc9357SAndroid Build Coastguard Worker       sz[0] = '0';
150*f6dc9357SAndroid Build Coastguard Worker       sz[1] = 'x';
151*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt64ToHex(flags, sz + 2);
152*f6dc9357SAndroid Build Coastguard Worker       s.Add_OptSpaced(sz);
153*f6dc9357SAndroid Build Coastguard Worker     }
154*f6dc9357SAndroid Build Coastguard Worker   }
155*f6dc9357SAndroid Build Coastguard Worker   return s;
156*f6dc9357SAndroid Build Coastguard Worker }
157*f6dc9357SAndroid Build Coastguard Worker 
Flags64ToProp(const CUInt32PCharPair * pairs,unsigned num,UInt64 flags,NCOM::CPropVariant & prop)158*f6dc9357SAndroid Build Coastguard Worker void Flags64ToProp(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags, NCOM::CPropVariant &prop)
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker   prop = Flags64ToString(pairs, num, flags);
161*f6dc9357SAndroid Build Coastguard Worker }
162