/pliant/graphic/misc/bytes.pli
 
 1  module "/pliant/language/unsafe.pli" 
 2   
 3  public 
 4   
 5  function bytes_clear adr step count 
 6    arg Address adr ; arg Int step count 
 7    if step=1 
 8      memory_clear adr count 
 9      return 
 10    var Address := adr 
 11    var Address stop := adr translate Byte step*count 
 12    while c<>stop 
 13      map uInt8 := 0 
 14      := translate Byte step 
 15   
 16  function bytes_fill adr step count 
 17    arg Address adr ; arg Int step count 
 18    if step=1 
 19      var Address := adr ; var Int remain := count 
 20      while remain>=Int:size 
 21        map Int := -1 
 22        := translate Int 1 
 23        remain -= Int size 
 24      while remain>0 
 25        map Int8 := -1 
 26        := translate Int8 1 
 27        remain -= 1 
 28      return 
 29    var Address := adr 
 30    var Address stop := adr translate Byte step*count 
 31    while c<>stop 
 32      map uInt8 := 255 
 33      := translate Byte step 
 34   
 35  function bytes_copy src src_step dest dest_step count 
 36    arg Address src dest ; arg Int src_step dest_step count 
 37    if src_step=and dest_step=1 
 38      memory_copy src dest count 
 39      return   
 40    var Address := src 
 41    var Address stop := src translate Byte src_step*count 
 42    var Address := dest 
 43    while s<>stop 
 44      map uInt8 := map uInt8 
 45      := translate Byte src_step 
 46      := translate Byte dest_step 
 47   
 48  function bytes_copy_255minus src src_step dest dest_step count 
 49    arg Address src dest ; arg Int src_step dest_step count 
 50    var Address := src 
 51    var Address := dest 
 52    if src_step=and dest_step=1 
 53      var Address stop := src translate Byte (count .and. .not. (Int:size-1)) 
 54      while s<>stop 
 55        map Int := (-1) .-. (map Int) 
 56        := translate Int 1 
 57        := translate Int 1 
 58    var Address stop := src translate Byte src_step*count 
 59    while s<>stop 
 60      map uInt8 := 255-(map uInt8) 
 61      := translate Byte src_step 
 62      := translate Byte dest_step 
 63   
 64  function bytes_copy24 src src_step dest dest_step count 
 65    arg Address src dest ; arg Int src_step dest_step count 
 66    check count>0 
 67    var Address := src 
 68    var Address stop := src translate Byte src_step*(count-1) 
 69    var Address := dest 
 70    while s<>stop 
 71      map uInt32 := (map uInt32) .and. 2^24-1 
 72      := translate Byte src_step 
 73      := translate Byte dest_step 
 74    for (var Int c) 0 2 
 75      map uInt8 := map uInt8 
 76      := translate Byte 1 
 77      := translate Byte 1 
 78   
 79  function bytes_xor src dest size 
 80    arg Address src dest ; arg Int size 
 81    var Address := src ; var Address := dest 
 82    var Int remain := size 
 83    while remain>=uInt:size 
 84      map uInt := (map uInt) .xor. (map uInt) 
 85      := translate uInt 1 
 86      := translate uInt 1 
 87      remain -= Int:size 
 88    while remain>0 
 89      map uInt8 := (map uInt8) .xor. (map uInt8) 
 90      := translate uInt8 1 
 91      := translate uInt8 1 
 92      remain -= 1 
 93