All pastes #471042 Raw Edit

Something

public text v1 · immutable
·published 2007-05-04 17:49 UTC
rendered paste body
\ reserves one byte for the length and stores the type
\ addr is the position of the length byte
: start-descriptor ( type -- addr )
	here 0 c, swap c,
;

\ stores the length
: end-descriptor ( addr -- )
	dup here swap -
	swap c!
;

\ some example types
1 constant type-1
2 constant type-2

\ start of the descriptor table
create descriptors

\ this is a type-1 descriptor
type-1 start-descriptor
111 , 64335 , 23432 , 8734 ,
end-descriptor

\ another one
type-1 start-descriptor
222 , 32423 , 2342 ,
end-descriptor

\ and a type-2 descriptor
type-2 start-descriptor
333 , 9723 , 3432 , 32432 , 23456 ,
end-descriptor

\ finally a type-1 descriptor
type-1 start-descriptor
444 , 2345 ,
end-descriptor

\ length 0 means end of descriptor table
0 c,

\ returns the start of the descriptor of the speficied type
\ skip descriptors of the specified type "index" times
\ returns 0, if not found
: search-descriptor ( type index -- addr 1 | 0 )
	locals| index type |
	descriptors
	begin true while
		dup c@ 0= if drop 0 exit then
		dup char+ c@ type = if
			index 0= if
				1 exit
			else
				index 1- to index
			then
		then
		dup c@ +
	repeat
;

\ usage sample

: print-descriptor ( addr -- )
	cr
	." length: " dup c@ . cr
	." type: " char+ dup c@ . cr
	." first cell: " char+ @ . cr
;

type-1 0 search-descriptor drop print-descriptor
type-1 1 search-descriptor drop print-descriptor
type-1 2 search-descriptor drop print-descriptor
type-2 0 search-descriptor drop print-descriptor
type-2 1 search-descriptor .

\ output:

type-1 0 search-descriptor drop print-descriptor
length: 18
type: 1
first cell: 111
 ok
type-1 1 search-descriptor drop print-descriptor
length: 14
type: 1
first cell: 222
 ok
type-1 2 search-descriptor drop print-descriptor
length: 10
type: 1
first cell: 444
 ok
type-2 0 search-descriptor drop print-descriptor
length: 22
type: 2
first cell: 333
 ok
type-2 1 search-descriptor . 0  ok