1
2
3
4
5
6
7
8
9
10
11
|
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
* 2018, 2019, 2020
* Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
<
<
|
|
1
2
3
4
5
6
7
8
9
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
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
|
} @finally {
free(locale);
}
}
#endif
static bool
evaluateCondition(OFString *condition, OFDictionary *variables)
{
OFMutableArray *tokens, *operators, *stack;
/* Empty condition is the fallback that's always true */
if (condition.length == 0)
return true;
/*
* Dirty hack to allow not needing spaces after "!" or "(" and spaces
* before ")".
* TODO: Replace with a proper tokenizer.
*/
condition = [condition stringByReplacingOccurrencesOfString: @"!"
withString: @"! "];
condition = [condition stringByReplacingOccurrencesOfString: @"("
withString: @"( "];
condition = [condition stringByReplacingOccurrencesOfString: @")"
withString: @" )"];
/* Substitute variables and convert to RPN first */
tokens = [OFMutableArray array];
operators = [OFMutableArray array];
for (OFString *token in [condition
componentsSeparatedByString: @" "
options: OF_STRING_SKIP_EMPTY]) {
|
|
>
<
|
<
|
<
|
|
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
|
} @finally {
free(locale);
}
}
#endif
static bool
evaluateCondition(OFString *condition_, OFDictionary *variables)
{
OFMutableString *condition = [[condition_ mutableCopy] autorelease];
OFMutableArray *tokens, *operators, *stack;
/* Empty condition is the fallback that's always true */
if (condition.length == 0)
return true;
/*
* Dirty hack to allow not needing spaces after "!" or "(" and spaces
* before ")".
* TODO: Replace with a proper tokenizer.
*/
[condition replaceOccurrencesOfString: @"!" withString: @"! "];
[condition replaceOccurrencesOfString: @"(" withString: @"( "];
[condition replaceOccurrencesOfString: @")" withString: @" )"];
/* Substitute variables and convert to RPN first */
tokens = [OFMutableArray array];
operators = [OFMutableArray array];
for (OFString *token in [condition
componentsSeparatedByString: @" "
options: OF_STRING_SKIP_EMPTY]) {
|
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
|
OFConstantString *name;
const char *UTF8String = NULL;
size_t last, UTF8StringLength;
int state = 0;
variables = [OFMutableDictionary dictionary];
while ((name = va_arg(arguments, OFConstantString *)) != nil)
[variables setObject: va_arg(arguments, id)
forKey: name];
for (OFDictionary *strings in _localizedStrings) {
id string = [strings objectForKey: ID];
if (string == nil)
continue;
|
|
<
|
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
|
OFConstantString *name;
const char *UTF8String = NULL;
size_t last, UTF8StringLength;
int state = 0;
variables = [OFMutableDictionary dictionary];
while ((name = va_arg(arguments, OFConstantString *)) != nil)
[variables setObject: va_arg(arguments, id) forKey: name];
for (OFDictionary *strings in _localizedStrings) {
id string = [strings objectForKey: ID];
if (string == nil)
continue;
|