* Added bytevector-uint-set!
This commit is contained in:
		
							parent
							
								
									4062b00c29
								
							
						
					
					
						commit
						9488a0706f
					
				
							
								
								
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -5,6 +5,7 @@ | |||
|           bytevector-copy! u8-list->bytevector bytevector->u8-list | ||||
|           bytevector-fill! bytevector-copy bytevector=? | ||||
|           bytevector-uint-ref bytevector-sint-ref  | ||||
|           bytevector-uint-set! | ||||
|           bytevector->uint-list bytevector->sint-list) | ||||
|   (import  | ||||
|     (except (ikarus)  | ||||
|  | @ -13,6 +14,7 @@ | |||
|         bytevector-copy! u8-list->bytevector bytevector->u8-list | ||||
|         bytevector-fill! bytevector-copy bytevector=? | ||||
|         bytevector-uint-ref bytevector-sint-ref | ||||
|         bytevector-uint-set! | ||||
|         bytevector->uint-list bytevector->sint-list) | ||||
|     (ikarus system $fx) | ||||
|     (ikarus system $pairs) | ||||
|  | @ -340,8 +342,40 @@ | |||
|                       '() sref-little 'bytevector->sint-list)] | ||||
|           [(big)    (bytevector->some-list x size ($bytevector-length x)  | ||||
|                       '() sref-big 'bytevector->sint-list)] | ||||
|           [else (error who "invalid endianness ~s" endianness)]))) | ||||
|     ) | ||||
|           [else (error who "invalid endianness ~s" endianness)])))) | ||||
| 
 | ||||
|   (module (bytevector-uint-set!) | ||||
|     (define (little-uint-set! x k n size) | ||||
|       (cond | ||||
|         [($fx= size 0)  | ||||
|          (unless (zero? n)  | ||||
|            (error 'bytevector-uint-set! "value out of range"))] | ||||
|         [else | ||||
|          (let-values ([(q r) (quotient+remainder n 256)]) | ||||
|            (little-uint-set! x ($fxadd1 k) q ($fxsub1 size)) | ||||
|            ($bytevector-set! x k r))])) | ||||
|     (define (big-uint-set! x k1 n k2) | ||||
|       (cond | ||||
|         [($fx= k1 k2)  | ||||
|          (unless (zero? n) | ||||
|            (error 'bytevector-uint-set! "value out of range"))] | ||||
|         [else | ||||
|          (let-values ([(q r) (quotient+remainder n 256)]) | ||||
|            (let ([k2 ($fxsub1 k2)]) | ||||
|              (big-uint-set! x k1 q k2) | ||||
|              ($bytevector-set! x k2 r)))])) | ||||
|     (define bytevector-uint-set! | ||||
|       (lambda (x k n endianness size) | ||||
|         (define who 'bytevector-uint-set!) | ||||
|         (unless (bytevector? x) (error who "~s is not a bytevector" x)) | ||||
|         (unless (and (fixnum? k) ($fx>= k 0)) (error who "invalid index ~s" k)) | ||||
|         (unless (and (fixnum? size) ($fx>= size 1)) (error who "invalid size ~s" size)) | ||||
|         (unless (or (fixnum? n) (bignum? n)) (error who "invalid value ~s" n)) | ||||
|         (case endianness | ||||
|           [(little) (little-uint-set! x k n size)] | ||||
|           [(big)    (big-uint-set! x k n ($fx+ k size))] | ||||
|           [else (error who "invalid endianness ~s" endianness)])))) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -285,6 +285,7 @@ | |||
|     [bytevector=?            i] | ||||
|     [bytevector-uint-ref     i] | ||||
|     [bytevector-sint-ref     i] | ||||
|     [bytevector-uint-set!    i] | ||||
|     [bytevector->uint-list   i] | ||||
|     [bytevector->sint-list   i] | ||||
| 
 | ||||
|  |  | |||
|  | @ -85,6 +85,26 @@ | |||
|     [(lambda (x) (equal? x '(513 -253 513 513))) | ||||
|      (let ([b (u8-list->bytevector '(1 2 3 255 1 2 1 2))]) | ||||
|        (bytevector->sint-list b 'little 2))] | ||||
|     [(lambda (x) (equal? x '(#xfffffffffffffffffffffffffffffffd | ||||
|                              -3 | ||||
|                              (253 255 255 255 255 255 255 255 | ||||
|                               255 255 255 255 255 255 255 255)))) | ||||
|      (let ([b (make-bytevector 16 -127)]) | ||||
|        (bytevector-uint-set! b 0 (- (expt 2 128) 3) 'little 16) | ||||
|        (list  | ||||
|          (bytevector-uint-ref b 0 'little 16) | ||||
|          (bytevector-sint-ref b 0 'little 16) | ||||
|          (bytevector->u8-list b)))] | ||||
|     [(lambda (x) (equal? x '(#xfffffffffffffffffffffffffffffffd | ||||
|                              -3 | ||||
|                              (255 255 255 255 255 255 255 255 | ||||
|                               255 255 255 255 255 255 255 253)))) | ||||
|      (let ([b (make-bytevector 16 -127)]) | ||||
|        (bytevector-uint-set! b 0 (- (expt 2 128) 3) 'big 16) | ||||
|        (list  | ||||
|          (bytevector-uint-ref b 0 'big 16) | ||||
|          (bytevector-sint-ref b 0 'big 16) | ||||
|          (bytevector->u8-list b)))] | ||||
|     )) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum