LMMS
Loading...
Searching...
No Matches
juce_Variant.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
38
39//==============================================================================
41{
42 struct VoidTag {};
43 struct UndefinedTag {};
44 struct IntTag {};
45 struct Int64Tag {};
46 struct DoubleTag {};
47 struct BoolTag {};
48 struct StringTag {};
49 struct ObjectTag {};
50 struct ArrayTag {};
51 struct BinaryTag {};
52 struct MethodTag {};
53
54 // members =====================================================================
55 bool isVoid = false;
56 bool isUndefined = false;
57 bool isInt = false;
58 bool isInt64 = false;
59 bool isBool = false;
60 bool isDouble = false;
61 bool isString = false;
62 bool isObject = false;
63 bool isArray = false;
64 bool isBinary = false;
65 bool isMethod = false;
66 bool isComparable = false;
67
70 double (*toDouble) (const ValueUnion&) = defaultToDouble;
72 bool (*toBool) (const ValueUnion&) = defaultToBool;
74 Array<var>* (*toArray) (const ValueUnion&) = defaultToArray;
75 MemoryBlock* (*toBinary) (const ValueUnion&) = defaultToBinary;
76 var (*clone) (const var&) = defaultClone;
79
80 bool (*equals) (const ValueUnion&, const ValueUnion&, const VariantType&) = nullptr;
81 void (*writeToStream) (const ValueUnion&, OutputStream&) = nullptr;
82
83 // defaults ====================================================================
84 static int defaultToInt (const ValueUnion&) { return 0; }
85 static int64 defaultToInt64 (const ValueUnion&) { return 0; }
86 static double defaultToDouble (const ValueUnion&) { return 0; }
87 static String defaultToString (const ValueUnion&) { return {}; }
88 static bool defaultToBool (const ValueUnion&) { return false; }
89 static ReferenceCountedObject* defaultToObject (const ValueUnion&) { return nullptr; }
90 static Array<var>* defaultToArray (const ValueUnion&) { return nullptr; }
91 static MemoryBlock* defaultToBinary (const ValueUnion&) { return nullptr; }
92 static var defaultClone (const var& other) { return other; }
93 static void defaultCleanUp (ValueUnion&) {}
94 static void defaultCreateCopy (ValueUnion& dest, const ValueUnion& source) { dest = source; }
95
96 // void ========================================================================
97 static bool voidEquals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) noexcept
98 {
99 return otherType.isVoid || otherType.isUndefined;
100 }
101
102 static void voidWriteToStream (const ValueUnion&, OutputStream& output)
103 {
104 output.writeCompressedInt (0);
105 }
106
107 constexpr explicit VariantType (VoidTag) noexcept
108 : isVoid (true),
109 isComparable (true),
112
113 // undefined ===================================================================
114 static String undefinedToString (const ValueUnion&) { return "undefined"; }
115
116 static bool undefinedEquals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) noexcept
117 {
118 return otherType.isVoid || otherType.isUndefined;
119 }
120
121 static void undefinedWriteToStream (const ValueUnion&, OutputStream& output)
122 {
123 output.writeCompressedInt (1);
125 }
126
132
133 // int =========================================================================
134 static int intToInt (const ValueUnion& data) noexcept { return data.intValue; }
135 static int64 intToInt64 (const ValueUnion& data) noexcept { return (int64) data.intValue; }
136 static double intToDouble (const ValueUnion& data) noexcept { return (double) data.intValue; }
137 static String intToString (const ValueUnion& data) { return String (data.intValue); }
138 static bool intToBool (const ValueUnion& data) noexcept { return data.intValue != 0; }
139
140 static bool intEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
141 {
142 if (otherType.isDouble || otherType.isInt64 || otherType.isString)
143 return otherType.equals (otherData, data, VariantType { IntTag{} });
144
145 return otherType.toInt (otherData) == data.intValue;
146 }
147
148 static void intWriteToStream (const ValueUnion& data, OutputStream& output)
149 {
150 output.writeCompressedInt (5);
151 output.writeByte (varMarker_Int);
152 output.writeInt (data.intValue);
153 }
154
155 constexpr explicit VariantType (IntTag) noexcept
156 : isInt (true),
157 isComparable (true),
158 toInt (intToInt),
165
166 // int64 =======================================================================
167 static int int64ToInt (const ValueUnion& data) noexcept { return (int) data.int64Value; }
168 static int64 int64ToInt64 (const ValueUnion& data) noexcept { return data.int64Value; }
169 static double int64ToDouble (const ValueUnion& data) noexcept { return (double) data.int64Value; }
170 static String int64ToString (const ValueUnion& data) { return String (data.int64Value); }
171 static bool int64ToBool (const ValueUnion& data) noexcept { return data.int64Value != 0; }
172
173 static bool int64Equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
174 {
175 if (otherType.isDouble || otherType.isString)
176 return otherType.equals (otherData, data, VariantType { Int64Tag{} });
177
178 return otherType.toInt64 (otherData) == data.int64Value;
179 }
180
181 static void int64WriteToStream (const ValueUnion& data, OutputStream& output)
182 {
183 output.writeCompressedInt (9);
184 output.writeByte (varMarker_Int64);
185 output.writeInt64 (data.int64Value);
186 }
187
198
199 // double ======================================================================
200 static int doubleToInt (const ValueUnion& data) noexcept { return (int) data.doubleValue; }
201 static int64 doubleToInt64 (const ValueUnion& data) noexcept { return (int64) data.doubleValue; }
202 static double doubleToDouble (const ValueUnion& data) noexcept { return data.doubleValue; }
203 static String doubleToString (const ValueUnion& data) { return serialiseDouble (data.doubleValue); }
204 static bool doubleToBool (const ValueUnion& data) noexcept { return data.doubleValue != 0.0; }
205
206 static bool doubleEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
207 {
208 return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits<double>::epsilon();
209 }
210
211 static void doubleWriteToStream (const ValueUnion& data, OutputStream& output)
212 {
213 output.writeCompressedInt (9);
215 output.writeDouble (data.doubleValue);
216 }
217
228
229 // bool ========================================================================
230 static int boolToInt (const ValueUnion& data) noexcept { return data.boolValue ? 1 : 0; }
231 static int64 boolToInt64 (const ValueUnion& data) noexcept { return data.boolValue ? 1 : 0; }
232 static double boolToDouble (const ValueUnion& data) noexcept { return data.boolValue ? 1.0 : 0.0; }
233 static String boolToString (const ValueUnion& data) { return String::charToString (data.boolValue ? (juce_wchar) '1' : (juce_wchar) '0'); }
234 static bool boolToBool (const ValueUnion& data) noexcept { return data.boolValue; }
235
236 static bool boolEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
237 {
238 return otherType.toBool (otherData) == data.boolValue;
239 }
240
241 static void boolWriteToStream (const ValueUnion& data, OutputStream& output)
242 {
243 output.writeCompressedInt (1);
244 output.writeByte (data.boolValue ? (char) varMarker_BoolTrue : (char) varMarker_BoolFalse);
245 }
246
257
258 // string ======================================================================
259 static const String* getString (const ValueUnion& data) noexcept { return unalignedPointerCast<const String*> (data.stringValue); }
260 static String* getString ( ValueUnion& data) noexcept { return unalignedPointerCast<String*> (data.stringValue); }
261
262 static int stringToInt (const ValueUnion& data) noexcept { return getString (data)->getIntValue(); }
263 static int64 stringToInt64 (const ValueUnion& data) noexcept { return getString (data)->getLargeIntValue(); }
264 static double stringToDouble (const ValueUnion& data) noexcept { return getString (data)->getDoubleValue(); }
265 static String stringToString (const ValueUnion& data) { return *getString (data); }
266 static bool stringToBool (const ValueUnion& data) noexcept
267 {
268 return getString (data)->getIntValue() != 0
269 || getString (data)->trim().equalsIgnoreCase ("true")
270 || getString (data)->trim().equalsIgnoreCase ("yes");
271 }
272
273 static void stringCleanUp (ValueUnion& data) noexcept { getString (data)-> ~String(); }
274 static void stringCreateCopy (ValueUnion& dest, const ValueUnion& source) { new (dest.stringValue) String (*getString (source)); }
275
276 static bool stringEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
277 {
278 return otherType.toString (otherData) == *getString (data);
279 }
280
281 static void stringWriteToStream (const ValueUnion& data, OutputStream& output)
282 {
283 auto* s = getString (data);
284 const size_t len = s->getNumBytesAsUTF8() + 1;
285 HeapBlock<char> temp (len);
286 s->copyToUTF8 (temp, len);
287 output.writeCompressedInt ((int) (len + 1));
289 output.write (temp, len);
290 }
291
304
305 // object ======================================================================
307 {
308 return "Object 0x" + String::toHexString ((int) (pointer_sized_int) data.objectValue);
309 }
310
311 static bool objectToBool (const ValueUnion& data) noexcept { return data.objectValue != nullptr; }
312 static ReferenceCountedObject* objectToObject (const ValueUnion& data) noexcept { return data.objectValue; }
313
314 static var objectClone (const var& original)
315 {
316 if (auto* d = original.getDynamicObject())
317 return d->clone().get();
318
319 jassertfalse; // can only clone DynamicObjects!
320 return {};
321 }
322
323 static void objectCleanUp (ValueUnion& data) noexcept { if (data.objectValue != nullptr) data.objectValue->decReferenceCount(); }
324
325 static void objectCreateCopy (ValueUnion& dest, const ValueUnion& source)
326 {
327 dest.objectValue = source.objectValue;
328 if (dest.objectValue != nullptr)
330 }
331
332 static bool objectEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
333 {
334 return otherType.toObject (otherData) == data.objectValue;
335 }
336
337 static void objectWriteToStream (const ValueUnion&, OutputStream& output)
338 {
339 jassertfalse; // Can't write an object to a stream!
340 output.writeCompressedInt (0);
341 }
342
353
354 // array =======================================================================
355 static String arrayToString (const ValueUnion&) { return "[Array]"; }
356 static ReferenceCountedObject* arrayToObject (const ValueUnion&) noexcept { return nullptr; }
357
358 static Array<var>* arrayToArray (const ValueUnion& data) noexcept
359 {
360 if (auto* a = dynamic_cast<RefCountedArray*> (data.objectValue))
361 return &(a->array);
362
363 return nullptr;
364 }
365
366 static bool arrayEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
367 {
368 auto* thisArray = arrayToArray (data);
369 auto* otherArray = otherType.toArray (otherData);
370 return thisArray == otherArray || (thisArray != nullptr && otherArray != nullptr && *otherArray == *thisArray);
371 }
372
373 static var arrayClone (const var& original)
374 {
375 Array<var> arrayCopy;
376
377 if (auto* array = arrayToArray (original.value))
378 {
379 arrayCopy.ensureStorageAllocated (array->size());
380
381 for (auto& i : *array)
382 arrayCopy.add (i.clone());
383 }
384
385 return var (arrayCopy);
386 }
387
388 static void arrayWriteToStream (const ValueUnion& data, OutputStream& output)
389 {
390 if (auto* array = arrayToArray (data))
391 {
392 MemoryOutputStream buffer (512);
393 buffer.writeCompressedInt (array->size());
394
395 for (auto& i : *array)
396 i.writeToStream (buffer);
397
398 output.writeCompressedInt (1 + (int) buffer.getDataSize());
399 output.writeByte (varMarker_Array);
400 output << buffer;
401 }
402 }
403
410
423
424 // binary ======================================================================
425 static void binaryCleanUp (ValueUnion& data) noexcept { delete data.binaryValue; }
426 static void binaryCreateCopy (ValueUnion& dest, const ValueUnion& source) { dest.binaryValue = new MemoryBlock (*source.binaryValue); }
427
428 static String binaryToString (const ValueUnion& data) { return data.binaryValue->toBase64Encoding(); }
429 static MemoryBlock* binaryToBinary (const ValueUnion& data) noexcept { return data.binaryValue; }
430
431 static bool binaryEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
432 {
433 const MemoryBlock* const otherBlock = otherType.toBinary (otherData);
434 return otherBlock != nullptr && *otherBlock == *data.binaryValue;
435 }
436
437 static void binaryWriteToStream (const ValueUnion& data, OutputStream& output)
438 {
439 output.writeCompressedInt (1 + (int) data.binaryValue->getSize());
441 output << *data.binaryValue;
442 }
443
452
453 // method ======================================================================
454 static void methodCleanUp (ValueUnion& data) noexcept { if (data.methodValue != nullptr ) delete data.methodValue; }
455 static void methodCreateCopy (ValueUnion& dest, const ValueUnion& source) { dest.methodValue = new NativeFunction (*source.methodValue); }
456
457 static String methodToString (const ValueUnion&) { return "Method"; }
458 static bool methodToBool (const ValueUnion& data) noexcept { return data.methodValue != nullptr; }
459
460 static bool methodEquals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) noexcept
461 {
462 return otherType.isMethod && otherData.methodValue == data.methodValue;
463 }
464
465 static void methodWriteToStream (const ValueUnion&, OutputStream& output)
466 {
467 jassertfalse; // Can't write a method to a stream!
468 output.writeCompressedInt (0);
469 }
470
479};
480
495
507
508//==============================================================================
509var::var() noexcept : type (&Instance::attributesVoid) {}
511var::~var() noexcept { type->cleanUp (value); }
512
513//==============================================================================
514var::var (const var& valueToCopy) : type (valueToCopy.type)
515{
516 type->createCopy (value, valueToCopy.value);
517}
518
519var::var (const int v) noexcept : type (&Instance::attributesInt) { value.intValue = v; }
521var::var (const bool v) noexcept : type (&Instance::attributesBool) { value.boolValue = v; }
522var::var (const double v) noexcept : type (&Instance::attributesDouble) { value.doubleValue = v; }
524var::var (const Array<var>& v) : type (&Instance::attributesArray) { value.objectValue = new VariantType::RefCountedArray (v); }
525var::var (const String& v) : type (&Instance::attributesString) { new (value.stringValue) String (v); }
526var::var (const char* const v) : type (&Instance::attributesString) { new (value.stringValue) String (v); }
527var::var (const wchar_t* const v) : type (&Instance::attributesString) { new (value.stringValue) String (v); }
528var::var (const void* v, size_t sz) : type (&Instance::attributesBinary) { value.binaryValue = new MemoryBlock (v, sz); }
529var::var (const MemoryBlock& v) : type (&Instance::attributesBinary) { value.binaryValue = new MemoryBlock (v); }
530
531var::var (const StringArray& v) : type (&Instance::attributesArray)
532{
533 Array<var> strings;
534 strings.ensureStorageAllocated (v.size());
535
536 for (auto& i : v)
537 strings.add (var (i));
538
539 value.objectValue = new VariantType::RefCountedArray (strings);
540}
541
542var::var (ReferenceCountedObject* const object) : type (&Instance::attributesObject)
543{
544 value.objectValue = object;
545
546 if (object != nullptr)
547 object->incReferenceCount();
548}
549
551
552//==============================================================================
553bool var::isVoid() const noexcept { return type->isVoid; }
554bool var::isUndefined() const noexcept { return type->isUndefined; }
555bool var::isInt() const noexcept { return type->isInt; }
556bool var::isInt64() const noexcept { return type->isInt64; }
557bool var::isBool() const noexcept { return type->isBool; }
558bool var::isDouble() const noexcept { return type->isDouble; }
559bool var::isString() const noexcept { return type->isString; }
560bool var::isObject() const noexcept { return type->isObject; }
561bool var::isArray() const noexcept { return type->isArray; }
562bool var::isBinaryData() const noexcept { return type->isBinary; }
563bool var::isMethod() const noexcept { return type->isMethod; }
564
565var::operator int() const noexcept { return type->toInt (value); }
566var::operator int64() const noexcept { return type->toInt64 (value); }
567var::operator bool() const noexcept { return type->toBool (value); }
568var::operator float() const noexcept { return (float) type->toDouble (value); }
569var::operator double() const noexcept { return type->toDouble (value); }
570String var::toString() const { return type->toString (value); }
571var::operator String() const { return type->toString (value); }
576
577//==============================================================================
578void var::swapWith (var& other) noexcept
579{
580 std::swap (type, other.type);
581 std::swap (value, other.value);
582}
583
584var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; }
585var& var::operator= (const int v) { type->cleanUp (value); type = &Instance::attributesInt; value.intValue = v; return *this; }
586var& var::operator= (const int64 v) { type->cleanUp (value); type = &Instance::attributesInt64; value.int64Value = v; return *this; }
587var& var::operator= (const bool v) { type->cleanUp (value); type = &Instance::attributesBool; value.boolValue = v; return *this; }
588var& var::operator= (const double v) { type->cleanUp (value); type = &Instance::attributesDouble; value.doubleValue = v; return *this; }
589var& var::operator= (const char* const v) { type->cleanUp (value); type = &Instance::attributesString; new (value.stringValue) String (v); return *this; }
590var& var::operator= (const wchar_t* const v) { type->cleanUp (value); type = &Instance::attributesString; new (value.stringValue) String (v); return *this; }
591var& var::operator= (const String& v) { type->cleanUp (value); type = &Instance::attributesString; new (value.stringValue) String (v); return *this; }
592var& var::operator= (const MemoryBlock& v) { type->cleanUp (value); type = &Instance::attributesBinary; value.binaryValue = new MemoryBlock (v); return *this; }
593var& var::operator= (const Array<var>& v) { var v2 (v); swapWith (v2); return *this; }
594var& var::operator= (ReferenceCountedObject* v) { var v2 (v); swapWith (v2); return *this; }
595var& var::operator= (NativeFunction v) { var v2 (v); swapWith (v2); return *this; }
596
598 : type (other.type),
599 value (other.value)
600{
601 other.type = &Instance::attributesVoid;
602}
603
604var& var::operator= (var&& other) noexcept
605{
606 swapWith (other);
607 return *this;
608}
609
610var::var (String&& v) : type (&Instance::attributesString)
611{
612 new (value.stringValue) String (std::move (v));
613}
614
615var::var (MemoryBlock&& v) : type (&Instance::attributesBinary)
616{
617 value.binaryValue = new MemoryBlock (std::move (v));
618}
619
620var::var (Array<var>&& v) : type (&Instance::attributesArray)
621{
622 value.objectValue = new VariantType::RefCountedArray (std::move (v));
623}
624
625var& var::operator= (String&& v)
626{
627 type->cleanUp (value);
629 new (value.stringValue) String (std::move (v));
630 return *this;
631}
632
633//==============================================================================
634bool var::equals (const var& other) const noexcept
635{
636 return type->equals (value, other.value, *other.type);
637}
638
639bool var::equalsWithSameType (const var& other) const noexcept
640{
641 return hasSameTypeAs (other) && equals (other);
642}
643
644bool var::hasSameTypeAs (const var& other) const noexcept
645{
646 return type == other.type;
647}
648
649bool canCompare (const var& v1, const var& v2)
650{
651 return v1.type->isComparable && v2.type->isComparable;
652}
653
654static int compare (const var& v1, const var& v2)
655{
656 if (v1.isString() && v2.isString())
657 return v1.toString().compare (v2.toString());
658
659 auto diff = static_cast<double> (v1) - static_cast<double> (v2);
660 return diff == 0 ? 0 : (diff < 0 ? -1 : 1);
661}
662
663bool operator== (const var& v1, const var& v2) { return v1.equals (v2); }
664bool operator!= (const var& v1, const var& v2) { return ! v1.equals (v2); }
665bool operator< (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) < 0; }
666bool operator> (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) > 0; }
667bool operator<= (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) <= 0; }
668bool operator>= (const var& v1, const var& v2) { return canCompare (v1, v2) && compare (v1, v2) >= 0; }
669
670bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; }
671bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; }
672bool operator== (const var& v1, const char* v2) { return v1.toString() == v2; }
673bool operator!= (const var& v1, const char* v2) { return v1.toString() != v2; }
674
675//==============================================================================
677{
678 return type->clone (*this);
679}
680
681//==============================================================================
682const var& var::operator[] (const Identifier& propertyName) const
683{
684 if (auto* o = getDynamicObject())
685 return o->getProperty (propertyName);
686
687 return getNullVarRef();
688}
689
690const var& var::operator[] (const char* const propertyName) const
691{
692 return operator[] (Identifier (propertyName));
693}
694
695var var::getProperty (const Identifier& propertyName, const var& defaultReturnValue) const
696{
697 if (auto* o = getDynamicObject())
698 return o->getProperties().getWithDefault (propertyName, defaultReturnValue);
699
700 return defaultReturnValue;
701}
702
703bool var::hasProperty (const Identifier& propertyName) const noexcept
704{
705 if (auto* o = getDynamicObject())
706 return o->hasProperty (propertyName);
707
708 return false;
709}
710
712{
713 return isMethod() && (value.methodValue != nullptr) ? *value.methodValue : nullptr;
714}
715
716var var::invoke (const Identifier& method, const var* arguments, int numArguments) const
717{
718 if (auto* o = getDynamicObject())
719 return o->invokeMethod (method, var::NativeFunctionArgs (*this, arguments, numArguments));
720
721 return {};
722}
723
725{
726 return invoke (method, nullptr, 0);
727}
728
729var var::call (const Identifier& method, const var& arg1) const
730{
731 return invoke (method, &arg1, 1);
732}
733
734var var::call (const Identifier& method, const var& arg1, const var& arg2) const
735{
736 var args[] = { arg1, arg2 };
737 return invoke (method, args, 2);
738}
739
740var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3)
741{
742 var args[] = { arg1, arg2, arg3 };
743 return invoke (method, args, 3);
744}
745
746var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const
747{
748 var args[] = { arg1, arg2, arg3, arg4 };
749 return invoke (method, args, 4);
750}
751
752var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const
753{
754 var args[] = { arg1, arg2, arg3, arg4, arg5 };
755 return invoke (method, args, 5);
756}
757
758//==============================================================================
759int var::size() const
760{
761 if (auto array = getArray())
762 return array->size();
763
764 return 0;
765}
766
767const var& var::operator[] (int arrayIndex) const
768{
769 auto array = getArray();
770
771 // When using this method, the var must actually be an array, and the index
772 // must be in-range!
773 jassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size()));
774
775 return array->getReference (arrayIndex);
776}
777
778var& var::operator[] (int arrayIndex)
779{
780 auto array = getArray();
781
782 // When using this method, the var must actually be an array, and the index
783 // must be in-range!
784 jassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size()));
785
786 return array->getReference (arrayIndex);
787}
788
790{
791 if (auto array = getArray())
792 return array;
793
794 Array<var> tempVar;
795
796 if (! isVoid())
797 tempVar.add (*this);
798
799 *this = tempVar;
800 return getArray();
801}
802
803void var::append (const var& n)
804{
805 convertToArray()->add (n);
806}
807
808void var::remove (const int index)
809{
810 if (auto array = getArray())
811 array->remove (index);
812}
813
814void var::insert (const int index, const var& n)
815{
816 convertToArray()->insert (index, n);
817}
818
819void var::resize (const int numArrayElementsWanted)
820{
821 convertToArray()->resize (numArrayElementsWanted);
822}
823
824int var::indexOf (const var& n) const
825{
826 if (auto array = getArray())
827 return array->indexOf (n);
828
829 return -1;
830}
831
832//==============================================================================
834{
835 type->writeToStream (value, output);
836}
837
839{
840 const int numBytes = input.readCompressedInt();
841
842 if (numBytes > 0)
843 {
844 switch (input.readByte())
845 {
846 case varMarker_Int: return var (input.readInt());
847 case varMarker_Int64: return var (input.readInt64());
848 case varMarker_BoolTrue: return var (true);
849 case varMarker_BoolFalse: return var (false);
850 case varMarker_Double: return var (input.readDouble());
851
852 case varMarker_String:
853 {
855 mo.writeFromInputStream (input, numBytes - 1);
856 return var (mo.toUTF8());
857 }
858
859 case varMarker_Binary:
860 {
861 MemoryBlock mb ((size_t) numBytes - 1);
862
863 if (numBytes > 1)
864 {
865 const int numRead = input.read (mb.getData(), numBytes - 1);
866 mb.setSize ((size_t) numRead);
867 }
868
869 return var (mb);
870 }
871
872 case varMarker_Array:
873 {
874 var v;
875 auto* destArray = v.convertToArray();
876
877 for (int i = input.readCompressedInt(); --i >= 0;)
878 destArray->add (readFromStream (input));
879
880 return v;
881 }
882
883 default:
884 input.skipNextBytes (numBytes - 1); break;
885 }
886 }
887
888 return {};
889}
890
892 : thisObject (t), arguments (args), numArguments (numArgs)
893{
894}
895
896//==============================================================================
897#if JUCE_ALLOW_STATIC_NULL_VARIABLES
898
899JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")
901
902const var var::null;
903
906
907#endif
908
909} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
int64_t int64
Definition basics.h:91
static String charToString(water_uchar character)
Definition String.cpp:311
static String toHexString(int number)
Definition String.cpp:1830
Definition juce_Array.h:56
void ensureStorageAllocated(int minNumElements)
Definition juce_Array.h:1065
void add(const ElementType &newElement)
Definition juce_Array.h:418
Definition juce_DynamicObject.h:40
Definition juce_HeapBlock.h:87
Definition juce_Identifier.h:39
Definition juce_InputStream.h:37
virtual int64 readInt64()
Definition juce_InputStream.cpp:133
virtual int readCompressedInt()
Definition juce_InputStream.cpp:108
virtual void skipNextBytes(int64 numBytesToSkip)
Definition juce_InputStream.cpp:237
virtual int read(void *destBuffer, int maxBytesToRead)=0
virtual int readInt()
Definition juce_InputStream.cpp:88
virtual double readDouble()
Definition juce_InputStream.cpp:168
virtual char readByte()
Definition juce_InputStream.cpp:56
Definition juce_MemoryBlock.h:33
void * getData() noexcept
Definition juce_MemoryBlock.h:91
void setSize(const size_t newSize, bool initialiseNewSpaceToZero=false)
Definition juce_MemoryBlock.cpp:115
Definition juce_MemoryOutputStream.h:36
Definition juce_OutputStream.h:38
virtual bool writeDouble(double value)
Definition juce_OutputStream.cpp:169
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual bool writeCompressedInt(int value)
Definition juce_OutputStream.cpp:121
virtual bool writeByte(char byte)
Definition juce_OutputStream.cpp:83
virtual bool writeInt64(int64 value)
Definition juce_OutputStream.cpp:143
virtual bool writeInt(int value)
Definition juce_OutputStream.cpp:109
Definition juce_ReferenceCountedObject.h:66
void incReferenceCount() noexcept
Definition juce_ReferenceCountedObject.h:74
Definition juce_StringArray.h:35
Definition juce_String.h:53
int compare(const String &other) const noexcept
Definition juce_String.cpp:596
Definition juce_Variant.h:42
static var undefined() noexcept
Definition juce_Variant.cpp:550
bool isMethod() const noexcept
Definition juce_Variant.cpp:563
void insert(int index, const var &value)
Definition juce_Variant.cpp:814
DynamicObject * getDynamicObject() const noexcept
Definition juce_Variant.cpp:575
bool isString() const noexcept
Definition juce_Variant.cpp:559
int size() const
Definition juce_Variant.cpp:759
var invoke(const Identifier &method, const var *arguments, int numArguments) const
Definition juce_Variant.cpp:716
void writeToStream(OutputStream &output) const
Definition juce_Variant.cpp:833
Array< var > * convertToArray()
Definition juce_Variant.cpp:789
var() noexcept
Definition juce_Variant.cpp:509
~var() noexcept
Definition juce_Variant.cpp:511
ReferenceCountedObject * getObject() const noexcept
Definition juce_Variant.cpp:572
Array< var > * getArray() const noexcept
Definition juce_Variant.cpp:573
int indexOf(const var &value) const
Definition juce_Variant.cpp:824
std::function< var(const NativeFunctionArgs &)> NativeFunction
Definition juce_Variant.h:57
const VariantType * type
Definition juce_Variant.h:313
NativeFunction getNativeFunction() const
Definition juce_Variant.cpp:711
bool hasProperty(const Identifier &propertyName) const noexcept
Definition juce_Variant.cpp:703
bool isObject() const noexcept
Definition juce_Variant.cpp:560
static var readFromStream(InputStream &input)
Definition juce_Variant.cpp:838
void swapWith(var &other) noexcept
Definition juce_Variant.cpp:578
bool isVoid() const noexcept
Definition juce_Variant.cpp:553
bool isBinaryData() const noexcept
Definition juce_Variant.cpp:562
bool isInt64() const noexcept
Definition juce_Variant.cpp:556
String toString() const
Definition juce_Variant.cpp:570
void append(const var &valueToAppend)
Definition juce_Variant.cpp:803
bool isBool() const noexcept
Definition juce_Variant.cpp:557
bool equals(const var &other) const noexcept
Definition juce_Variant.cpp:634
bool equalsWithSameType(const var &other) const noexcept
Definition juce_Variant.cpp:639
void resize(int numArrayElementsWanted)
Definition juce_Variant.cpp:819
bool isDouble() const noexcept
Definition juce_Variant.cpp:558
bool isInt() const noexcept
Definition juce_Variant.cpp:555
bool isArray() const noexcept
Definition juce_Variant.cpp:561
var getProperty(const Identifier &propertyName, const var &defaultReturnValue) const
Definition juce_Variant.cpp:695
void remove(int index)
Definition juce_Variant.cpp:808
bool isUndefined() const noexcept
Definition juce_Variant.cpp:554
var call(const Identifier &method) const
Definition juce_Variant.cpp:724
friend bool canCompare(const var &, const var &)
Definition juce_Variant.cpp:649
bool hasSameTypeAs(const var &other) const noexcept
Definition juce_Variant.cpp:644
ValueUnion value
Definition juce_Variant.h:314
var clone() const noexcept
Definition juce_Variant.cpp:676
MemoryBlock * getBinaryData() const noexcept
Definition juce_Variant.cpp:574
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
unsigned v[N_MAX]
Definition inflate.c:1584
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static void v2(register WDL_FFT_REAL *a)
Definition fft.c:1099
static PuglViewHint int value
Definition pugl.h:1708
CARLA_PLUGIN_EXPORT int clone(int(*)(void *), void *, int, void *,...)
Definition interposer-safe.cpp:46
void * object
Definition jmemsys.h:50
JSAMPIMAGE data
Definition jpeglib.h:945
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
#define jassert(expression)
#define jassertfalse
Definition carla_juce.cpp:31
bool canCompare(const var &v1, const var &v2)
Definition juce_Variant.cpp:649
static const var & getNullVarRef() noexcept
Definition juce_NamedValueSet.cpp:128
Type unalignedPointerCast(void *ptr) noexcept
Definition juce_Memory.h:88
static String serialiseDouble(double input)
Definition juce_String.cpp:2260
long long int64
Definition juce_MathsFunctions.h:54
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
VariantStreamMarkers
Definition juce_Variant.cpp:27
@ varMarker_Int64
Definition juce_Variant.cpp:33
@ varMarker_Double
Definition juce_Variant.cpp:31
@ varMarker_BoolFalse
Definition juce_Variant.cpp:30
@ varMarker_Undefined
Definition juce_Variant.cpp:36
@ varMarker_BoolTrue
Definition juce_Variant.cpp:29
@ varMarker_String
Definition juce_Variant.cpp:32
@ varMarker_Binary
Definition juce_Variant.cpp:35
@ varMarker_Array
Definition juce_Variant.cpp:34
@ varMarker_Int
Definition juce_Variant.cpp:28
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
int pointer_sized_int
Definition juce_MathsFunctions.h:80
static int compare(const var &v1, const var &v2)
Definition juce_Variant.cpp:654
Definition juce_Uuid.h:141
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
Definition juce_Variant.cpp:482
static constexpr VariantType attributesString
Definition juce_Variant.cpp:491
static constexpr VariantType attributesInt64
Definition juce_Variant.cpp:486
static constexpr VariantType attributesVoid
Definition juce_Variant.cpp:483
static constexpr VariantType attributesMethod
Definition juce_Variant.cpp:489
static constexpr VariantType attributesArray
Definition juce_Variant.cpp:490
static constexpr VariantType attributesBinary
Definition juce_Variant.cpp:492
static constexpr VariantType attributesUndefined
Definition juce_Variant.cpp:484
static constexpr VariantType attributesDouble
Definition juce_Variant.cpp:488
static constexpr VariantType attributesBool
Definition juce_Variant.cpp:487
static constexpr VariantType attributesInt
Definition juce_Variant.cpp:485
static constexpr VariantType attributesObject
Definition juce_Variant.cpp:493
Definition juce_Variant.h:49
int numArguments
Definition juce_Variant.h:54
const var & thisObject
Definition juce_Variant.h:52
NativeFunctionArgs(const var &thisObject, const var *args, int numArgs) noexcept
Definition juce_Variant.cpp:891
const var * arguments
Definition juce_Variant.h:53
Definition juce_Variant.cpp:50
Definition juce_Variant.cpp:51
Definition juce_Variant.cpp:47
Definition juce_Variant.cpp:46
Definition juce_Variant.cpp:45
Definition juce_Variant.cpp:44
Definition juce_Variant.cpp:52
Definition juce_Variant.cpp:49
Definition juce_Variant.cpp:405
RefCountedArray(Array< var > &&a)
Definition juce_Variant.cpp:407
Array< var > array
Definition juce_Variant.cpp:408
RefCountedArray(const Array< var > &a)
Definition juce_Variant.cpp:406
Definition juce_Variant.cpp:48
Definition juce_Variant.cpp:43
Definition juce_Variant.cpp:42
Definition juce_Variant.cpp:41
static ReferenceCountedObject * arrayToObject(const ValueUnion &) noexcept
Definition juce_Variant.cpp:356
static bool doubleToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:204
static bool voidEquals(const ValueUnion &, const ValueUnion &, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:97
static void intWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:148
static void stringWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:281
static String binaryToString(const ValueUnion &data)
Definition juce_Variant.cpp:428
static bool binaryEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:431
static void binaryCleanUp(ValueUnion &data) noexcept
Definition juce_Variant.cpp:425
static const String * getString(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:259
static MemoryBlock * binaryToBinary(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:429
static String boolToString(const ValueUnion &data)
Definition juce_Variant.cpp:233
int64(* toInt64)(const ValueUnion &)=defaultToInt64
Definition juce_Variant.cpp:69
static double intToDouble(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:136
static void int64WriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:181
static String * getString(ValueUnion &data) noexcept
Definition juce_Variant.cpp:260
constexpr VariantType(ObjectTag) noexcept
Definition juce_Variant.cpp:343
static var objectClone(const var &original)
Definition juce_Variant.cpp:314
static void defaultCreateCopy(ValueUnion &dest, const ValueUnion &source)
Definition juce_Variant.cpp:94
constexpr VariantType(Int64Tag) noexcept
Definition juce_Variant.cpp:188
constexpr VariantType(StringTag) noexcept
Definition juce_Variant.cpp:292
static String intToString(const ValueUnion &data)
Definition juce_Variant.cpp:137
static double defaultToDouble(const ValueUnion &)
Definition juce_Variant.cpp:86
constexpr VariantType(DoubleTag) noexcept
Definition juce_Variant.cpp:218
static var defaultClone(const var &other)
Definition juce_Variant.cpp:92
static int int64ToInt(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:167
bool isInt64
Definition juce_Variant.cpp:58
constexpr VariantType(BinaryTag) noexcept
Definition juce_Variant.cpp:444
int(* toInt)(const ValueUnion &)=defaultToInt
Definition juce_Variant.cpp:68
bool isString
Definition juce_Variant.cpp:61
bool(* equals)(const ValueUnion &, const ValueUnion &, const VariantType &)
Definition juce_Variant.cpp:80
static Array< var > * arrayToArray(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:358
static int64 defaultToInt64(const ValueUnion &)
Definition juce_Variant.cpp:85
static int intToInt(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:134
static void boolWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:241
static void stringCleanUp(ValueUnion &data) noexcept
Definition juce_Variant.cpp:273
void(* cleanUp)(ValueUnion &)=defaultCleanUp
Definition juce_Variant.cpp:77
constexpr VariantType(UndefinedTag) noexcept
Definition juce_Variant.cpp:127
static void objectCleanUp(ValueUnion &data) noexcept
Definition juce_Variant.cpp:323
static String stringToString(const ValueUnion &data)
Definition juce_Variant.cpp:265
static bool intEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:140
void(* createCopy)(ValueUnion &, const ValueUnion &)=defaultCreateCopy
Definition juce_Variant.cpp:78
void(* writeToStream)(const ValueUnion &, OutputStream &)
Definition juce_Variant.cpp:81
double(* toDouble)(const ValueUnion &)=defaultToDouble
Definition juce_Variant.cpp:70
bool isArray
Definition juce_Variant.cpp:63
static void methodWriteToStream(const ValueUnion &, OutputStream &output)
Definition juce_Variant.cpp:465
static double doubleToDouble(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:202
bool isVoid
Definition juce_Variant.cpp:55
static void stringCreateCopy(ValueUnion &dest, const ValueUnion &source)
Definition juce_Variant.cpp:274
static String doubleToString(const ValueUnion &data)
Definition juce_Variant.cpp:203
static bool stringToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:266
bool isUndefined
Definition juce_Variant.cpp:56
static double stringToDouble(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:264
static String objectToString(const ValueUnion &data)
Definition juce_Variant.cpp:306
static int64 intToInt64(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:135
static int doubleToInt(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:200
static void undefinedWriteToStream(const ValueUnion &, OutputStream &output)
Definition juce_Variant.cpp:121
bool isInt
Definition juce_Variant.cpp:57
bool(* toBool)(const ValueUnion &)=defaultToBool
Definition juce_Variant.cpp:72
static bool intToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:138
bool isComparable
Definition juce_Variant.cpp:66
static int64 boolToInt64(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:231
static bool objectEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:332
static ReferenceCountedObject * defaultToObject(const ValueUnion &)
Definition juce_Variant.cpp:89
constexpr VariantType(BoolTag) noexcept
Definition juce_Variant.cpp:247
static void arrayWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:388
constexpr VariantType(VoidTag) noexcept
Definition juce_Variant.cpp:107
static String int64ToString(const ValueUnion &data)
Definition juce_Variant.cpp:170
static Array< var > * defaultToArray(const ValueUnion &)
Definition juce_Variant.cpp:90
static String undefinedToString(const ValueUnion &)
Definition juce_Variant.cpp:114
static void binaryWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:437
static String defaultToString(const ValueUnion &)
Definition juce_Variant.cpp:87
static void objectCreateCopy(ValueUnion &dest, const ValueUnion &source)
Definition juce_Variant.cpp:325
static bool methodEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:460
static bool undefinedEquals(const ValueUnion &, const ValueUnion &, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:116
static void binaryCreateCopy(ValueUnion &dest, const ValueUnion &source)
Definition juce_Variant.cpp:426
constexpr VariantType(IntTag) noexcept
Definition juce_Variant.cpp:155
static int64 int64ToInt64(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:168
static bool methodToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:458
static bool objectToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:311
static bool int64ToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:171
static int boolToInt(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:230
MemoryBlock *(* toBinary)(const ValueUnion &)=defaultToBinary
Definition juce_Variant.cpp:75
String(* toString)(const ValueUnion &)=defaultToString
Definition juce_Variant.cpp:71
static bool boolToBool(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:234
static double int64ToDouble(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:169
static int defaultToInt(const ValueUnion &)
Definition juce_Variant.cpp:84
static void voidWriteToStream(const ValueUnion &, OutputStream &output)
Definition juce_Variant.cpp:102
Array< var > *(* toArray)(const ValueUnion &)=defaultToArray
Definition juce_Variant.cpp:74
constexpr VariantType(ArrayTag) noexcept
Definition juce_Variant.cpp:411
static String arrayToString(const ValueUnion &)
Definition juce_Variant.cpp:355
static var arrayClone(const var &original)
Definition juce_Variant.cpp:373
bool isBool
Definition juce_Variant.cpp:59
static void methodCreateCopy(ValueUnion &dest, const ValueUnion &source)
Definition juce_Variant.cpp:455
static ReferenceCountedObject * objectToObject(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:312
static bool doubleEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:206
static bool arrayEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:366
bool isBinary
Definition juce_Variant.cpp:64
static int64 doubleToInt64(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:201
static int stringToInt(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:262
static MemoryBlock * defaultToBinary(const ValueUnion &)
Definition juce_Variant.cpp:91
static double boolToDouble(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:232
static bool int64Equals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:173
bool isMethod
Definition juce_Variant.cpp:65
static int64 stringToInt64(const ValueUnion &data) noexcept
Definition juce_Variant.cpp:263
static void methodCleanUp(ValueUnion &data) noexcept
Definition juce_Variant.cpp:454
ReferenceCountedObject *(* toObject)(const ValueUnion &)=defaultToObject
Definition juce_Variant.cpp:73
static void defaultCleanUp(ValueUnion &)
Definition juce_Variant.cpp:93
static bool stringEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:276
var(* clone)(const var &)=defaultClone
Definition juce_Variant.cpp:76
static bool boolEquals(const ValueUnion &data, const ValueUnion &otherData, const VariantType &otherType) noexcept
Definition juce_Variant.cpp:236
static void doubleWriteToStream(const ValueUnion &data, OutputStream &output)
Definition juce_Variant.cpp:211
bool isDouble
Definition juce_Variant.cpp:60
bool isObject
Definition juce_Variant.cpp:62
static void objectWriteToStream(const ValueUnion &, OutputStream &output)
Definition juce_Variant.cpp:337
static String methodToString(const ValueUnion &)
Definition juce_Variant.cpp:457
static bool defaultToBool(const ValueUnion &)
Definition juce_Variant.cpp:88
constexpr VariantType(MethodTag) noexcept
Definition juce_Variant.cpp:471
Definition juce_Variant.h:300
MemoryBlock * binaryValue
Definition juce_Variant.h:307
char stringValue[sizeof(String)]
Definition juce_Variant.h:305
NativeFunction * methodValue
Definition juce_Variant.h:308
ReferenceCountedObject * objectValue
Definition juce_Variant.h:306
int n
Definition crypt.c:458
for(n=0;n< RAND_HEAD_LEN;n++)
Definition crypt.c:467
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
static ZCONST char Far * method[NUM_METHODS]
Definition zipinfo.c:1008
mo
Definition zipinfo.c:2287
#define const
Definition zconf.h:137