[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gforth] definition of '+place' in <other.fs>
From: |
Marcos Cruz |
Subject: |
[gforth] definition of '+place' in <other.fs> |
Date: |
Sun, 10 Nov 2013 03:15:59 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
I've realized '+place' is defined in two different files and ways. 'see
+place' shows the actual definition is that of <cross.fs>; the second
definition is in <other.fs>:
: +place ( adr len adr )
2dup c@ + over c!
dup c@ char+ + swap move ;
I discovered it doesn't work fine. In order to find the problem, I
dissected it:
: +place ( ca1 len1 ca2 )
\ Version defined in Gforth's <other.fs>, buggy.
\ len3 = length of the final string
\ ca4 = address after the string at ca2
2dup c@ ( ca1 len1 ca2 len1 len2 )
+ ( ca1 len1 ca2 len3 )
over c! ( ca1 len1 ca2 )
\ xxx fixme len2 is still needed, but it has been overriden with len3
dup c@ ( ca1 len1 ca2 len3 )
char+ + ( ca1 len1 ca4 )
swap move
;
The length of the second string has to be saved to calculate the
destination address:
: +place ( ca1 len1 ca2 )
\ Version defined in Gforth's <other.fs>, fixed.
\ len3 = length of the final string
\ ca4 = address after the string at ca2
2dup c@ ( ca1 len1 ca2 len1 len2 )
dup >r ( ca1 len1 ca2 len1 len2 ) ( R: len2 )
+ ( ca1 len1 ca2 len3 )
over c! ( ca1 len1 ca2 )
r> ( ca1 len1 ca2 len2 ) ( R: )
char+ + ( ca1 len1 ca4 )
swap move
;
The definition in <cross.fs> works fine. I dissected it too:
: +place ( ca1 len1 ca2 )
\ Version defined in Gforth's <cross.fs>.
\ len3 = length of the final string
\ ca4 = address after the string at ca2
2dup >r >r ( ca1 len1 ca2 ) ( R: ca2 len1 )
dup c@ ( ca1 len1 ca2 len2 )
char+ + ( ca1 len1 ca4 )
swap move
r> r> ( len1 ca2 ) ( R: )
dup c@ ( len1 ca2 len2 )
rot + ( ca2 len3 )
swap c!
;
At first sight the fixed definition of <other.fs> seems faster, with
less stack operations:
: +place ( ca1 len1 ca2 )
2dup c@ dup >r + over c! r> char+ + swap move
;
--
Marcos Cruz
http://programandala.net
- [gforth] definition of '+place' in <other.fs>,
Marcos Cruz <=