[Pkg] The Trunk: Kernel-bf.744.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Mar 4 14:26:53 UTC 2013
Bert Freudenberg uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-bf.744.mcz
==================== Summary ====================
Name: Kernel-bf.744
Author: bf
Time: 4 March 2013, 3:25:12.024 pm
UUID: e3c35ac4-6571-4bcc-86d4-ccb613a8e631
Ancestors: Kernel-nice.743
Sanitize Time class>>readFrom: to not read beyond the time. Use that to sanitize DateAndTime class>>readFrom:, too, avoiding the only known use of PositionableStream>>last. Time tests are still green.
=============== Diff against Kernel-nice.743 ===============
Item was changed:
----- Method: DateAndTime class>>readFrom: (in category 'squeak protocol') -----
readFrom: aStream
| offset date time ch |
date := Date readFrom: aStream.
[aStream peek isDigit]
whileFalse: [aStream next].
time := Time readFrom: aStream.
+ (aStream atEnd or: [('+-Z' includes: aStream peek) not])
+ ifTrue: [offset := self localOffset]
+ ifFalse: [(aStream peekFor: $Z)
+ ifTrue: [offset := Duration zero]
+ ifFalse: [
+ ch := aStream next.
+ ch = $+ ifTrue: [ch := Character space].
+ offset := Duration fromString: ch asString, '0:', aStream upToEnd, ':0']].
- aStream atEnd
- ifTrue: [ (aStream last = $Z) ifTrue: [offset := Duration zero] ifFalse: [ offset := self localOffset ]]
- ifFalse: [
- ch := aStream next.
- ch = $+ ifTrue: [ch := Character space].
- offset := Duration fromString: ch asString, '0:', aStream upToEnd, ':0'].
-
^ self
year: date year
month: date monthIndex
day: date dayOfMonth
hour: time hour
minute: time minute
second: time second
nanoSecond: time nanoSecond
offset: offset
" '-1199-01-05T20:33:14.321-05:00' asDateAndTime
' 2002-05-16T17:20:45.1+01:01' asDateAndTime
' 2002-05-16T17:20:45.02+01:01' asDateAndTime
' 2002-05-16T17:20:45.003+01:01' asDateAndTime
' 2002-05-16T17:20:45.0004+01:01' asDateAndTime
' 2002-05-16T17:20:45.00005' asDateAndTime
' 2002-05-16T17:20:45.000006+01:01' asDateAndTime
' 2002-05-16T17:20:45.0000007+01:01' asDateAndTime
' 2002-05-16T17:20:45.00000008-01:01' asDateAndTime
' 2002-05-16T17:20:45.000000009+01:01' asDateAndTime
' 2002-05-16T17:20:45.0000000001+01:01' asDateAndTime
' 2002-05-16T17:20' asDateAndTime
' 2002-05-16T17:20:45' asDateAndTime
' 2002-05-16T17:20:45+01:57' asDateAndTime
' 2002-05-16T17:20:45-02:34' asDateAndTime
' 2002-05-16T17:20:45+00:00' asDateAndTime
' 1997-04-26T01:02:03+01:02:3' asDateAndTime
"!
Item was changed:
----- Method: Time class>>readFrom: (in category 'smalltalk-80') -----
readFrom: aStream
"Read a Time from the stream in the form:
<hour>:<minute>:<second> <am/pm>
<minute>, <second> or <am/pm> may be omitted. e.g. 1:59:30 pm; 8AM; 15:30"
| hour minute second ampm nanos nanosBuffer |
hour := Integer readFrom: aStream.
minute := 0.
second := 0.
nanosBuffer := '000000000' copy.
nanos := WriteStream on: nanosBuffer.
(aStream peekFor: $:)
ifTrue: [
minute := Integer readFrom: aStream.
(aStream peekFor: $:)
ifTrue: [
+ second := Integer readFrom: aStream.
- second := Integer readFrom: aStream].
(aStream peekFor: $.)
ifTrue: [
[aStream atEnd not and: [aStream peek isDigit]]
+ whileTrue: [nanos nextPut: aStream next]]]].
- whileTrue: [nanos nextPut: aStream next]]].
aStream skipSeparators.
+ (aStream atEnd not and: ['PApa' includes: aStream peek]) ifTrue:
- (aStream atEnd not and: [aStream peek isLetter]) ifTrue:
[ampm := aStream next asLowercase.
+ (ampm = $p and: [hour < 12]) ifTrue: [hour := hour + 12].
-
- (ampm = $p and: [hour < 12]) ifTrue: [hour := hour + 12].
(ampm = $a and: [hour = 12]) ifTrue: [hour := 0].
+ (aStream peekFor: $m) ifFalse: [aStream peekFor: $M ]].
-
- (aStream peekFor: $m) ifFalse: [aStream peekFor: $M ]].
^ self
hour: hour
minute: minute
second: second
nanoSecond: nanosBuffer asInteger
"Time readFrom: (ReadStream on: '2:23:09 pm')"!
More information about the Packages
mailing list