Annotation of gforth/fflib.fs, revision 1.1
1.1 ! pazsan 1: \ lib.fs shared library support package 11may97py
! 2:
! 3: \ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.
! 4:
! 5: \ This file is part of Gforth.
! 6:
! 7: \ Gforth is free software; you can redistribute it and/or
! 8: \ modify it under the terms of the GNU General Public License
! 9: \ as published by the Free Software Foundation; either version 2
! 10: \ of the License, or (at your option) any later version.
! 11:
! 12: \ This program is distributed in the hope that it will be useful,
! 13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
! 14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 15: \ GNU General Public License for more details.
! 16:
! 17: \ You should have received a copy of the GNU General Public License
! 18: \ along with this program; if not, write to the Free Software
! 19: \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
! 20:
! 21: Variable libs 0 libs !
! 22: Variable thisproc
! 23: Variable thislib
! 24: \G links between libraries
! 25:
! 26: : @lib ( lib -- )
! 27: \G obtains library handle
! 28: cell+ dup 2 cells + count open-lib
! 29: dup 0= abort" Library not found" swap ! ;
! 30:
! 31: : @proc ( lib addr -- )
! 32: \G obtains symbol address
! 33: cell+ tuck cell+ @ count rot cell+ @
! 34: lib-sym dup 0= abort" Proc not found!" swap ! ;
! 35:
! 36: : proc, ( lib -- )
! 37: \G allocates and initializes proc stub
! 38: \G stub format:
! 39: \G linked list in library
! 40: \G address of proc
! 41: \G ptr to OS name of symbol as counted string
! 42: \G threaded code for invocation
! 43: here dup thisproc !
! 44: swap 2 cells + dup @ A, !
! 45: 0 , 0 A, ;
! 46:
! 47: : proc: ( lib "name" -- )
! 48: \G Creates a named proc stub
! 49: Create proc, 0
! 50: DOES> ( x1 .. xn -- r )
! 51: dup cell+ @ swap 3 cells + >r ;
! 52:
! 53: : library ( "name" "file" -- )
! 54: \G loads library "file" and creates a proc defining word "name"
! 55: \G library format:
! 56: \G linked list of libraries
! 57: \G library handle
! 58: \G linked list of library's procs
! 59: \G OS name of library as counted string
! 60: Create here libs @ A, dup libs !
! 61: 0 , 0 A, bl sword string, @lib
! 62: DOES> ( -- ) dup thislib ! proc: ;
! 63:
! 64: : init-shared-libs ( -- )
! 65: defers 'cold libs
! 66: 0 libs BEGIN @ dup WHILE dup REPEAT drop
! 67: BEGIN dup WHILE >r
! 68: r@ @lib
! 69: r@ 2 cells + BEGIN @ dup WHILE r@ over @proc REPEAT
! 70: drop rdrop
! 71: REPEAT drop ;
! 72:
! 73: ' init-shared-libs IS 'cold
! 74:
! 75: ' av-int AConstant int
! 76: ' av-float AConstant sf
! 77: ' av-double AConstant df
! 78: ' av-longlong AConstant llong
! 79: ' av-ptr AConstant ptr
! 80:
! 81: Variable revdec revdec off
! 82: \ turn revdec on to compile bigFORTH libraries
! 83:
! 84: : rettype ( endxt startxt "name" -- )
! 85: create immediate 2,
! 86: DOES>
! 87: 2@ compile, >r
! 88: revdec @ IF
! 89: 0 >r BEGIN dup WHILE >r REPEAT drop
! 90: BEGIN r> dup WHILE compile, REPEAT drop
! 91: ELSE
! 92: BEGIN dup WHILE compile, REPEAT drop
! 93: THEN
! 94: r> compile, postpone EXIT
! 95: here thisproc @ 2 cells + ! bl sword s,
! 96: thislib @ thisproc @ @proc ;
! 97:
! 98: ' av-call-void ' av-start-void rettype (void)
! 99: ' av-call-int ' av-start-int rettype (int)
! 100: ' av-call-float ' av-start-float rettype (sf)
! 101: ' av-call-double ' av-start-double rettype (fp)
! 102: ' av-call-longlong ' av-start-longlong rettype (llong)
! 103: ' av-call-ptr ' av-start-ptr rettype (ptr)
! 104:
! 105: \ compatibility layer for old library -- use is deprecated
! 106:
! 107: Variable legacy
! 108:
! 109: \ turn legacy on for old library
! 110:
! 111: warnings @ warnings off
! 112:
! 113: : (int) ( n -- )
! 114: legacy @ IF
! 115: >r ' execute r> 0 ?DO int LOOP
! 116: THEN (int) ;
! 117: : (void) ( n -- )
! 118: legacy @ IF
! 119: >r ' execute r> 0 ?DO int LOOP
! 120: THEN (void) ;
! 121: : (float) ( n -- )
! 122: legacy @ IF
! 123: >r ' execute r> 0 ?DO df LOOP
! 124: THEN (df) ;
! 125:
! 126: warnings on
! 127:
! 128: [ifdef] testing
! 129:
! 130: library libc /lib/libc.so.6
! 131:
! 132: libc sleep int (int) sleep
! 133: libc open int int ptr (int) open
! 134: libc lseek int llong int (llong) lseek
! 135: libc read int ptr int (int) read
! 136: libc close int (int) close
! 137:
! 138: library libm /lib/libm.so.6
! 139:
! 140: libm fmodf sf sf (sf) fmodf
! 141: libm fmod df df (fp) fmod
! 142:
! 143: [then]
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>