Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
c6473bf
Update encoding for NSByteCountFormatter
gcasa Dec 6, 2025
bb2b4fe
NSDateIntervalFormatter initWithCoder/encodeWithCoder
gcasa Dec 6, 2025
79b2dbd
Fix keys for formatter
gcasa Dec 6, 2025
a94eea7
Implement NSISO8601DateFormatter NSCoding.
gcasa Dec 6, 2025
0694672
Add NSCoding implementation for NSLengthFormatter
gcasa Dec 6, 2025
370bebb
Add NSCoding implementation for NSMeasurementFormatter
gcasa Dec 6, 2025
b02aceb
Add NSCoding implementation for NSPersonNameComponentsFormatter
gcasa Dec 6, 2025
ad22c7b
Add NSCoder support for NSEnergyFormatter and NSISO8601DateFormatter …
gcasa Dec 7, 2025
c9f5541
Add changelog
gcasa Dec 7, 2025
cfff328
Fix compilation errors
gcasa Dec 7, 2025
7dfa969
Fix compilation errors
gcasa Dec 7, 2025
f873fc5
Add key archiver/archiver includes
gcasa Dec 7, 2025
6a9582b
Add key archiver/archiver includes
gcasa Dec 7, 2025
a91532e
Add key archiver/archiver includes
gcasa Dec 7, 2025
d9bd089
Merge branch 'master' into formatter_encoding
gcasa Dec 7, 2025
f1f7f36
Update NSPersonNameComponentsFormatter to implement NSCoding
gcasa Dec 7, 2025
2d4cec4
Merge branch 'formatter_encoding' of github.com:gnustep/libs-base int…
gcasa Dec 7, 2025
782d092
Include NSValue.h to get NSNumber to fix errors
gcasa Dec 7, 2025
0207cb1
Add basic tests for all new formatters.
gcasa Dec 8, 2025
d58e4dc
Add new tests for NSNumberFormatter encoding
gcasa Dec 8, 2025
1a905bd
Fix tests for NSMeasurementFormatter
gcasa Dec 8, 2025
2ad7bf1
Update formatters and tests.
gcasa Dec 8, 2025
08397cc
Fix SIGSEGV issue.
gcasa Dec 8, 2025
13833b8
Update NS*Formatter classes to manage NSNumberFormatter memory correc…
gcasa Dec 8, 2025
f13a43e
Fix formatting issues and errors during tests.
gcasa Dec 8, 2025
4ab07a0
Add format validation to the formatter tests.
gcasa Dec 8, 2025
730e698
Remove ObjC2.0 conventions.
gcasa Dec 9, 2025
ef5fd5a
Fixes to formatter tests.
gcasa Dec 9, 2025
8b27466
Remove reference to unimplemented method.
gcasa Dec 9, 2025
ddd30cd
Fix errors with formatter test
gcasa Dec 9, 2025
134b723
Fix warning, correct issue with handling reverse date interval
gcasa Dec 9, 2025
c5865fa
Add encoding tests.
gcasa Dec 9, 2025
cada9f3
Update macos encoding tests.
gcasa Dec 9, 2025
9d6b251
Add checks for specific macOS keys to verify compatibility
gcasa Dec 9, 2025
f89124a
Fix issues with proxy Keyed Archiver.
gcasa Dec 9, 2025
2e71d2c
Fix typo in setCalendar: method
gcasa Dec 9, 2025
ff6a97e
Implement stringForObjectValue:
gcasa Dec 11, 2025
43f71a3
Fix 8601 date formatter
gcasa Dec 11, 2025
420de2a
Properly implement NSDateIntervalFormatter stringFromDate:toDate:
gcasa Dec 12, 2025
c7280d1
Cleanup whitespace, indenting
gcasa Dec 12, 2025
c15a9be
Update NSEnergyFormatter to handle the long, short, and medium formats
gcasa Dec 12, 2025
6cf7be7
Update NSEnergyFormatter to eliminate whitespace, and re-indent
gcasa Dec 12, 2025
39bc565
Update NSEnergyFormatter to correct redundancy
gcasa Dec 12, 2025
ff71b0b
Move strings to common #defines
gcasa Dec 12, 2025
7266ead
Fix C89 issues with new changes
gcasa Dec 12, 2025
67e0166
Add test for NSLinguisticTagger
gcasa Dec 12, 2025
ccc57a3
Add NSLinguisticTagger test
gcasa Dec 12, 2025
774425f
Fix error with GCC
gcasa Dec 13, 2025
7750e16
Fix error with GCC
gcasa Dec 13, 2025
ffb7b38
Fix compilation issues
gcasa Dec 13, 2025
f396b36
Fix some memory leaks and standardise some formatting
rfm Dec 13, 2025
9999a35
Merge branch 'master' into formatter_encoding
gcasa Dec 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32,162 changes: 16,085 additions & 16,077 deletions ChangeLog

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Headers/Foundation/NSMassFormatter.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ typedef NSInteger NSMassFormatterUnit;
@class NSNumberFormatter;

