aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/boot/forth/support.4th161
1 files changed, 142 insertions, 19 deletions
diff --git a/sys/boot/forth/support.4th b/sys/boot/forth/support.4th
index 5b72b1c728f5..0095ffc9eb5d 100644
--- a/sys/boot/forth/support.4th
+++ b/sys/boot/forth/support.4th
@@ -82,9 +82,15 @@
\ Crude structure support
-: structure: create here 0 , 0 does> create @ allot ;
+: structure:
+ create here 0 , ['] drop , 0
+ does> create here swap dup @ allot cell+ @ execute
+;
: member: create dup , over , + does> cell+ @ + ;
: ;structure swap ! ;
+: constructor! >body cell+ ! ;
+: constructor: over :noname ;
+: ;constructor postpone ; swap cell+ ! ; immediate
: sizeof ' >body @ state @ if postpone literal then ; immediate
: offsetof ' >body cell+ @ state @ if postpone literal then ; immediate
: ptr 1 cells member: ;
@@ -95,8 +101,13 @@
structure: string
ptr .addr
int .len
+ constructor:
+ 0 over .addr !
+ 0 swap .len !
+ ;constructor
;structure
+
\ Module options linked list
structure: module
@@ -111,12 +122,85 @@ structure: module
ptr module.next
;structure
+\ Internal loader structures
+structure: preloaded_file
+ ptr pf.name
+ ptr pf.type
+ ptr pf.args
+ ptr pf.metadata \ file_metadata
+ int pf.loader
+ int pf.addr
+ int pf.size
+ ptr pf.modules \ kernel_module
+ ptr pf.next \ preloaded_file
+;structure
+
+structure: kernel_module
+ ptr km.name
+ \ ptr km.args
+ ptr km.fp \ preloaded_file
+ ptr km.next \ kernel_module
+;structure
+
+structure: file_metadata
+ int md.size
+ 2 member: md.type \ this is not ANS Forth compatible (XXX)
+ ptr md.next \ file_metadata
+ 0 member: md.data \ variable size
+;structure
+
+structure: config_resource
+ ptr cf.name
+ int cf.type
+0 constant RES_INT
+1 constant RES_STRING
+2 constant RES_LONG
+ 2 cells member: u
+;structure
+
+structure: config_device
+ ptr cd.name
+ int cd.unit
+ int cd.resource_count
+ ptr cd.resources \ config_resource
+;structure
+
+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
+ 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
+
\ Global variables
string conf_files
string password
-create module_options sizeof module.next allot
-create last_module_option sizeof module.next allot
+create module_options sizeof module.next allot 0 module_options !
+create last_module_option sizeof module.next allot 0 last_module_option !
0 value verbose?
\ Support string functions
@@ -191,17 +275,33 @@ only forth also support-functions definitions
string name_buffer
string value_buffer
+\ Line by line file reading functions
+\
+\ exported:
+\ line_buffer
+\ end_of_file?
+\ fd
+\ read_line
+\ reset_line_reading
+
+vocabulary line-reading
+also line-reading definitions also
+
\ File data temporary storage
-string line_buffer
string read_buffer
0 value read_buffer_ptr
\ File's line reading function
+support-functions definitions
+
+string line_buffer
0 value end_of_file?
variable fd
+line-reading definitions
+
: skip_newlines
begin
read_buffer .len @ read_buffer_ptr >
@@ -276,10 +376,19 @@ variable fd
;
: reset_line_buffer
+ line_buffer .addr @ ?dup if
+ free-memory
+ then
0 line_buffer .addr !
0 line_buffer .len !
;
+support-functions definitions
+
+: reset_line_reading
+ 0 to read_buffer_ptr
+;
+
: read_line
reset_line_buffer
skip_newlines
@@ -291,6 +400,8 @@ variable fd
repeat
;
+only forth also support-functions definitions
+
\ Conf file line parser:
\ <line> ::= <spaces><name><spaces>'='<spaces><value><spaces>[<comment>] |
\ <spaces>[<comment>]
@@ -298,11 +409,26 @@ variable fd
\ <value> ::= '"'{<character_set>|'\'<anything>}'"' | <name>
\ <character_set> ::= ASCII 32 to 126, except '\' and '"'
\ <comment> ::= '#'{<anything>}
+\
+\ exported:
+\ line_pointer
+\ process_conf
-0 value parsing_function
+0 value line_pointer
+
+vocabulary file-processing
+also file-processing definitions
+\ parser functions
+\
+\ exported:
+\ get_assignment
+
+vocabulary parser
+also parser definitions also
+
+0 value parsing_function
0 value end_of_line
-0 value line_pointer
: end_of_line?
line_pointer end_of_line =
@@ -482,6 +608,8 @@ variable fd
end_of_line? 0= if syntax_error throw then
;
+file-processing definitions
+
: get_assignment
line_buffer .addr @ line_buffer .len @ + to end_of_line
line_buffer .addr @ to line_pointer
@@ -497,6 +625,8 @@ variable fd
or or 0= if syntax_error throw then
;
+only forth also support-functions also file-processing definitions also
+
\ Process line
: assignment_type? ( addr len -- flag )
@@ -764,10 +894,9 @@ variable fd
\ not allocated, it's value (0) is used as flag.
: free_buffers
- line_buffer .addr @ dup if free then
name_buffer .addr @ dup if free then
value_buffer .addr @ dup if free then
- or or if free_error throw then
+ or if free_error throw then
;
: reset_assignment_buffers
@@ -779,6 +908,8 @@ variable fd
\ Higher level file processing
+support-functions definitions
+
: process_conf
begin
end_of_file? 0=
@@ -792,6 +923,8 @@ variable fd
repeat
;
+only forth also support-functions definitions
+
: create_null_terminated_string { addr len -- addr' len }
len char+ allocate if out_of_memory throw then
>r
@@ -804,7 +937,7 @@ variable fd
: load_conf ( addr len -- )
0 to end_of_file?
- 0 to read_buffer_ptr
+ reset_line_reading
create_null_terminated_string
over >r
fopen fd !
@@ -815,15 +948,6 @@ variable fd
throw
;
-: initialize_support
- 0 read_buffer .addr !
- 0 conf_files .addr !
- 0 password .addr !
- 0 module_options !
- 0 last_module_option !
- 0 to verbose?
-;
-
: print_line
line_buffer .addr @ line_buffer .len @ type cr
;
@@ -1097,7 +1221,6 @@ variable current_conf_files
\ Additional functions used in "start"
: initialize ( addr len -- )
- initialize_support
strdup conf_files .len ! conf_files .addr !
;