Let's factor this a bit better...
: rot13 ( c - c ) dup upc [char] A [char] M between IF d# 13 + EXIT THEN dup upc [char] N [char] Z between IF d# 13 - THEN ;
: $rot13 ( str len -- ) bounds ?DO i c@ rot13 i c! LOOP ;
: rot13-str ( str len -- newstr len ) strdup 2dup $rot13 ;
Hope I didn't mess this up ;-)
Segher
On Fri, Feb 05, 2016 at 06:09:01PM +0000, Mark Cave-Ayland wrote:
diff --git a/openbios-devel/forth/lib/string.fs b/openbios-devel/forth/lib/string.fs index eb64749..97b109c 100644 --- a/openbios-devel/forth/lib/string.fs +++ b/openbios-devel/forth/lib/string.fs @@ -125,3 +125,31 @@ : parse-hex ( str len -- value ) base @ hex -rot $number if 0 then swap base ! ;
+\ ----------------------------------------------------- +\ miscellaneous functions +\ -----------------------------------------------------
+: rot13-c! ( c-addr -- )
- \ ROT13 the char at the given address
- dup c@ \ ( c-addr char )
- dup h# 41 >= over h# 5a <= and if \ A-Z
- h# 41 - h# 0d + h# 1a mod h# 41 + swap c!
- else
- dup h# 61 >= over h# 7a <= and if \ a-z
h# 61 - h# 0d + h# 1a mod h# 61 + swap c!
- else
2drop
- then
- then
+;
+: rot13-str ( str len -- newstr len )
- \ Return a copy of the string encoded ROT13
- strdup 0 begin
- 2 pick over chars + rot13-c!
- 1+ 2dup =
- until
- drop
+;