GS_EXPORT_CLASS
@interface NSMassFormatter : NSObject
@interface NSMassFormatter : NSFormatter
{
NSNumberFormatter *_numberFormatter;
BOOL _isForPersonMassUse;
Expand Down
82 changes: 74 additions & 8 deletions Source/NSByteCountFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@

#define EXPOSE_NSByteCountFormatter_IVARS 1

#import <Foundation/NSByteCountFormatter.h>
#import <Foundation/NSString.h>
#import <Foundation/NSAttributedString.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSError.h>
#import <Foundation/NSLocale.h>
#import <Foundation/NSValue.h>
#import "Foundation/NSArchiver.h"
#import "Foundation/NSKeyedArchiver.h"
#import "Foundation/NSByteCountFormatter.h"
#import "Foundation/NSString.h"
#import "Foundation/NSAttributedString.h"
#import "Foundation/NSDictionary.h"
#import "Foundation/NSError.h"
#import "Foundation/NSLocale.h"
#import "Foundation/NSValue.h"

#define GSInternal NSByteCountFormatterInternal
#include "GSInternal.h"
Expand Down Expand Up @@ -318,5 +320,69 @@ - (void) setZeroPadsFractionDigits: (BOOL)flag
internal->_zeroPadsFractionDigits = flag;
}

@end
- (id) initWithCoder: (NSCoder *)coder
{
if (nil == (self = [super init]))
{
return nil;
}

GS_CREATE_INTERNAL(NSByteCountFormatter);

if ([coder allowsKeyedCoding])
{
internal->_formattingContext = [coder decodeIntegerForKey: @"NSFormattingContext"];
internal->_countStyle = [coder decodeIntegerForKey: @"NSCountStyle"];
internal->_allowsNonnumericFormatting = !([coder decodeBoolForKey: @"NSNoNonnumeric"]);
internal->_includesActualByteCount = [coder decodeBoolForKey: @"NSIncludesActualByteCount"];
internal->_adaptive = !([coder decodeBoolForKey: @"NSNoAdaptive"]);
internal->_allowedUnits = [coder decodeIntegerForKey: @"NSAllowedUnits"];
internal->_includesCount = !([coder decodeBoolForKey: @"NSNoCount"]);
internal->_includesUnit = !([coder decodeBoolForKey: @"NSNoUnit"]);
internal->_zeroPadsFractionDigits = [coder decodeBoolForKey: @"NSZeroPad"];
}
else
{
[coder decodeValueOfObjCType: @encode(NSFormattingContext) at: &internal->_formattingContext];
[coder decodeValueOfObjCType: @encode(NSByteCountFormatterCountStyle) at: &internal->_countStyle];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_allowsNonnumericFormatting];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_includesActualByteCount];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_adaptive];
[coder decodeValueOfObjCType: @encode(NSByteCountFormatterUnits) at: &internal->_allowedUnits];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_includesCount];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_includesUnit];
[coder decodeValueOfObjCType: @encode(BOOL) at: &internal->_zeroPadsFractionDigits];
}

return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
if ([coder allowsKeyedCoding])
{
[coder encodeInteger: internal->_formattingContext forKey: @"NSFormattingContext"];
[coder encodeInteger: internal->_countStyle forKey: @"NSCountStyle"];
[coder encodeBool: !(internal->_allowsNonnumericFormatting) forKey: @"NSNoNonnumeric"];
[coder encodeBool: internal->_includesActualByteCount forKey: @"NSIncludesActualByteCount"];
[coder encodeBool: !(internal->_adaptive) forKey: @"NSNoAdaptive"];
[coder encodeInteger: internal->_allowedUnits forKey: @"NSAllowedUnits"];
[coder encodeBool: !(internal->_includesCount) forKey: @"NSNoCount"];
[coder encodeBool: !(internal->_includesUnit) forKey: @"NSNoUnit"];
[coder encodeBool: internal->_zeroPadsFractionDigits forKey: @"NSZeroPad"];
}
else
{
[coder encodeValueOfObjCType: @encode(NSFormattingContext) at: &internal->_formattingContext];
[coder encodeValueOfObjCType: @encode(NSByteCountFormatterCountStyle) at: &internal->_countStyle];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_allowsNonnumericFormatting];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_includesActualByteCount];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_adaptive];
[coder encodeValueOfObjCType: @encode(NSByteCountFormatterUnits) at: &internal->_allowedUnits];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_includesCount];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_includesUnit];
[coder encodeValueOfObjCType: @encode(BOOL) at: &internal->_zeroPadsFractionDigits];
}
}

