--- gforth/ds2texi.fs 1995/09/15 14:52:49 1.6 +++ gforth/ds2texi.fs 2003/01/26 20:56:37 1.26 @@ -1,5 +1,23 @@ \ documentation source to texi format converter +\ Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. + +\ This file is part of Gforth. + +\ Gforth is free software; you can redistribute it and/or +\ modify it under the terms of the GNU General Public License +\ as published by the Free Software Foundation; either version 2 +\ of the License, or (at your option) any later version. + +\ This program is distributed in the hope that it will be useful, +\ but WITHOUT ANY WARRANTY; without even the implied warranty of +\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +\ GNU General Public License for more details. + +\ You should have received a copy of the GNU General Public License +\ along with this program; if not, write to the Free Software +\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + \ documentation source can contain lines in the form `doc-word' and \ `short-word'. These are converted to appropriate full or short \ (without the description) glossary entries for word. @@ -8,20 +26,23 @@ \ `documentation'. Each word resides there under its own name. script? [IF] -warnings off -include search-order.fs -include struct.fs -include debugging.fs + warnings off + require search.fs + require extend.fs + require glocals.fs + require float.fs + require struct.fs + require debugs.fs [THEN] wordlist constant documentation struct - 2 cells: field doc-name - 2 cells: field doc-stack-effect - 2 cells: field doc-wordset - 2 cells: field doc-pronounciation - 2 cells: field doc-description + cell% 2* field doc-name + cell% 2* field doc-stack-effect + cell% 2* field doc-wordset + cell% 2* field doc-pronounciation + cell% 2* field doc-description end-struct doc-entry create description-buffer 4096 chars allot @@ -39,20 +60,51 @@ create description-buffer 4096 chars all repeat then description-buffer tuck - ; +: skip-prefix ( c-addr1 u1 -- c-addr2 u2 ) + 2dup s" --" string-prefix? + IF + [char] - skip [char] - scan 1 /string + THEN ; + +: replace-_ ( c-addr u -- ) + \ replaces _ with - + chars bounds + +DO + i c@ [char] _ = + if + [char] - i c! + endif + 1 chars + +loop ; + +: condition-stack-effect ( c-addr1 u1 -- c-addr2 u2 ) + save-mem 2dup replace-_ ; + +: condition-wordset ( c-addr1 u1 -- c-addr2 u2 ) + dup 0= + if + 2drop s" unknown" + else + save-mem + endif ; + +: condition-pronounciation ( c-addr1 u1 -- c-addr2 u2 ) + save-mem 2dup replace-_ ; + : make-doc ( -- ) get-current documentation set-current create - last @ name>string 2, \ name - [char] ) parse save-string 2, \ stack-effect - bl parse-word save-string 2, \ wordset - bl parse-word dup \ pronounciation + last @ name>string skip-prefix 2, \ name + [char] ) parse save-mem 2, \ stack-effect + bl sword condition-wordset 2, \ wordset + bl sword dup \ pronounciation if - save-string + condition-pronounciation else - 2drop last @ name>string + 2drop last @ name>string skip-prefix endif 2, - get-description save-string 2, + get-description save-mem 2, set-current ; : emittexi ( c -- ) @@ -72,12 +124,27 @@ create description-buffer 4096 chars all drop ; : print-short ( doc-entry -- ) - >r ." @format" cr + >r + ." @findex " + r@ doc-name 2@ typetexi + ." @var{ " r@ doc-stack-effect 2@ type ." } " + r@ doc-wordset 2@ type + cr + ." @cindex " + ." @code{" r@ doc-name 2@ typetexi ." }" + cr + r@ doc-name 2@ drop c@ [char] : <> if + \ cut out words starting with :, info-lookup cannot handle them + \ !! deal with : by replacing it here and in info-lookup? + ." @kindex " + r@ doc-name 2@ typetexi + cr + endif + ." @format" cr ." @code{" r@ doc-name 2@ typetexi ." } " ." @i{" r@ doc-stack-effect 2@ type ." } " r@ doc-wordset 2@ type ." ``" r@ doc-pronounciation 2@ type ." ''" cr ." @end format" cr - ." @findex " r@ doc-name 2@ typetexi cr rdrop ; : print-doc ( doc-entry -- ) @@ -85,7 +152,9 @@ create description-buffer 4096 chars all r@ print-short r@ doc-description 2@ dup 0<> if - type ." @*" cr + \ ." @iftex" cr ." @vskip-0ex" cr ." @end iftex" cr + type cr cr + \ ." @ifinfo" cr ." @*" cr ." @end ifinfo" cr cr else 2drop cr endif @@ -96,7 +165,7 @@ create description-buffer 4096 chars all \ with the prefix addr2 u2 and continuing with a word in the \ wordlist `documentation'. f is true if xt is executed. >r dup >r - 3 pick over compare 0= + 3 pick over str= if \ addr2 u2 is a prefix of addr1 u1 r> /string documentation search-wordlist if \ the rest of addr1 u1 is in documentation @@ -132,10 +201,38 @@ create docline doclinelength chars allot repeat drop rdrop ; -script? [IF] -include prims2x.fs -s" primitives.b" ' register-doc process-file -require doc.fd -require crossdoc.fd -s" gforth.ds" r/o open-file throw ds2texi bye -[THEN] +: compare-ci ( addr1 u1 addr2 u2 -- n ) + \ case insensitive string compare + \ !! works correctly only for comparing for equality + 2 pick swap - + ?dup-0=-if + capscomp + else + nip nip nip + 0< + if + -1 + else + 1 + endif + endif ; + +: answord ( "name wordset pronounciation" -- ) + \ check the documentaion of an ans word + name { D: wordname } + name { D: wordset } + name { D: pronounciation } + wordname documentation search-wordlist + if + execute { doc } + wordset doc doc-wordset 2@ compare-ci + if + ." wordset: " wordname type ." : '" doc doc-wordset 2@ type ." ' instead of '" wordset type ." '" cr + endif + pronounciation doc doc-pronounciation 2@ compare-ci + if + ." pronounciation: " wordname type ." : '" doc doc-pronounciation 2@ type ." ' instead of '" pronounciation type ." '" cr + endif + else + ." undocumented: " wordname type cr + endif ;