| \ converts primitives to, e.g., C code |
\ converts primitives to, e.g., C code |
| |
|
| \ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007 Free Software Foundation, Inc. |
| |
|
| \ This file is part of Gforth. |
\ This file is part of Gforth. |
| |
|
| \ Gforth is free software; you can redistribute it and/or |
\ Gforth is free software; you can redistribute it and/or |
| \ modify it under the terms of the GNU General Public License |
\ modify it under the terms of the GNU General Public License |
| \ as published by the Free Software Foundation; either version 2 |
\ as published by the Free Software Foundation, either version 3 |
| \ of the License, or (at your option) any later version. |
\ of the License, or (at your option) any later version. |
| |
|
| \ This program is distributed in the hope that it will be useful, |
\ This program is distributed in the hope that it will be useful, |
| \ GNU General Public License for more details. |
\ GNU General Public License for more details. |
| |
|
| \ You should have received a copy of the GNU General Public License |
\ You should have received a copy of the GNU General Public License |
| \ along with this program; if not, write to the Free Software |
\ along with this program. If not, see http://www.gnu.org/licenses/. |
| \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
| |
|
| |
|
| \ This is not very nice (hard limits, no checking, assumes 1 chars = 1). |
\ This is not very nice (hard limits, no checking, assumes 1 chars = 1). |
| \ for backwards compatibility, jaw |
\ for backwards compatibility, jaw |
| require compat/strcomp.fs |
require compat/strcomp.fs |
| |
|
| |
[undefined] outfile-execute [if] |
| |
: outfile-execute ( ... xt file-id -- ... ) |
| |
\ unsafe replacement |
| |
outfile-id >r to outfile-id execute r> to outfile-id ; |
| |
[then] |
| |
|
| warnings off |
warnings off |
| |
|
| \ redefinitions of kernel words not present in gforth-0.6.1 |
\ redefinitions of kernel words not present in gforth-0.6.1 |
| over - type cr |
over - type cr |
| line-start @ rawinput @ over - typewhite ." ^" cr ; |
line-start @ rawinput @ over - typewhite ." ^" cr ; |
| |
|
| |
: print-error { addr u -- } |
| |
filename 2@ type ." :" line @ 0 .r ." : " addr u type cr |
| |
print-error-line ; |
| |
|
| : ?print-error { f addr u -- } |
: ?print-error { f addr u -- } |
| f ?not? if |
f ?not? if |
| outfile-id >r try |
addr u ['] print-error stderr outfile-execute |
| stderr to outfile-id |
|
| filename 2@ type ." :" line @ 0 .r ." : " addr u type cr |
|
| print-error-line |
|
| 0 |
|
| recover endtry |
|
| r> to outfile-id throw |
|
| 1 (bye) \ abort |
1 (bye) \ abort |
| endif ; |
endif ; |
| |
|
| 2variable last-name-filename |
2variable last-name-filename |
| Variable function-number 0 function-number ! |
Variable function-number 0 function-number ! |
| Variable function-old 0 function-old ! |
Variable function-old 0 function-old ! |
| : function-diff ( n -- ) |
: function-diff ( -- ) |
| ." GROUPADD(" function-number @ function-old @ - 0 .r ." )" cr |
." GROUPADD(" function-number @ function-old @ - 0 .r ." )" cr |
| function-number @ function-old ! ; |
function-number @ function-old ! ; |
| : forth-fdiff ( -- ) |
: forth-fdiff ( -- ) |
| ." vm_two" |
." vm_two" |
| r@ item-stack-type-name type ." 2" |
r@ item-stack-type-name type ." 2" |
| r@ item-type @ print-type-prefix ." (" |
r@ item-type @ print-type-prefix ." (" |
| r@ item-in-index r@ item-stack @ 2dup ." (Cell)" stack-read |
r@ item-in-index r@ item-stack @ 2dup stack-read |
| ." , " -1 under+ ." (Cell)" stack-read |
." , " -1 under+ stack-read |
| ." , " r@ item-name 2@ type |
." , " r@ item-name 2@ type |
| ." )" cr |
." )" cr |
| rdrop ; |
rdrop ; |
| set-current |
set-current |
| |
|
| create ...-item ( -- addr ) \ just used for letting stack-prefixes work on it |
create ...-item ( -- addr ) \ just used for letting stack-prefixes work on it |
| item% %allot \ stores the stack temporarily until used by ... |
item% %allot drop \ stores the stack temporarily until used by ... |
| |
|
| : init-item1 ( addr1 addr u -- addr2 ) |
: init-item1 ( addr1 addr u -- addr2 ) |
| \ initialize item at addr1 with name addr u, next item is at addr2 |
\ initialize item at addr1 with name addr u, next item is at addr2 |
| stores ; |
stores ; |
| |
|
| : output-combined-tail ( -- ) |
: output-combined-tail ( -- ) |
| part-output-c-tail |
|
| in-part @ >r in-part off |
in-part @ >r in-part off |
| |
part-output-c-tail |
| combined ['] output-c-tail-no-stores prim-context |
combined ['] output-c-tail-no-stores prim-context |
| r> in-part ! ; |
r> in-part ! ; |
| |
|
| |
|
| (( ` + {{ start }} nonl ** {{ end |
(( ` + {{ start }} nonl ** {{ end |
| dup |
dup |
| IF c-flag @ |
|
| IF |
IF |
| |
c-flag @ IF |
| function-diff |
function-diff |
| ." #ifdef HAS_" bounds ?DO I c@ toupper emit LOOP cr |
." #ifdef HAS_" 2dup bounds ?DO I c@ toupper emit LOOP cr |
| |
THEN |
| |
forth-flag @ IF |
| |
forth-fdiff ." has? " 2dup type ." [IF]" cr |
| THEN |
THEN |
| forth-flag @ |
2drop |
| IF forth-fdiff ." has? " type ." [IF]" cr THEN |
ELSE |
| ELSE 2drop |
2drop |
| c-flag @ IF |
c-flag @ IF |
| function-diff ." #endif" cr THEN |
function-diff ." #endif" cr THEN |
| forth-flag @ IF forth-fdiff ." [THEN]" cr THEN |
forth-flag @ IF forth-fdiff ." [THEN]" cr THEN |
| |
|
| (( (( ` g || ` G )) {{ start }} nonl ** |
(( (( ` g || ` G )) {{ start }} nonl ** |
| {{ end |
{{ end |
| forth-flag @ IF forth-fdiff ." group " type cr THEN |
forth-flag @ IF forth-fdiff ." group " 2dup type cr THEN |
| c-flag @ IF function-diff |
c-flag @ IF function-diff |
| ." GROUP(" type ." , " function-number @ 0 .r ." )" cr THEN }} |
." GROUP(" 2dup type ." , " function-number @ 0 .r ." )" cr THEN |
| |
2drop }} |
| )) <- group-comment |
)) <- group-comment |
| |
|
| (( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |
(( (( eval-comment || forth-comment || c-comment || else-comment || if-comment || group-comment )) ?? nonl ** )) <- comment-body |
| (( {{ prim create-prim prim init-simple }} |
(( {{ prim create-prim prim init-simple }} |
| ` ( white ** {{ start }} stack-effect {{ end prim prim-stack-string 2! }} ` ) white ** |
` ( white ** {{ start }} stack-effect {{ end prim prim-stack-string 2! }} ` ) white ** |
| (( {{ start }} forth-ident {{ end prim prim-wordset 2! }} white ** |
(( {{ start }} forth-ident {{ end prim prim-wordset 2! }} white ** |
| (( {{ start }} c-ident {{ end 2dup prim-c-name-2! }} )) ?? |
(( {{ start }} c-ident {{ end prim-c-name-2! }} )) ?? |
| )) ?? nleof |
)) ?? nleof |
| (( ` " ` " {{ start }} (( noquote ++ ` " )) ++ {{ end 1- prim prim-doc 2! }} ` " white ** nleof )) ?? |
(( ` " ` " {{ start }} (( noquote ++ ` " )) ++ {{ end 1- prim prim-doc 2! }} ` " white ** nleof )) ?? |
| {{ skipsynclines off line @ c-line ! filename 2@ c-filename 2! start }} |
{{ skipsynclines off line @ c-line ! filename 2@ c-filename 2! start }} |