@end
56 changes: 54 additions & 2 deletions Source/NSDateComponentsFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
Software Foundation, Inc., 31 Milk Street #960789 Boston, MA 02196 USA.
*/

#import "Foundation/NSArchiver.h"
#import "Foundation/NSKeyedArchiver.h"
#import "Foundation/NSDateComponentsFormatter.h"
#import "Foundation/NSDate.h"
#import "Foundation/NSString.h"
Expand Down Expand Up @@ -60,15 +62,65 @@ - (instancetype) initWithCoder: (NSCoder *)coder
self = [super initWithCoder: coder];
if (self != nil)
{
// TODO: Implement coding...
if ([coder allowsKeyedCoding])
{
ASSIGN(_calendar, [coder decodeObjectForKey: @"NS.calendar"]);
ASSIGN(_referenceDate, [coder decodeObjectForKey: @"referenceDate"]);
_allowsFractionalUnits = [coder decodeBoolForKey: @"allowsFractionalUnits"];
_collapsesLargestUnit = [coder decodeBoolForKey: @"collapsesLargestUnit"];
_includesApproximationPhrase = [coder decodeBoolForKey: @"includesApproximationPhrase"];
_formattingContext = [coder decodeIntegerForKey: @"formattingContext"];
_maximumUnitCount = [coder decodeIntegerForKey: @"maximumUnitCount"];
_zeroFormattingBehavior = [coder decodeIntegerForKey: @"zeroFormattingBehavior"];
_allowedUnits = [coder decodeIntegerForKey: @"NS.allowedUnits"];
_unitsStyle = [coder decodeIntegerForKey: @"NS.unitsStyle"];
}
else
{
[coder decodeValueOfObjCType: @encode(id) at: &_calendar];
[coder decodeValueOfObjCType: @encode(id) at: &_referenceDate];
[coder decodeValueOfObjCType: @encode(BOOL) at: &_allowsFractionalUnits];
[coder decodeValueOfObjCType: @encode(BOOL) at: &_collapsesLargestUnit];
[coder decodeValueOfObjCType: @encode(BOOL) at: &_includesApproximationPhrase];
[coder decodeValueOfObjCType: @encode(NSFormattingContext) at: &_formattingContext];
[coder decodeValueOfObjCType: @encode(NSInteger) at: &_maximumUnitCount];
[coder decodeValueOfObjCType: @encode(NSDateComponentsFormatterZeroFormattingBehavior) at: &_zeroFormattingBehavior];
[coder decodeValueOfObjCType: @encode(NSCalendarUnit) at: &_allowedUnits];
[coder decodeValueOfObjCType: @encode(NSDateComponentsFormatterUnitsStyle) at: &_unitsStyle];
}
}
return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
[super encodeWithCoder: coder];
// TODO: Implement coding...
if ([coder allowsKeyedCoding])
{
[coder encodeObject: _calendar forKey: @"NS.calendar"];
[coder encodeObject: _referenceDate forKey: @"referenceDate"];
[coder encodeBool: _allowsFractionalUnits forKey: @"allowsFractionalUnits"];
[coder encodeBool: _collapsesLargestUnit forKey: @"collapsesLargestUnit"];
[coder encodeBool: _includesApproximationPhrase forKey: @"includesApproximationPhrase"];
[coder encodeInteger: _formattingContext forKey: @"formattingContext"];
[coder encodeInteger: _maximumUnitCount forKey: @"maximumUnitCount"];
[coder encodeInteger: _zeroFormattingBehavior forKey: @"zeroFormattingBehavior"];
[coder encodeInteger: _allowedUnits forKey: @"NS.allowedUnits"];
[coder encodeInteger: _unitsStyle forKey: @"NS.unitsStyle"];
}
else
{
[coder encodeValueOfObjCType: @encode(id) at: &_calendar];
[coder encodeValueOfObjCType: @encode(id) at: &_referenceDate];
[coder encodeValueOfObjCType: @encode(BOOL) at: &_allowsFractionalUnits];
[coder encodeValueOfObjCType: @encode(BOOL) at: &_collapsesLargestUnit];
[coder encodeValueOfObjCType: @encode(BOOL) at: &_includesApproximationPhrase];
[coder encodeValueOfObjCType: @encode(NSFormattingContext) at: &_formattingContext];
[coder encodeValueOfObjCType: @encode(NSInteger) at: &_maximumUnitCount];
[coder encodeValueOfObjCType: @encode(NSDateComponentsFormatterZeroFormattingBehavior) at: &_zeroFormattingBehavior];
[coder encodeValueOfObjCType: @encode(NSCalendarUnit) at: &_allowedUnits];
[coder encodeValueOfObjCType: @encode(NSDateComponentsFormatterUnitsStyle) at: &_unitsStyle];
}
}

