Merge branch 'master' of github.com:gnustep/libs-base into NSSecureCoding_branch

This commit is contained in:
Gregory John Casamento 2020-05-04 05:50:58 -04:00
commit 76fac00cd2
10 changed files with 598 additions and 335 deletions

3
.gitignore vendored
View file

@ -26,6 +26,9 @@ Tests/base/coding/ulong-8.type
*.orig *.orig
*.swp *.swp
# MacOS Desktop Services Store
.DS_Store
# Created by https://www.gitignore.io/api/xcode # Created by https://www.gitignore.io/api/xcode
# Edit at https://www.gitignore.io/?templates=xcode # Edit at https://www.gitignore.io/?templates=xcode

View file

@ -1,3 +1,13 @@
2020-04-26 Fred Kiefer <fredkiefer@gmx.de>
* Source/NSLocale.m: Respect NSLocaleCalendarIdentifier if
NSLocaleCalendar isn't set.
* Headers/Foundation/NSCalendar.h,
* Source/NSCalendar.m: Add newer features for NSDateComponents and
started to clean up NSCalendar implementation.
* Tests/base/NSCalendar/features-10-7.m: Add test for different
time zone.
2020-04-21 Richard Frith-Macdonald <rfm@gnu.org> 2020-04-21 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSNotification.m: * Source/NSNotification.m:

View file

@ -129,7 +129,7 @@ enum
NSCalendarUnitWeekOfMonth = (1UL << 12), NSCalendarUnitWeekOfMonth = (1UL << 12),
NSCalendarUnitWeekOfYear = (1UL << 13), NSCalendarUnitWeekOfYear = (1UL << 13),
NSCalendarUnitYearForWeekOfYear = (1UL << 14), NSCalendarUnitYearForWeekOfYear = (1UL << 14),
NSCalendarUnitNanosecond = (1 << 15), // FIXME: unimplemented NSCalendarUnitNanosecond = (1 << 15),
NSCalendarUnitCalendar = (1 << 20), // FIXME: unimplemented NSCalendarUnitCalendar = (1 << 20), // FIXME: unimplemented
NSCalendarUnitTimeZone = (1 << 21) // FIXME: unimplemented NSCalendarUnitTimeZone = (1 << 21) // FIXME: unimplemented
#endif #endif
@ -227,6 +227,7 @@ enum
* yearForWeekOfYear is 2013, since it's already week 1 in 2013. * yearForWeekOfYear is 2013, since it's already week 1 in 2013.
*/ */
- (NSInteger) yearForWeekOfYear; - (NSInteger) yearForWeekOfYear;
- (NSInteger) nanosecond;
/** Sets the number of the week in this month. */ /** Sets the number of the week in this month. */
- (void) setWeekOfMonth: (NSInteger) v; - (void) setWeekOfMonth: (NSInteger) v;
@ -241,8 +242,22 @@ enum
* See the explanation at <code>-yearForWeekOfYear</code>. * See the explanation at <code>-yearForWeekOfYear</code>.
*/ */
- (void) setYearForWeekOfYear: (NSInteger) v; - (void) setYearForWeekOfYear: (NSInteger) v;
- (void) setNanosecond: (NSInteger) v;
#endif #endif
#if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST)
- (BOOL) leapMonth;
- (void) setLeapMonth: (BOOL) v;
#endif
#if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST)
- (BOOL) isValidDate;
- (BOOL) isValidDateInCalendar: (NSCalendar *) calendar;
- (NSInteger) valueForComponent: (NSCalendarUnit) unit;
- (void) setValue: (NSInteger) value
forComponent: (NSCalendarUnit) unit;
#endif
@end @end

File diff suppressed because it is too large Load diff

View file

