Patch title: Release 87 bulk changes
Abstract:
File: /pliant/util/mac/appledouble.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/stream.pli"
module "/pliant/language/unsafe.pli"

constant limit 2^20

# Format specifications found at
# http://users.phg-online.de/tk/netatalk/doc/Apple/v2/adouble-v2.html


function appledouble_load filename icon ressource
  arg Str filename ; arg_w Str icon ressource
  icon := "" ; ressource := ""
  (var Stream s) open filename in+safe
  if s=failure
    console "no such file" eol
    return
  var Str sign := "1234" ; s raw_read sign:characters sign:len
  if sign<>character:0+character:5+character:16h+character:7
    console "wrong signature" eol
    return
  s configure "seek 24"
  var uInt16_hi nb ; s raw_read addressof:nb uInt16_hi:size
  for (var Int i) 0 nb-1
    var uInt32_hi id ; s raw_read addressof:id uInt32_hi:size
    var uInt32_hi offset ; s raw_read addressof:offset uInt32_hi:size
    var uInt32_hi length ; s raw_read addressof:length uInt32_hi:size
    # console "ID " (cast id Int) " offset " (cast offset Int) " length " (cast length Int) eol
    if id=2 and length>0 and length<=limit
      (s query "seek") parse (var Intn pos)
      ressource set (memory_allocate length addressof:ressource) length true
      s configure "seek "+string:(cast offset uInt)
      s raw_read ressource:characters ressource:len
      s configure "seek "+string:pos
    if id=9 and length>=8
      (s query "seek") parse (var Intn pos)
      icon := "12345678"
      s configure "seek "+string:(cast offset uInt)
      s raw_read icon:characters icon:len
      s configure "seek "+string:pos

function appledouble_store icon ressource -> fork
  arg Str icon ressource fork
  if icon:len<>8
    return ""
  fork := character:0+character:5+character:16h+character:7 # signature
  fork += character:0+character:2+character:0+character:0 # version
  fork += repeat 16 "[0]"
  fork += character:0+character:2 # number of entries
  fork += character:0+character:0+character:0+character:9 + character:0+character:0+character:0+character:32h + character:0+character:0+character:0+character:20h # finder info
  var uInt32_hi len32 := ressource len ; (var Str len) set addressof:len32 4 false
  fork += character:0+character:0+character:0+character:2 + character:0+character:0+character:0+character:52h + len # ressource fork
  fork += icon+(repeat 20h-8 "[0]")
  fork += ressource

function appledouble_store application ressource filename
  arg Str application ressource filename
  (var Stream s) open filename out+safe
  s writechars (appledouble_store application ressource)
  s close

export appledouble_load appledouble_store