\ 4tH library - S>ESCAPE - Copyright 2008 J.L. Bezemer \ You can redistribute this file and/or modify it under \ the terms of the GNU General Public License \ RfD: Escaped Strings S\" \ 23 November 2008, Stephen Pelc/Peter Knaggs \ The word S" 6.1.2165 is the primary word for generating strings. \ In more complex applications, it suffers from several deficiencies: \ 1) the S" string can only contain printable characters, \ 2) the S" string cannot contain the '"' character, \ 3) the S" string cannot be used with wide characters as discussed \ in the Forth 200x internationalisation and XCHAR proposals. \ Since 4tH cannot offer the functionality of this proposal without \ major surgery this word was created. It allows you to convert a S" \ string containing escape characters to an escaped string. Note this \ only works at runtime. \ Typical use: S" \qThis is the end\q" S>ESCAPE [UNDEFINED] S>ESCAPE [IF] \ Table of translations for \a..\z. offset \escape ( n -- c) 7 c, \ \a 8 c, \ \b char c c, \ \c char d c, \ \d 27 c, \ \e 12 c, \ \f char g c, \ \g char h c, \ \h char i c, \ \i char j c, \ \j char k c, \ \k 10 c, \ \l char m c, \ \m 10 c, \ \n (Unices only) char o c, \ \o char p c, \ \p char " c, \ \q 13 c, \ \r char s c, \ \s 9 c, \ \t char u c, \ \u 11 c, \ \v char w c, \ \w char x c, \ \x char y c, \ \y 0 c, \ \z : s>escape ( a1 n1 -- a1 n2) over dup >r >r \ setup loop parameters begin dup \ limit reached? while \ if not over c@ dup [char] \ = \ is it a backslash if \ is it an escaped character drop chop over c@ dup [char] a - max-n and 26 < if [char] a - \escape then \ if so, escape character then r@ c! chop r> char+ >r \ save and update parameters repeat \ next character drop drop r> r> tuck - \ cleanup stacks ; [DEFINED] 4TH# [IF] hide \escape [THEN] [THEN]