/pliant/language/type/misc/blob.pli
 
 1  module "/pliant/language/unsafe.pli" 
 2   
 3  constant from_scratch false 
 4   
 5   
 6  type Blob 
 7    if from_scratch 
 8      field Address buffer <- null 
 9      field Int length <- 0 
 10    else 
 11      field Str support 
 12   
 13   
 14  if from_scratch 
 15    function destroy b 
 16      arg_w Blob b 
 17      if b:length>0 
 18        memory_free b:buffer 
 19   
 20   
 21  method b content -> a 
 22    arg Blob b ; arg Address a 
 23    if from_scratch 
 24      a := b buffer 
 25    else 
 26      := b:support characters 
 27   
 28  method b size -> s 
 29    arg Blob b ; arg Int s 
 30    if from_scratch 
 31      s := abs b:length 
 32    else 
 33      := b:support len 
 34   
 35   
 36  method b 'size :=' s 
 37    arg_rw Blob b ; arg Int s 
 38    check s>=0 
 39    if from_scratch 
 40      if b:length>0 
 41        memory_free b:buffer 
 42      b buffer := memory_allocate s addressof:b 
 43      b length := s 
 44    else 
 45      b:support set (memory_allocate addressof:b) true 
 46   
 47   
 48  method b map adr size 
 49    arg_rw Blob b ; arg Address adr ; arg Int size 
 50    if from_scratch 
 51      if b:length>0 
 52        memory_free b:buffer 
 53      b buffer := adr 
 54      b length := -size 
 55    else 
 56      b:support set adr size false 
 57     
 58   
 59  if from_scratch 
 60    function copy src dest 
 61      arg Blob src ; arg_w Blob dest 
 62      dest size := src size 
 63      memory_copy src:content dest:content src:size 
 64   
 65   
 66  export Blob '. content' '. size' '. size :=' '. map' 
 67   
 68