LMMS
Loading...
Searching...
No Matches
juce_KnownPluginList.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 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
31
33{
35
36 if (! types.isEmpty())
37 {
38 types.clear();
40 }
41}
42
44{
46 return types.size();
47}
48
54
56{
58
59 for (auto& d : getTypes())
60 if (d.pluginFormatName == format.getName())
61 result.add (d);
62
63 return result;
64}
65
66std::unique_ptr<PluginDescription> KnownPluginList::getTypeForFile (const String& fileOrIdentifier) const
67{
69
70 for (auto& desc : types)
71 if (desc.fileOrIdentifier == fileOrIdentifier)
72 return std::make_unique<PluginDescription> (desc);
73
74 return {};
75}
76
77std::unique_ptr<PluginDescription> KnownPluginList::getTypeForIdentifierString (const String& identifierString) const
78{
80
81 for (auto& desc : types)
82 if (desc.matchesIdentifierString (identifierString))
83 return std::make_unique<PluginDescription> (desc);
84
85 return {};
86}
87
89{
90 {
92
93 for (auto& desc : types)
94 {
95 if (desc.isDuplicateOf (type))
96 {
97 // strange - found a duplicate plugin with different info..
98 jassert (desc.name == type.name);
99 jassert (desc.isInstrument == type.isInstrument);
100
101 desc = type;
102 return false;
103 }
104 }
105
106 types.insert (0, type);
107 }
108
110 return true;
111}
112
114{
115 {
117
118 for (int i = types.size(); --i >= 0;)
119 if (types.getUnchecked (i).isDuplicateOf (type))
120 types.remove (i);
121 }
122
124}
125
126bool KnownPluginList::isListingUpToDate (const String& fileOrIdentifier,
127 AudioPluginFormat& formatToUse) const
128{
129 if (getTypeForFile (fileOrIdentifier) == nullptr)
130 return false;
131
133
134 for (auto& d : types)
135 if (d.fileOrIdentifier == fileOrIdentifier && formatToUse.pluginNeedsRescanning (d))
136 return false;
137
138 return true;
139}
140
141void KnownPluginList::setCustomScanner (std::unique_ptr<CustomScanner> newScanner)
142{
143 if (scanner != newScanner)
144 scanner = std::move (newScanner);
145}
146
147bool KnownPluginList::scanAndAddFile (const String& fileOrIdentifier,
148 const bool dontRescanIfAlreadyInList,
151{
152 const ScopedLock sl (scanLock);
153
154 if (dontRescanIfAlreadyInList
155 && getTypeForFile (fileOrIdentifier) != nullptr)
156 {
157 bool needsRescanning = false;
158
160
161 for (auto& d : types)
162 {
163 if (d.fileOrIdentifier == fileOrIdentifier && d.pluginFormatName == format.getName())
164 {
165 if (format.pluginNeedsRescanning (d))
166 needsRescanning = true;
167 else
168 typesFound.add (new PluginDescription (d));
169 }
170 }
171
172 if (! needsRescanning)
173 return false;
174 }
175
176 if (blacklist.contains (fileOrIdentifier))
177 return false;
178
180
181 {
182 const ScopedUnlock sl2 (scanLock);
183
184 if (scanner != nullptr)
185 {
186 if (! scanner->findPluginTypesFor (format, found, fileOrIdentifier))
187 addToBlacklist (fileOrIdentifier);
188 }
189 else
190 {
191 format.findAllTypesForFile (found, fileOrIdentifier);
192 }
193 }
194
195 for (auto* desc : found)
196 {
197 if (desc == nullptr)
198 {
200 continue;
201 }
202
203 addType (*desc);
204 typesFound.add (new PluginDescription (*desc));
205 }
206
207 return ! found.isEmpty();
208}
209
211 const StringArray& files,
213{
214 for (const auto& filenameOrID : files)
215 {
216 bool found = false;
217
218 for (auto format : formatManager.getFormats())
219 {
220 if (format->fileMightContainThisPluginType (filenameOrID)
221 && scanAndAddFile (filenameOrID, true, typesFound, *format))
222 {
223 found = true;
224 break;
225 }
226 }
227
228 if (! found)
229 {
230 File f (filenameOrID);
231
232 if (f.isDirectory())
233 {
235
236 for (auto& subFile : f.findChildFiles (File::findFilesAndDirectories, false))
237 s.add (subFile.getFullPathName());
238
239 scanAndAddDragAndDroppedFiles (formatManager, s, typesFound);
240 }
241 }
242 }
243
244 scanFinished();
245}
246
248{
249 if (scanner != nullptr)
250 scanner->scanFinished();
251}
252
254{
255 return blacklist;
256}
257
259{
260 if (! blacklist.contains (pluginID))
261 {
262 blacklist.add (pluginID);
264 }
265}
266
268{
269 const int index = blacklist.indexOf (pluginID);
270
271 if (index >= 0)
272 {
273 blacklist.remove (index);
275 }
276}
277
279{
280 if (blacklist.size() > 0)
281 {
282 blacklist.clear();
284 }
285}
286
287//==============================================================================
289{
291 : method (sortMethod), direction (forwards ? 1 : -1) {}
292
293 bool operator() (const PluginDescription& first, const PluginDescription& second) const
294 {
295 int diff = 0;
296
297 switch (method)
298 {
299 case KnownPluginList::sortByCategory: diff = first.category.compareNatural (second.category, false); break;
300 case KnownPluginList::sortByManufacturer: diff = first.manufacturerName.compareNatural (second.manufacturerName, false); break;
301 case KnownPluginList::sortByFormat: diff = first.pluginFormatName.compare (second.pluginFormatName); break;
302 case KnownPluginList::sortByFileSystemLocation: diff = lastPathPart (first.fileOrIdentifier).compare (lastPathPart (second.fileOrIdentifier)); break;
303 case KnownPluginList::sortByInfoUpdateTime: diff = compare (first.lastInfoUpdateTime, second.lastInfoUpdateTime); break;
306 default: break;
307 }
308
309 if (diff == 0)
310 diff = first.name.compareNatural (second.name, false);
311
312 return diff * direction < 0;
313 }
314
315private:
316 static String lastPathPart (const String& path)
317 {
318 return path.replaceCharacter ('\\', '/').upToLastOccurrenceOf ("/", false, false);
319 }
320
321 static int compare (Time a, Time b) noexcept
322 {
323 if (a < b) return -1;
324 if (b < a) return 1;
325
326 return 0;
327 }
328
331};
332
333void KnownPluginList::sort (const SortMethod method, bool forwards)
334{
335 if (method != defaultOrder)
336 {
337 Array<PluginDescription> oldOrder, newOrder;
338
339 {
341
342 oldOrder.addArray (types);
343 std::stable_sort (types.begin(), types.end(), PluginSorter (method, forwards));
344 newOrder.addArray (types);
345 }
346
347 auto hasOrderChanged = [&]
348 {
349 for (int i = 0; i < oldOrder.size(); ++i)
350 if (! oldOrder[i].isDuplicateOf (newOrder[i]))
351 return true;
352
353 return false;
354 }();
355
356 if (hasOrderChanged)
358 }
359}
360
361//==============================================================================
362std::unique_ptr<XmlElement> KnownPluginList::createXml() const
363{
364 auto e = std::make_unique<XmlElement> ("KNOWNPLUGINS");
365
366 {
368
369 for (int i = types.size(); --i >= 0;)
370 e->prependChildElement (types.getUnchecked (i).createXml().release());
371 }
372
373 for (auto& b : blacklist)
374 e->createNewChildElement ("BLACKLISTED")->setAttribute ("id", b);
375
376 return e;
377}
378
380{
381 clear();
383
384 if (xml.hasTagName ("KNOWNPLUGINS"))
385 {
386 for (auto* e : xml.getChildIterator())
387 {
389
390 if (e->hasTagName ("BLACKLISTED"))
391 blacklist.add (e->getStringAttribute ("id"));
392 else if (info.loadFromXml (*e))
393 addType (info);
394 }
395 }
396}
397
398//==============================================================================
400{
401 enum { menuIdBase = 0x324503f4 };
402
404 {
405 for (auto& pd : allPlugins)
406 {
407 auto path = pd.fileOrIdentifier.replaceCharacter ('\\', '/')
408 .upToLastOccurrenceOf ("/", false, false);
409
410 if (path.substring (1, 2) == ":")
411 path = path.substring (2);
412
413 addPlugin (tree, pd, path);
414 }
415
416 optimiseFolders (tree, false);
417 }
418
419 static void optimiseFolders (KnownPluginList::PluginTree& tree, bool concatenateName)
420 {
421 for (int i = tree.subFolders.size(); --i >= 0;)
422 {
423 auto& sub = *tree.subFolders.getUnchecked(i);
424 optimiseFolders (sub, concatenateName || (tree.subFolders.size() > 1));
425
426 if (sub.plugins.isEmpty())
427 {
428 for (auto* s : sub.subFolders)
429 {
430 if (concatenateName)
431 s->folder = sub.folder + "/" + s->folder;
432
433 tree.subFolders.add (s);
434 }
435
436 sub.subFolders.clear (false);
437 tree.subFolders.remove (i);
438 }
439 }
440 }
441
443 const Array<PluginDescription>& sorted,
444 const KnownPluginList::SortMethod sortMethod)
445 {
446 String lastType;
447 auto current = std::make_unique<KnownPluginList::PluginTree>();
448
449 for (auto& pd : sorted)
450 {
451 auto thisType = (sortMethod == KnownPluginList::sortByCategory ? pd.category
452 : pd.manufacturerName);
453
454 if (! thisType.containsNonWhitespaceChars())
455 thisType = "Other";
456
457 if (! thisType.equalsIgnoreCase (lastType))
458 {
459 if (current->plugins.size() + current->subFolders.size() > 0)
460 {
461 current->folder = lastType;
462 tree.subFolders.add (std::move (current));
463 current = std::make_unique<KnownPluginList::PluginTree>();
464 }
465
466 lastType = thisType;
467 }
468
469 current->plugins.add (pd);
470 }
471
472 if (current->plugins.size() + current->subFolders.size() > 0)
473 {
474 current->folder = lastType;
475 tree.subFolders.add (std::move (current));
476 }
477 }
478
480 {
481 #if JUCE_MAC
482 if (path.containsChar (':'))
483 path = path.fromFirstOccurrenceOf (":", false, false); // avoid the special AU formatting nonsense on Mac..
484 #endif
485
486 if (path.isEmpty())
487 {
488 tree.plugins.add (pd);
489 }
490 else
491 {
492 auto firstSubFolder = path.upToFirstOccurrenceOf ("/", false, false);
493 auto remainingPath = path.fromFirstOccurrenceOf ("/", false, false);
494
495 for (int i = tree.subFolders.size(); --i >= 0;)
496 {
497 auto& subFolder = *tree.subFolders.getUnchecked (i);
498
499 if (subFolder.folder.equalsIgnoreCase (firstSubFolder))
500 {
501 addPlugin (subFolder, pd, remainingPath);
502 return;
503 }
504 }
505
506 auto* newFolder = new KnownPluginList::PluginTree();
507 newFolder->folder = firstSubFolder;
508 tree.subFolders.add (newFolder);
509 addPlugin (*newFolder, pd, remainingPath);
510 }
511 }
512
513 static bool containsDuplicateNames (const Array<PluginDescription>& plugins, const String& name)
514 {
515 int matches = 0;
516
517 for (auto& p : plugins)
518 if (p.name == name && ++matches > 1)
519 return true;
520
521 return false;
522 }
523
525 const Array<PluginDescription>& allPlugins,
526 const String& currentlyTickedPluginID)
527 {
528 bool isTicked = false;
529
530 for (auto* sub : tree.subFolders)
531 {
532 PopupMenu subMenu;
533 auto isItemTicked = addToMenu (*sub, subMenu, allPlugins, currentlyTickedPluginID);
534 isTicked = isTicked || isItemTicked;
535
536 m.addSubMenu (sub->folder, subMenu, true, nullptr, isItemTicked, 0);
537 }
538
539 auto getPluginMenuIndex = [&] (const PluginDescription& d)
540 {
541 int i = 0;
542
543 for (auto& p : allPlugins)
544 {
545 if (p.isDuplicateOf (d))
546 return i + menuIdBase;
547
548 ++i;
549 }
550
551 return 0;
552 };
553
554 for (auto& plugin : tree.plugins)
555 {
556 auto name = plugin.name;
557
558 if (containsDuplicateNames (tree.plugins, name))
559 name << " (" << plugin.pluginFormatName << ')';
560
561 auto isItemTicked = plugin.matchesIdentifierString (currentlyTickedPluginID);
562 isTicked = isTicked || isItemTicked;
563
564 m.addItem (getPluginMenuIndex (plugin), name, true, isItemTicked);
565 }
566
567 return isTicked;
568 }
569};
570
571std::unique_ptr<KnownPluginList::PluginTree> KnownPluginList::createTree (const Array<PluginDescription>& types, SortMethod sortMethod)
572{
574 sorted.addArray (types);
575
576 std::stable_sort (sorted.begin(), sorted.end(), PluginSorter (sortMethod, true));
577
578 auto tree = std::make_unique<PluginTree>();
579
580 if (sortMethod == sortByCategory || sortMethod == sortByManufacturer || sortMethod == sortByFormat)
581 {
582 PluginTreeUtils::buildTreeByCategory (*tree, sorted, sortMethod);
583 }
584 else if (sortMethod == sortByFileSystemLocation)
585 {
587 }
588 else
589 {
590 for (auto& p : sorted)
591 tree->plugins.add (p);
592 }
593
594 return tree;
595}
596
597//==============================================================================
599 const String& currentlyTickedPluginID)
600{
601 auto tree = createTree (types, sortMethod);
602 PluginTreeUtils::addToMenu (*tree, menu, types, currentlyTickedPluginID);
603}
604
606{
607 auto i = menuResultCode - PluginTreeUtils::menuIdBase;
608 return isPositiveAndBelow (i, types.size()) ? i : -1;
609}
610
611//==============================================================================
614
616
618{
620 return job->shouldExit();
621
622 return false;
623}
624
625//==============================================================================
626void KnownPluginList::addToMenu (PopupMenu& menu, SortMethod sortMethod, const String& currentlyTickedPluginID) const
627{
628 addToMenu (menu, getTypes(), sortMethod, currentlyTickedPluginID);
629}
630
631int KnownPluginList::getIndexChosenByMenu (int menuResultCode) const
632{
633 return getIndexChosenByMenu (getTypes(), menuResultCode);
634}
635
636std::unique_ptr<KnownPluginList::PluginTree> KnownPluginList::createTree (const SortMethod sortMethod) const
637{
638 return createTree (getTypes(), sortMethod);
639}
640
641
642} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition juce_Array.h:56
void addArray(const Type *elementsToAdd, int numElementsToAdd)
Definition juce_Array.h:583
int size() const noexcept
Definition juce_Array.h:215
ElementType * begin() noexcept
Definition juce_Array.h:328
ElementType * end() noexcept
Definition juce_Array.h:344
Definition juce_AudioPluginFormat.h:38
virtual bool pluginNeedsRescanning(const PluginDescription &)=0
Definition juce_AudioPluginFormatManager.h:38
Array< AudioPluginFormat * > getFormats() const
Definition juce_AudioPluginFormatManager.cpp:117
void sendChangeMessage()
Definition juce_ChangeBroadcaster.cpp:65
Definition juce_File.h:45
@ findFilesAndDirectories
Definition juce_File.h:561
bool shouldExit() const noexcept
Definition juce_KnownPluginList.cpp:617
CustomScanner()
Definition juce_KnownPluginList.cpp:612
virtual void scanFinished()
Definition juce_KnownPluginList.cpp:615
virtual ~CustomScanner()
Definition juce_KnownPluginList.cpp:613
bool isListingUpToDate(const String &possiblePluginFileOrIdentifier, AudioPluginFormat &formatToUse) const
Definition juce_KnownPluginList.cpp:126
void clearBlacklistedFiles()
Definition juce_KnownPluginList.cpp:278
std::unique_ptr< PluginDescription > getTypeForIdentifierString(const String &identifierString) const
Definition juce_KnownPluginList.cpp:77
void recreateFromXml(const XmlElement &xml)
Definition juce_KnownPluginList.cpp:379
SortMethod
Definition juce_KnownPluginList.h:129
@ sortByFormat
Definition juce_KnownPluginList.h:134
@ defaultOrder
Definition juce_KnownPluginList.h:130
@ sortAlphabetically
Definition juce_KnownPluginList.h:131
@ sortByFileSystemLocation
Definition juce_KnownPluginList.h:135
@ sortByManufacturer
Definition juce_KnownPluginList.h:133
@ sortByCategory
Definition juce_KnownPluginList.h:132
@ sortByInfoUpdateTime
Definition juce_KnownPluginList.h:136
void sort(SortMethod method, bool forwards)
Definition juce_KnownPluginList.cpp:333
CriticalSection scanLock
Definition juce_KnownPluginList.h:235
void clear()
Definition juce_KnownPluginList.cpp:32
int getNumTypes() const noexcept
Definition juce_KnownPluginList.cpp:43
bool scanAndAddFile(const String &possiblePluginFileOrIdentifier, bool dontRescanIfAlreadyInList, OwnedArray< PluginDescription > &typesFound, AudioPluginFormat &formatToUse)
Definition juce_KnownPluginList.cpp:147
std::unique_ptr< PluginDescription > getTypeForFile(const String &fileOrIdentifier) const
Definition juce_KnownPluginList.cpp:66
std::unique_ptr< XmlElement > createXml() const
Definition juce_KnownPluginList.cpp:362
void removeType(const PluginDescription &type)
Definition juce_KnownPluginList.cpp:113
const StringArray & getBlacklistedFiles() const
Definition juce_KnownPluginList.cpp:253
void removeFromBlacklist(const String &pluginID)
Definition juce_KnownPluginList.cpp:267
std::unique_ptr< CustomScanner > scanner
Definition juce_KnownPluginList.h:234
CriticalSection typesArrayLock
Definition juce_KnownPluginList.h:235
void scanAndAddDragAndDroppedFiles(AudioPluginFormatManager &formatManager, const StringArray &filenames, OwnedArray< PluginDescription > &typesFound)
Definition juce_KnownPluginList.cpp:210
Array< PluginDescription > getTypesForFormat(AudioPluginFormat &) const
Definition juce_KnownPluginList.cpp:55
void scanFinished()
Definition juce_KnownPluginList.cpp:247
static int getIndexChosenByMenu(const Array< PluginDescription > &types, int menuResultCode)
Definition juce_KnownPluginList.cpp:605
static void addToMenu(PopupMenu &menu, const Array< PluginDescription > &types, SortMethod sortMethod, const String &currentlyTickedPluginID={})
Definition juce_KnownPluginList.cpp:598
void addToBlacklist(const String &pluginID)
Definition juce_KnownPluginList.cpp:258
KnownPluginList()
Definition juce_KnownPluginList.cpp:29
static std::unique_ptr< PluginTree > createTree(const Array< PluginDescription > &types, SortMethod sortMethod)
Definition juce_KnownPluginList.cpp:571
bool addType(const PluginDescription &type)
Definition juce_KnownPluginList.cpp:88
Array< PluginDescription > getTypes() const
Definition juce_KnownPluginList.cpp:49
Array< PluginDescription > types
Definition juce_KnownPluginList.h:232
StringArray blacklist
Definition juce_KnownPluginList.h:233
void setCustomScanner(std::unique_ptr< CustomScanner > newScanner)
Definition juce_KnownPluginList.cpp:141
~KnownPluginList() override
Definition juce_KnownPluginList.cpp:30
Definition juce_OwnedArray.h:51
bool isEmpty() const noexcept
Definition juce_OwnedArray.h:136
ObjectClass * add(ObjectClass *newObject)
Definition juce_OwnedArray.h:294
Definition juce_PluginDescription.h:43
Definition juce_PopupMenu.h:80
Definition juce_StringArray.h:35
Definition juce_String.h:53
String upToFirstOccurrenceOf(StringRef substringToEndWith, bool includeSubStringInResult, bool ignoreCase) const
Definition juce_String.cpp:1585
bool isEmpty() const noexcept
Definition juce_String.h:310
bool containsChar(juce_wchar character) const noexcept
Definition juce_String.cpp:1040
String upToLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Definition juce_String.cpp:1595
String replaceCharacter(juce_wchar characterToReplace, juce_wchar characterToInsertInstead) const
Definition juce_String.cpp:1344
String fromFirstOccurrenceOf(StringRef substringToStartFrom, bool includeSubStringInResult, bool ignoreCase) const
Definition juce_String.cpp:1565
static ThreadPoolJob * getCurrentThreadPoolJob()
Definition juce_ThreadPool.cpp:84
Definition juce_Time.h:37
Definition juce_XmlElement.h:83
bool hasTagName(StringRef possibleTagName) const noexcept
Definition juce_XmlElement.cpp:470
Iterator< GetNextElement > getChildIterator() const
Definition juce_XmlElement.h:715
* e
Definition inflate.c:1404
unsigned * m
Definition inflate.c:1559
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static const char * name
Definition pugl.h:1582
struct backing_store_struct * info
Definition jmemsys.h:183
#define jassert(expression)
#define jassertfalse
static char ** files
Definition misc.c:28
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
CriticalSection::ScopedUnlockType ScopedUnlock
Definition juce_CriticalSection.h:226
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
@ tree
Definition juce_AccessibilityRole.h:58
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
Definition juce_KnownPluginList.h:172
Definition juce_KnownPluginList.cpp:289
static String lastPathPart(const String &path)
Definition juce_KnownPluginList.cpp:316
int direction
Definition juce_KnownPluginList.cpp:330
PluginSorter(KnownPluginList::SortMethod sortMethod, bool forwards) noexcept
Definition juce_KnownPluginList.cpp:290
static int compare(Time a, Time b) noexcept
Definition juce_KnownPluginList.cpp:321
KnownPluginList::SortMethod method
Definition juce_KnownPluginList.cpp:329
Definition juce_KnownPluginList.cpp:400
@ menuIdBase
Definition juce_KnownPluginList.cpp:401
static bool containsDuplicateNames(const Array< PluginDescription > &plugins, const String &name)
Definition juce_KnownPluginList.cpp:513
static void buildTreeByCategory(KnownPluginList::PluginTree &tree, const Array< PluginDescription > &sorted, const KnownPluginList::SortMethod sortMethod)
Definition juce_KnownPluginList.cpp:442
static void buildTreeByFolder(KnownPluginList::PluginTree &tree, const Array< PluginDescription > &allPlugins)
Definition juce_KnownPluginList.cpp:403
static bool addToMenu(const KnownPluginList::PluginTree &tree, PopupMenu &m, const Array< PluginDescription > &allPlugins, const String &currentlyTickedPluginID)
Definition juce_KnownPluginList.cpp:524
static void optimiseFolders(KnownPluginList::PluginTree &tree, bool concatenateName)
Definition juce_KnownPluginList.cpp:419
static void addPlugin(KnownPluginList::PluginTree &tree, PluginDescription pd, String path)
Definition juce_KnownPluginList.cpp:479
uch * p
Definition crypt.c:594
b
Definition crypt.c:628
int result
Definition process.c:1455
static ZCONST char Far * method[NUM_METHODS]
Definition zipinfo.c:1008
_WDL_CSTRING_PREFIX void INT_PTR const char * format
Definition wdlcstring.h:263
#define const
Definition zconf.h:137