Annotation of gforth/ds2texi.fs, revision 1.8
1.1 anton 1: \ documentation source to texi format converter
2:
3: \ documentation source can contain lines in the form `doc-word' and
4: \ `short-word'. These are converted to appropriate full or short
5: \ (without the description) glossary entries for word.
6:
7: \ The glossary entries are generated from data present in the wordlist
8: \ `documentation'. Each word resides there under its own name.
9:
1.2 pazsan 10: script? [IF]
11: warnings off
1.7 anton 12: require search-order.fs
1.8 ! anton 13: require glocals.fs
1.7 anton 14: require float.fs
15: require struct.fs
16: require debugging.fs
1.2 pazsan 17: [THEN]
18:
1.1 anton 19: wordlist constant documentation
20:
21: struct
22: 2 cells: field doc-name
23: 2 cells: field doc-stack-effect
24: 2 cells: field doc-wordset
25: 2 cells: field doc-pronounciation
26: 2 cells: field doc-description
27: end-struct doc-entry
28:
1.4 anton 29: create description-buffer 4096 chars allot
30:
31: : get-description ( -- addr u )
32: description-buffer
33: begin
34: refill
35: while
36: source nip
37: while
38: source swap >r 2dup r> -rot cmove
39: chars +
40: #lf over c! char+
41: repeat then
42: description-buffer tuck - ;
43:
1.8 ! anton 44: : replace-_ ( c-addr u -- )
! 45: \ replaces _ with -
! 46: chars bounds
! 47: +DO
! 48: i c@ [char] _ =
! 49: if
! 50: [char] - i c!
! 51: endif
! 52: 1 chars
! 53: +loop ;
! 54:
! 55: : condition-stack-effect ( c-addr1 u1 -- c-addr2 u2 )
! 56: save-string 2dup replace-_ ;
! 57:
! 58: : condition-wordset ( c-addr1 u1 -- c-addr2 u2 )
! 59: dup 0=
! 60: if
! 61: 2drop s" unknown"
! 62: else
! 63: save-string
! 64: endif ;
! 65:
! 66: : condition-pronounciation ( c-addr1 u1 -- c-addr2 u2 )
! 67: save-string 2dup replace-_ ;
! 68:
1.4 anton 69: : make-doc ( -- )
70: get-current documentation set-current
71: create
72: last @ name>string 2, \ name
73: [char] ) parse save-string 2, \ stack-effect
1.8 ! anton 74: bl parse-word condition-wordset 2, \ wordset
1.4 anton 75: bl parse-word dup \ pronounciation
76: if
1.8 ! anton 77: condition-pronounciation
1.4 anton 78: else
79: 2drop last @ name>string
80: endif
81: 2,
82: get-description save-string 2,
83: set-current ;
84:
1.1 anton 85: : emittexi ( c -- )
86: >r
87: s" @{}" r@ scan 0<>
88: if
89: [char] @ emit
90: endif
91: drop r> emit ;
92:
93: : typetexi ( addr u -- )
94: 0
95: ?do
96: dup c@ emittexi
97: char+
98: loop
99: drop ;
100:
101: : print-short ( doc-entry -- )
1.7 anton 102: >r
103: ." @findex "
104: r@ doc-name 2@ typetexi
105: ." @var{ " r@ doc-stack-effect 2@ type ." } "
106: r@ doc-wordset 2@ type
107: cr
108: ." @format" cr
1.1 anton 109: ." @code{" r@ doc-name 2@ typetexi ." } "
110: ." @i{" r@ doc-stack-effect 2@ type ." } "
111: r@ doc-wordset 2@ type ." ``"
1.3 anton 112: r@ doc-pronounciation 2@ type ." ''" cr ." @end format" cr
1.1 anton 113: rdrop ;
114:
115: : print-doc ( doc-entry -- )
116: >r
117: r@ print-short
118: r@ doc-description 2@ dup 0<>
119: if
1.7 anton 120: ." @iftex" cr ." @vskip-3ex" cr ." @end iftex" cr
121: type cr cr \ ." @ifinfo" cr ." @*" cr ." @end ifinfo" cr cr
1.1 anton 122: else
123: 2drop cr
124: endif
125: rdrop ;
126:
127: : do-doc ( addr1 u1 addr2 u2 xt -- f )
128: \ xt is the word to be executed if addr1 u1 is a string starting
129: \ with the prefix addr2 u2 and continuing with a word in the
130: \ wordlist `documentation'. f is true if xt is executed.
131: >r dup >r
132: 3 pick over compare 0=
133: if \ addr2 u2 is a prefix of addr1 u1
134: r> /string documentation search-wordlist
135: if \ the rest of addr1 u1 is in documentation
136: execute r> execute true
137: else
138: rdrop false
139: endif
140: else
141: 2drop 2rdrop false
142: endif ;
143:
144: : process-line ( addr u -- )
145: 2dup s" doc-" ['] print-doc do-doc 0=
146: if
147: 2dup s" short-" ['] print-short do-doc 0=
148: if
149: type cr EXIT
150: endif
151: endif
152: 2drop ;
153:
154: 1024 constant doclinelength
155:
156: create docline doclinelength chars allot
157:
158: : ds2texi ( file-id -- )
159: >r
160: begin
161: docline doclinelength r@ read-line throw
162: while
163: dup doclinelength = abort" docline too long"
164: docline swap process-line
165: repeat
166: drop rdrop ;
1.2 pazsan 167:
1.8 ! anton 168: : compare-ci ( addr1 u1 addr2 u2 -- n )
! 169: \ case insensitive string compare
! 170: 2 pick swap -
! 171: ?dup-0=-if
! 172: capscomp
! 173: else
! 174: nip nip nip
! 175: 0<
! 176: if
! 177: -1
! 178: else
! 179: 1
! 180: endif
! 181: endif ;
! 182:
! 183: : answord ( "name wordset pronounciation" -- )
! 184: \ check the documentaion of an ans word
! 185: name { D: wordname }
! 186: name { D: wordset }
! 187: name { D: pronounciation }
! 188: wordname documentation search-wordlist
! 189: if
! 190: execute { doc }
! 191: wordset doc doc-wordset 2@ compare-ci
! 192: if
! 193: ." wordset: " wordname type ." : '" doc doc-wordset 2@ type ." ' instead of '" wordset type ." '" cr
! 194: endif
! 195: pronounciation doc doc-pronounciation 2@ compare-ci
! 196: if
! 197: ." pronounciation: " wordname type ." : '" doc doc-pronounciation 2@ type ." ' instead of '" pronounciation type ." '" cr
! 198: endif
! 199: else
! 200: ." undocumented: " wordname type cr
! 201: endif ;
! 202:
1.2 pazsan 203: script? [IF]
1.7 anton 204: require prims2x.fs
1.2 pazsan 205: s" primitives.b" ' register-doc process-file
1.8 ! anton 206: require crossdoc.fd
1.5 pazsan 207: require doc.fd
1.2 pazsan 208: [THEN]
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>