pnp.4th revision 199767f8919635c4928607450d9e0abb932109ce
\ Copyright (c) 2000 Daniel C. Sobral <dcs@FreeBSD.org>
\ All rights reserved.
\
\ Redistribution and use in source and binary forms, with or without
\ modification, are permitted provided that the following conditions
\ are met:
\ 1. Redistributions of source code must retain the above copyright
\ notice, this list of conditions and the following disclaimer.
\ 2. Redistributions in binary form must reproduce the above copyright
\ notice, this list of conditions and the following disclaimer in the
\ documentation and/or other materials provided with the distribution.
\
\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
\ SUCH DAMAGE.
\
\ $FreeBSD$
\ The following pnp code is used in pnp.4th and pnp.c
structure: STAILQ_HEAD
ptr stqh_first \ type*
ptr stqh_last \ type**
;structure
structure: STAILQ_ENTRY
ptr stqe_next \ type*
;structure
structure: pnphandler
ptr pnph.name
ptr pnph.enumerate
;structure
structure: pnpident
ptr pnpid.ident \ char*
sizeof STAILQ_ENTRY cells member: pnpid.link \ pnpident
;structure
structure: pnpinfo \ sync with sys/boot/config/bootstrap.h
ptr pnpi.desc
int pnpi.revision
ptr pnpi.module \ (char*) module args
int pnpi.argc
ptr pnpi.argv
ptr pnpi.handler \ pnphandler
sizeof STAILQ_HEAD member: pnpi.ident \ pnpident
sizeof STAILQ_ENTRY member: pnpi.link \ pnpinfo
;structure
\ end of pnp support
pnpdevices drop
: enumerate
pnphandlers begin
dup @
while
." Probing " dup @ pnph.name @ dup strlen type ." ..." cr
0 over @ pnph.enumerate @ ccall drop
cell+
repeat
;
: summary
." PNP scan summary:" cr
pnpdevices stqh_first @
begin
dup
while
dup pnpi.ident stqh_first @ pnpid.ident @ dup strlen type
dup pnpi.desc @ ?dup if
." : "
dup strlen type
then
cr
pnpi.link stqe_next @
repeat
drop
;
: compare-pnpid ( addr addr' -- flag )
begin
over c@ over c@ <> if drop drop false exit then
over c@ over c@ and
while
char+ swap char+ swap
repeat
c@ swap c@ or 0=
;
: search-pnpid ( id -- flag )
>r
pnpdevices stqh_first @
begin ( pnpinfo )
dup
while
dup pnpi.ident stqh_first @
begin ( pnpinfo pnpident )
dup pnpid.ident @ r@ compare-pnpid
if
r> drop
\ XXX Temporary debugging message
." Found " pnpid.ident @ dup strlen type
pnpi.desc @ ?dup if
." : " dup strlen type
then cr
\ drop drop
true
exit
then
pnpid.link stqe_next @
?dup 0=
until
pnpi.link stqe_next @
repeat
r> drop
drop
false
;
: skip-space ( addr -- addr' )
begin
dup c@ bl =
over c@ 9 = or
while
char+
repeat
;
: skip-to-space ( addr -- addr' )
begin
dup c@ bl <>
over c@ 9 <> and
over c@ and
while
char+
repeat
;
: premature-end? ( addr -- addr flag )
postpone dup postpone c@ postpone 0=
postpone if postpone exit postpone then
; immediate
0 value filename
0 value timestamp
0 value id
only forth also support-functions
: (load) load ;
: check-pnpid ( -- )
line_buffer .addr @
\ Search for filename
skip-space premature-end?
dup to filename
\ Search for end of filename
skip-to-space premature-end?
0 over c! char+
\ Search for timestamp
skip-space premature-end?
dup to timestamp
skip-to-space premature-end?
0 over c! char+
\ Search for ids
begin
skip-space premature-end?
dup to id
skip-to-space dup c@ >r
0 over c! char+
id search-pnpid if
filename dup strlen 1 ['] (load) catch if
drop drop drop
." Error loading " filename dup strlen type cr
then
r> drop exit
then
r> 0=
until
;
: load-pnp
0 to end_of_file?
reset_line_reading
s" /boot/pnpid.conf" O_RDONLY fopen fd !
fd @ -1 <> if
begin
end_of_file? 0=
while
read_line
check-pnpid
repeat
fd @ fclose
then
;