doc.txt


\ doc 98.11.4 12:27 am NAB
needs DataMgr
needs core-ext
needs condthens
needs double
needs Mem
decimal

2variable docDBR

2variable out
variable out-semaphore
0 out-semaphore !
: outinit ( -- )
  out-semaphore @ 0= if
    4096 (allocate) throw out 2!
  then  1 out-semaphore +! ;
: outfree ( -- )
  -1 out-semaphore +!
  out-semaphore @ 0= if
  out 2@ (free) throw  then ;
variable #out
: out, ( c -- )
  out 2@ #out @ m+ c!a  1 #out +! ;

: OpenDocDB
  ( mode zaddr len -- dbr. )
  OpenDB 2dup docDBR 2!  outinit ;

: CloseDocDB ( dbr. -- )
  CloseDB  outfree ;

\ Decompress a Doc record from a
\ 32-bit address to a special buffer:
: Decompress ( addr. len -- a. n ) 
  0 #out !  >r  2dup  r> m+  2swap
  ( end. addr. )
  begin  2dup c@a
    cond
\ 0, 9..127: verbatim
      dup 0=  over 9 128 within  or if out,
\ 128..191: repeat earlier sequence
      else  dup 128 192 within if
        >r  1 m+ 2dup c@a  r> 8 lshift  +
        dup  16383 and  3 rshift
        swap  7 and 3 +  0 do
          dup >r out 2@ #out @ m+
          r> negate m+  c@a out,
        loop drop
\ 192..255: space plus char&127
      else  dup 192 256 within if
        bl out, 127 and out,
\ 1..8: escape next n chars
      else  dup 1 9 within if
        0 do 1 m+  2dup c@a out,  loop
    thens
    1 m+
  2over 2over d= until
  2drop 2drop  out 2@ #out @ ;

\ Get a record from the current open
\ Doc file and decompress to a fixed
\ buffer.
: GetRecord ( index -- addr u )
  dup docDBR 2@ DmQueryRecord
  2dup MemHandleSize drop >r
  MemHandleLock
    2dup r> Decompress  >r 2>r
  MemPtrUnlock throw
  false swap docDBR 2@
    DmReleaseRecord throw  2r> r> ;

needs tools-ext
0 [if]
needs zstrings
: display ( c-addr. u -- )
   0 do
    2dup i m+ c@a dup 10 = if drop cr
    else emit then loop 2drop ;
: go
  DmModeReadOnly
  z" PalmOS SysTraps"
  OpenDocDB
  2dup DmNumRecords 1 do
    i GetRecord display
  loop CloseDocDB ;
[then]


  HTMLized by Forth2HTML