--- gforth/fi2c.fs 2007/02/17 21:04:15 1.15 +++ gforth/fi2c.fs 2010/01/08 18:54:34 1.23 @@ -1,12 +1,12 @@ \ Convert image to C include file -\ Copyright (C) 1998,1999,2002,2003 Free Software Foundation, Inc. +\ Copyright (C) 1998,1999,2002,2003,2007 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 +\ as published by the Free Software Foundation, either version 3 \ of the License, or (at your option) any later version. \ This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ \ 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. +\ along with this program. If not, see http://www.gnu.org/licenses/. require string.fs @@ -27,19 +26,69 @@ Create magicbuf 8 allot Create groups 32 0 [DO] 512 cells allocate throw dup 512 cells erase , [LOOP] +\ we define it ans like... +wordlist Constant target-environment + +\ save information of current dictionary to restore with environ> +Variable env-current + +: >ENVIRON get-current env-current ! target-environment set-current + also target-environment context ! ; +: ENVIRON> previous env-current @ set-current ; + +: t-env? ( addr len -- [ x ] true | false ) +\G returns the content of environment variable and true or +\G false if not present + target-environment search-wordlist + IF EXECUTE true ELSE false THEN ; + +: $has? ( addr u -- x | false ) +\G returns the content of environment variable +\G or false if not present + t-env? dup IF drop THEN ; + +' Value Alias DefaultValue +' Value Alias SetValue + +: kb 1024 * ; + +' noop alias T +' noop alias H + +: has? parse-name 2drop true ; + +include machpc.fs +ENVIRON> + : prefix? ( string u1 prefix u2 -- flag ) tuck 2>r umin 2r> str= ; +s" NULL" groups @ cell+ $! + +: scan-ifs ( fd -- ) >r 1 + BEGIN pad $100 r@ read-line throw WHILE + pad swap + 2dup s" #ifdef HAS_" prefix? >r + 2dup s" #else" prefix? >r + s" #endif" prefix? r> or r> - + + dup 0= UNTIL THEN rdrop drop ; + : read-groups ( addr u -- ) - r/o open-file throw >r 0 0 + r/o open-file throw >r 0 2 BEGIN pad $100 r@ read-line throw WHILE - pad swap 2dup s" GROUP(" prefix? - IF 2drop drop 1+ 0 ELSE - 2dup s" INST_ADDR(" prefix? - IF &10 /string 2dup ') scan nip - - 2over cells swap cells groups + @ + $! - 1+ - ELSE 2drop THEN THEN + pad swap + 2dup s" #ifdef HAS_" prefix? + IF + 11 /string $has? 0= IF r@ scan-ifs THEN + ELSE 2dup s" #else" prefix? + IF 2drop r@ scan-ifs + ELSE 2dup s" GROUP(" prefix? + IF 2drop drop 1+ 0 ELSE + 2dup s" INST_ADDR(" prefix? + IF &10 /string 2dup ') scan nip - + 2over cells swap cells groups + @ + $! + 1+ + ELSE 2drop THEN THEN THEN THEN REPEAT 2drop r> close-file throw ; s" prim_lab.i" read-groups @@ -62,27 +111,6 @@ Variable au THEN dup 1 8 tcell @ * 1- lshift and negate or ; -1 cells 4 = [IF] -: bswap ( n -- n' ) bswap? @ 0= ?EXIT 0 - over 24 rshift $FF and or - over 8 rshift $FF00 and or - over 8 lshift $FF0000 and or - over 24 lshift $FF000000 and or nip ; -[THEN] - -1 cells 8 = [IF] -: bswap ( n -- n' ) bswap? @ 0= ?EXIT 0 - over 56 rshift $FF and or - over 40 rshift $FF00 and or - over 24 rshift $FF0000 and or - over 8 rshift $FF000000 and or - over 8 lshift $FF00000000 and or - over 24 lshift $FF0000000000 and or - over 40 lshift $FF000000000000 and or - over 56 lshift $FF00000000000000 and or - nip ; -[THEN] - : search-magic ( fd -- ) >r BEGIN magicbuf 8 r@ read-file throw 8 = WHILE magicbuf s" Gforth3" tuck str= UNTIL @@ -124,23 +152,27 @@ Variable bitmap-chars I 1 + I' min I ?DO space image I tcell @ * + t@ bitmap I bit@ IF dup 0< IF - negate dup $3E00 and 9 rshift swap $1FF and - over cells groups + @ over $1FF and cells + - dup @ 0= IF drop - 2dup 0 8 d= IF 2drop s" doesjump" + dup -1 = IF + drop ." NULL" + ELSE + negate dup $3E00 and 9 rshift swap $1FF and + over cells groups + @ over $1FF and cells + + dup @ 0= IF drop + 2dup 0 8 d= IF 2drop s" doesjump" + ELSE + <# '] hold 0 #S 2drop '[ hold '] hold + 0 #S '[ hold #> + THEN ELSE - <# '] hold 0 #S 2drop '[ hold '] hold - 0 #S '[ hold #> + >r 2drop r> $@ THEN - ELSE - >r 2drop r> $@ + ." INST_ADDR(" type ." )" THEN - ." &&" type ELSE - ." image+" tcell @ / .08x + dup IF ." ((void*)image)+" $10 - THEN .08x THEN ELSE - .08x + ." (void*)" .08x THEN ." ," LOOP cr 1 +LOOP ; @@ -166,8 +198,10 @@ Variable bitmap-chars : fi2c ( addr u -- ) base @ >r hex read-image - ." #include " '" emit ." forth.h" '" emit cr - ." void* image[" .imagesize ." ] = {" cr .image ." };" cr + \ .\" const static __attribute__ ((__section__ (\".rodata\"))) void* image[" .imagesize ." ] = {" cr .image ." };" cr + .\" static void* image[" .imagesize ." ] = {" cr .image ." };" cr + ." #ifdef USE_RELOC" cr ." const char reloc_bits[" .relocsize ." ] = {" cr .reloc ." };" cr + ." #endif" cr r> base ! ;