@ -468,11 +468,16 @@ parseNumber(ParserState *state)
{\ {\
bufferSize *= 2;\ bufferSize *= 2;\
if (number == numberBuffer)\ if (number == numberBuffer)\
number = malloc(bufferSize);\ {\
number = malloc(bufferSize);\
memcpy(number, numberBuffer, sizeof(numberBuffer));\
}\
else\ else\
number = realloc(number, bufferSize);\ {\
number = realloc(number, bufferSize);\
}\
}\ }\
number[parsedSize++] = (char)x; } while (0) number[parsedSize++] = (char)x; } while (0)
// JSON numbers must start with a - or a digit // JSON numbers must start with a - or a digit
if (!(c == '-' || isdigit(c))) if (!(c == '-' || isdigit(c)))
{ {

View file

@ -627,6 +627,11 @@ static NSRecursiveLock *classLock = nil;
[[dict objectForKey: NSLocaleCollationIdentifier] UTF8String]; [[dict objectForKey: NSLocaleCollationIdentifier] UTF8String];
const char *currency = [[dict objectForKey: NSLocaleCurrencyCode] UTF8String]; const char *currency = [[dict objectForKey: NSLocaleCurrencyCode] UTF8String];
if (!calendar)
{
calendar = [[dict objectForKey: NSLocaleCalendarIdentifier] UTF8String];
}
// A locale cannot be constructed without a language. // A locale cannot be constructed without a language.
if (language == NULL) if (language == NULL)
return nil; return nil;

View file

@ -1901,7 +1901,8 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
} }
} }
- (NSString *) stringByAddingPercentEncodingWithAllowedCharacters: (NSCharacterSet *)aSet - (NSString *) stringByAddingPercentEncodingWithAllowedCharacters:
(NSCharacterSet *)aSet
{ {
NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding]; NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding];
NSString *s = nil; NSString *s = nil;
@ -1921,7 +1922,10 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
unsigned int hi; unsigned int hi;
unsigned int lo; unsigned int lo;
if([aSet characterIsMember: c]) // if the character is in the allowed set, put it in /* If the character is in the allowed set *and* is in the
* 7-bit ASCII range, it can be added unchanged.
*/
if (c < 128 && [aSet characterIsMember: c])
{ {
dst[dpos++] = c; dst[dpos++] = c;
} }
@ -1936,7 +1940,7 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
} }
s = [[NSString alloc] initWithBytes: dst s = [[NSString alloc] initWithBytes: dst
length: dpos length: dpos
encoding: NSUTF8StringEncoding]; encoding: NSASCIIStringEncoding];
NSZoneFree(NSDefaultMallocZone(), dst); NSZoneFree(NSDefaultMallocZone(), dst);
IF_NO_GC([s autorelease];) IF_NO_GC([s autorelease];)
} }
@ -1963,7 +1967,7 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
uint8_t hi = s[index+1]; uint8_t hi = s[index+1];
uint8_t lo = s[index+2]; uint8_t lo = s[index+2];
if (isdigit(hi) && isxdigit(lo)) if (isxdigit(hi) && isxdigit(lo))
{ {
index += 2; index += 2;
if (hi <= '9') if (hi <= '9')

View file

@ -51,6 +51,9 @@ TOP_DIR := $(shell dirname $(CURDIR))
all:: all::
@(echo If you want to run the gnustep-base testsuite, please type \'${MAKE} check\') @(echo If you want to run the gnustep-base testsuite, please type \'${MAKE} check\')
# To run tests for a separate group please, use 'make check testobj=NSString'
# or 'make check testobj=NSDate/general.m' to run an individual test file
#
# #
# 'make check' runs the testsuite (Objective-C tests only) # 'make check' runs the testsuite (Objective-C tests only)
# #
@ -72,9 +75,9 @@ check::
export LD_LIBRARY_PATH;\ export LD_LIBRARY_PATH;\
export PATH;\ export PATH;\
if [ "$(debug)" = "yes" ]; then \ if [ "$(debug)" = "yes" ]; then \
gnustep-tests --debug base;\ gnustep-tests --debug 'base/$(testobj)';\
else \ else \
gnustep-tests base;\ gnustep-tests 'base/$(testobj)';\
fi; \ fi; \
) )

View file

@ -17,6 +17,8 @@ int main()
NSCalendar *cal; NSCalendar *cal;
NSDate *date; NSDate *date;
NSDate *date2; NSDate *date2;
NSDate *date3;
NSDate *date4;
START_SET("NSCalendar 10.7 features") START_SET("NSCalendar 10.7 features")
if (!NSCALENDAR_SUPPORTED) if (!NSCALENDAR_SUPPORTED)
@ -48,7 +50,13 @@ int main()
date2 = [comps date]; date2 = [comps date];
PASS_EQUAL(date, date2, "-[NSDateComponents date] returns the correct date"); PASS_EQUAL(date, date2, "-[NSDateComponents date] returns the correct date");
date3 = [NSDate dateWithString: @"2012-12-31 13:57:00 +0200"];
[comps setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 7200]];
date4 = [cal dateFromComponents: comps];
PASS_EQUAL(date3, date4, "-[NSCalendar dateFromComponents:] respects the time zone");
RELEASE(comps); RELEASE(comps);
RELEASE(cal); RELEASE(cal);

View file