- (void) dealloc
Expand Down
52 changes: 52 additions & 0 deletions Source/NSDateIntervalFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
Software Foundation, Inc., 31 Milk Street #960789 Boston, MA 02196 USA.
*/

#import "Foundation/NSArchiver.h"
#import "Foundation/NSKeyedArchiver.h"
#import "Foundation/NSDateIntervalFormatter.h"
#import "Foundation/NSLocale.h"
#import "Foundation/NSCalendar.h"
Expand Down Expand Up @@ -110,5 +112,55 @@ - (NSString *) stringFromDateInterval: (NSDateInterval *)dateInterval
return [NSString stringWithFormat: @"%@ - %@", fromDate, toDate];
}

- (instancetype) initWithCoder: (NSCoder *)coder
{
self = [super initWithCoder: coder];
if (self != nil)
{
if ([coder allowsKeyedCoding])
{
ASSIGN(_locale, [coder decodeObjectForKey: @"NS.locale"]);
ASSIGN(_calendar, [coder decodeObjectForKey: @"NS.calendar"]);
ASSIGN(_timeZone, [coder decodeObjectForKey: @"NS.timeZone"]);
ASSIGN(_dateTemplate, [coder decodeObjectForKey: @"NS.dateTemplate"]);
_dateStyle = [coder decodeIntegerForKey: @"NS.dateStyle"];
_timeStyle = [coder decodeIntegerForKey: @"NS.timeStyle"];
}
else
{
[coder decodeValueOfObjCType: @encode(id) at: &_locale];
[coder decodeValueOfObjCType: @encode(id) at: &_calendar];
[coder decodeValueOfObjCType: @encode(id) at: &_timeZone];
[coder decodeValueOfObjCType: @encode(id) at: &_dateTemplate];
[coder decodeValueOfObjCType: @encode(NSDateIntervalFormatterStyle) at: &_dateStyle];
[coder decodeValueOfObjCType: @encode(NSDateIntervalFormatterStyle) at: &_timeStyle];
}
}
return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
[super encodeWithCoder: coder];
if ([coder allowsKeyedCoding])
{
[coder encodeObject: _locale forKey: @"NS.locale"];
[coder encodeObject: _calendar forKey: @"NS.calendar"];
[coder encodeObject: _timeZone forKey: @"NS.timeZone"];
[coder encodeObject: _dateTemplate forKey: @"NS.dateTemplate"];
[coder encodeInteger: _dateStyle forKey: @"NS.dateStyle"];
[coder encodeInteger: _timeStyle forKey: @"NS.timeStyle"];
}
else
{
[coder encodeValueOfObjCType: @encode(id) at: &_locale];
[coder encodeValueOfObjCType: @encode(id) at: &_calendar];
[coder encodeValueOfObjCType: @encode(id) at: &_timeZone];
[coder encodeValueOfObjCType: @encode(id) at: &_dateTemplate];
[coder encodeValueOfObjCType: @encode(NSDateIntervalFormatterStyle) at: &_dateStyle];
[coder encodeValueOfObjCType: @encode(NSDateIntervalFormatterStyle) at: &_timeStyle];
}
}

@end

40 changes: 40 additions & 0 deletions Source/NSEnergyFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
Software Foundation, Inc., 31 Milk Street #960789 Boston, MA 02196 USA.
*/