@ -3,55 +3,93 @@
#import <Foundation/NSString.h> #import <Foundation/NSString.h>
#import <Foundation/NSCharacterSet.h> #import <Foundation/NSCharacterSet.h>
BOOL testUrlCharacterSetEncoding( void testEncodeDecode(NSString* encoded, NSString* decoded, NSCharacterSet* charset, NSString* description){
NSString* decodedString,
NSString* encodedString, NSString* encodeTest = [decoded stringByAddingPercentEncodingWithAllowedCharacters:charset];
NSCharacterSet* allowedCharacterSet) NSString* decodeTest = [encoded stringByRemovingPercentEncoding];
{
NSString *testString const char* encodeMsg = [[NSString stringWithFormat:@"Percent-Encode: %@", description] UTF8String];
= [decodedString stringByAddingPercentEncodingWithAllowedCharacters: const char* decodeMsg = [[NSString stringWithFormat:@"Percent-Decode: %@", description] UTF8String];
allowedCharacterSet];
// NSLog(@"String by adding percent, done. test=%@ decoded=%@", testString, decodedString); PASS_EQUAL(encodeTest, encoded, "%s", encodeMsg);
return [encodedString isEqualToString: testString]; PASS_EQUAL(decodeTest, decoded, "%s", decodeMsg);
} }
int main (int argc, const char * argv[]) int main (int argc, const char * argv[])
{ {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *urlDecodedString = @"Only alphabetic characters should be allowed and not encoded. !@#$%^&*()_+-="; NSString *urlDecodedString = @"Only alphabetic characters should be allowed and not encoded. !@#$%^&*()_+-=";
NSString *urlEncodedString = NSString *urlEncodedString = @"Only%20alphabetic%20characters%20should%20be%20allowed%20and%20not%20encoded%2E%20%21%40%23%24%25%5E%26%2A%28%29%5F%2B%2D%3D";
@"Only%20alphabetic%20characters%20should%20be%20allowed%20and%20not%20encoded%2E%20%21%40%23%24%25%5E%26%2A%28%29%5F%2B%2D%3D"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet],
NSCharacterSet *allowedCharacterSet = [NSCharacterSet alphanumericCharacterSet]; @"Skip alphanumericCharacterSet 01");
PASS(testUrlCharacterSetEncoding(urlDecodedString, urlEncodedString, allowedCharacterSet), "alphanumericCharacterSet");
urlDecodedString = @"https://www.microsoft.com/en-us/!@#$%^&*()_"; urlDecodedString = @"https://www.microsoft.com/en-us/!@#$%^&*()_";
urlEncodedString = @"https://www.microsoft.com/en-us/!@%23$%25%5E&*()_"; urlEncodedString = @"https://www.microsoft.com/en-us/!@%23$%25%5E&*()_";
allowedCharacterSet = [NSCharacterSet URLFragmentAllowedCharacterSet]; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet URLFragmentAllowedCharacterSet],
PASS(testUrlCharacterSetEncoding(urlDecodedString, urlEncodedString, allowedCharacterSet), "fragmentCharacterSet"); @"Skip URLFragmentAllowedCharacterSet 02");
urlDecodedString = @"All alphabetic characters should be encoded. Symbols should not be: !@#$%^&*()_+-="; urlDecodedString = @"All alphabetic characters should be encoded. Symbols should not be: !@#$%^&*()_+-=";
urlEncodedString = @"%41%6C%6C %61%6C%70%68%61%62%65%74%69%63 %63%68%61%72%61%63%74%65%72%73 %73%68%6F%75%6C%64 %62%65 " urlEncodedString = @"%41%6C%6C %61%6C%70%68%61%62%65%74%69%63 %63%68%61%72%61%63%74%65%72%73 %73%68%6F%75%6C%64 %62%65 "
@"%65%6E%63%6F%64%65%64. %53%79%6D%62%6F%6C%73 %73%68%6F%75%6C%64 %6E%6F%74 %62%65: !@#$%^&*()_+-="; @"%65%6E%63%6F%64%65%64. %53%79%6D%62%6F%6C%73 %73%68%6F%75%6C%64 %6E%6F%74 %62%65: !@#$%^&*()_+-=";
allowedCharacterSet = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; testEncodeDecode(urlEncodedString, urlDecodedString, [[NSCharacterSet alphanumericCharacterSet] invertedSet],
PASS(testUrlCharacterSetEncoding(urlDecodedString, urlEncodedString, allowedCharacterSet), "inverted"); @"Skip not alphanumericCharacterSet 03");
urlDecodedString = @"Here are some Emojis: \U0001F601 \U0001F602 \U0001F638 Emojis done."; // Multibyte encoded characters urlDecodedString = @"Here are some Emojis: \U0001F601 \U0001F602 \U0001F638 Emojis done."; // Multibyte encoded characters
urlEncodedString = @"Here%20are%20some%20Emojis:%20%F0%9F%98%81%20%F0%9F%98%82%20%F0%9F%98%B8%20Emojis%20done."; urlEncodedString = @"Here%20are%20some%20Emojis:%20%F0%9F%98%81%20%F0%9F%98%82%20%F0%9F%98%B8%20Emojis%20done.";
allowedCharacterSet = [NSCharacterSet URLFragmentAllowedCharacterSet]; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet URLFragmentAllowedCharacterSet],
PASS(testUrlCharacterSetEncoding(urlDecodedString, urlEncodedString, allowedCharacterSet), "fragmentCharacterSet emojis"); @"Skip URLFragmentAllowedCharacterSet 04");
urlDecodedString = @"\1"; urlDecodedString = @"\1";
urlEncodedString = @"%01"; urlEncodedString = @"%01";
allowedCharacterSet = [NSCharacterSet alphanumericCharacterSet]; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet],
PASS(testUrlCharacterSetEncoding(urlDecodedString, urlEncodedString, allowedCharacterSet), "alphanumericCharacterSet"); @"Skip URLFragmentAllowedCharacterSet 05");
urlDecodedString = @"£";
urlEncodedString = @"%C2%A3";
testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet],
@"Two-byte character 06");
urlDecodedString = @"€";
urlEncodedString = @"%E2%82%AC";
testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet],
@"Three-byte character 07");
urlDecodedString = @"𐍈";
urlEncodedString = @"%F0%90%8D%88";
testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet],
@"Four-byte character 08");
//check full string encoding and decoding
urlDecodedString = @"0123456789 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz _-~`!#$%&'()*+,/:;=?@[]™…©®£ƒ‰¥§";
urlEncodedString = @"%30%31%32%33%34%35%36%37%38%39%20%41%61%42%62%43%63%44%64%45%65%46%66%47%67%48%68%49%69%4A%6A%4B%6B%4C%6C%4D%6D%4E%6E%4F%6F%50%70%51%71%52%72%53%73%54%74%55%75%56%76%57%77%58%78%59%79%5A%7A%20%5F%2D%7E%60%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D%E2%84%A2%E2%80%A6%C2%A9%C2%AE%C2%A3%C6%92%E2%80%B0%C2%A5%C2%A7";
testEncodeDecode(urlEncodedString, urlDecodedString, [[NSCharacterSet characterSetWithCharactersInString:urlDecodedString] invertedSet],
@"All characters in string 09");
//check decoding of string with an unencoded part at the beginning
NSString* asIsString = @"0123456789 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz _-~`!#$&'()*+,/:;=?@[]™…©®£ƒ‰¥§";
urlDecodedString = [asIsString stringByAppendingString:urlDecodedString];
urlEncodedString = [asIsString stringByAppendingString:urlEncodedString];
PASS_EQUAL([urlEncodedString stringByRemovingPercentEncoding], urlDecodedString, "Percent-encoded string decoding 10");
//check decoding of string with the encoded part in the middle
urlDecodedString = [urlDecodedString stringByAppendingString:asIsString];
urlEncodedString = [urlEncodedString stringByAppendingString:asIsString];
PASS_EQUAL([urlEncodedString stringByRemovingPercentEncoding], urlDecodedString, "Percent-encoded string decoding 11");
urlDecodedString = @"All alphabetic characters should be encoded. Symbols should not be: !@#$%^&*()_+-=";
urlEncodedString = @"%41%6C%6C %61%6C%70%68%61%62%65%74%69%63 %63%68%61%72%61%63%74%65%72%73 %73%68%6F%75%6C%64 %62%65 "
@"%65%6E%63%6F%64%65%64. %53%79%6D%62%6F%6C%73 %73%68%6F%75%6C%64 %6E%6F%74 %62%65: !@#$%^&*()_+-=";
NSString *result = [urlEncodedString stringByRemovingPercentEncoding];
PASS([urlDecodedString isEqualToString: result], "stringByRemovingPercentEncoding");
// NSLog(@"Result = \"%@\",\ndecodedString = \"%@\",\nencodedString = \"%@\"", result, urlDecodedString, urlEncodedString);
[pool drain]; [pool drain];
return 0; return 0;
} }