#import "Foundation/NSArchiver.h"
#import "Foundation/NSKeyedArchiver.h"
#import "Foundation/NSEnergyFormatter.h"
#import "Foundation/NSMeasurement.h"
#import "Foundation/NSMeasurementFormatter.h"
Expand Down Expand Up @@ -125,5 +127,43 @@ - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescriptio
return NO;
}

- (instancetype) initWithCoder: (NSCoder *)coder
{
self = [super initWithCoder: coder];
if (self != nil)
{
if ([coder allowsKeyedCoding])
{
_isForFoodEnergyUse = [coder decodeBoolForKey: @"NS.forFoodEnergyUse"];
ASSIGN(_numberFormatter, [coder decodeObjectForKey: @"NS.numberFormatter"]);
_unitStyle = [coder decodeIntegerForKey: @"NS.unitOptions"];
}
else
{
[coder decodeValueOfObjCType: @encode(BOOL) at: &_isForFoodEnergyUse];
[coder decodeValueOfObjCType: @encode(id) at: &_numberFormatter];
[coder decodeValueOfObjCType: @encode(NSFormattingUnitStyle) at: &_unitStyle];
}
}
return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
[super encodeWithCoder: coder];
if ([coder allowsKeyedCoding])
{
[coder encodeBool: _isForFoodEnergyUse forKey: @"NS.forFoodEnergyUse"];
[coder encodeObject: _numberFormatter forKey: @"NS.numberFormatter"];
[coder encodeInteger: _unitStyle forKey: @"NS.unitOptions"];
}
else
{
[coder encodeValueOfObjCType: @encode(BOOL) at: &_isForFoodEnergyUse];
[coder encodeValueOfObjCType: @encode(id) at: &_numberFormatter];
[coder encodeValueOfObjCType: @encode(NSFormattingUnitStyle) at: &_unitStyle];
}
}

@end

1 change: 1 addition & 0 deletions Source/NSISO8601DateFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ - (id) initWithCoder: (NSCoder *)decoder
{
if ((self = [super init]) != nil)
{
_formatter = [[NSDateFormatter alloc] init];
if ([decoder allowsKeyedCoding])
{
ASSIGN(_timeZone, [decoder decodeObjectForKey: @"NS.timeZone"]);
Expand Down
40 changes: 40 additions & 0 deletions Source/NSLengthFormatter.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
Software Foundation, Inc., 31 Milk Street #960789 Boston, MA 02196 USA.
*/

#import "Foundation/NSArchiver.h"
#import "Foundation/NSKeyedArchiver.h"
#import "Foundation/NSLengthFormatter.h"
#import "Foundation/NSMeasurement.h"
#import "Foundation/NSMeasurementFormatter.h"
Expand Down Expand Up @@ -155,4 +157,42 @@ - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescriptio
return NO;
}

- (instancetype) initWithCoder: (NSCoder *)coder
{
self = [super initWithCoder: coder];
if (self != nil)
{
if ([coder allowsKeyedCoding])
{
_isForPersonHeightUse = [coder decodeBoolForKey: @"NS.forPersonHeightUse"];
ASSIGN(_numberFormatter, [coder decodeObjectForKey: @"NS.numberFormatter"]);
_unitStyle = [coder decodeIntegerForKey: @"NS.unitStyle"];
}
else
{
[coder decodeValueOfObjCType: @encode(BOOL) at: &_isForPersonHeightUse];
[coder decodeValueOfObjCType: @encode(id) at: &_numberFormatter];
[coder decodeValueOfObjCType: @encode(NSFormattingUnitStyle) at: &_unitStyle];
}
}
return self;
}

- (void) encodeWithCoder: (NSCoder *)coder
{
[super encodeWithCoder: coder];
if ([coder allowsKeyedCoding])
{
[coder encodeBool: _isForPersonHeightUse forKey: @"NS.forPersonHeightUse"];
[coder encodeObject: _numberFormatter forKey: @"NS.numberFormatter"];
[coder encodeInteger: _unitStyle forKey: @"NS.unitStyle"];
}
else
{
[coder encodeValueOfObjCType: @encode(BOOL) at: &_isForPersonHeightUse];
[coder encodeValueOfObjCType: @encode(id) at: &_numberFormatter];
[coder encodeValueOfObjCType: @encode(NSFormattingUnitStyle) at: &_unitStyle];
}
}

@end
Loading