source: project/release/4/endian-blob/trunk/endian-blob.scm @ 18791

Last change on this file since 18791 was 18791, checked in by Ivan Raikov, 10 years ago

Fixed a bug in uint2->endian-blob (spotted by Shawn Rutledge)

File size: 23.7 KB
Line 
1;;
2;;  Utility procedures for manipulating blobs in different endian
3;;  formats.
4;;
5;;  Copyright 2009-2010 Ivan Raikov.
6;;
7;;
8;; This program is free software: you can redistribute it and/or
9;; modify it under the terms of the GNU General Public License as
10;; published by the Free Software Foundation, either version 3 of the
11;; License, or (at your option) any later version.
12;;
13;; This program is distributed in the hope that it will be useful, but
14;; WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16;; General Public License for more details.
17;;
18;; A full copy of the GPL license can be found at
19;; <http://www.gnu.org/licenses/>.
20;;
21
22
23(module endian-blob
24
25        (endian-blob?
26         byte-blob->endian-blob
27         endian-blob->byte-blob
28
29         endian-blob->sint1
30         endian-blob->sint2
31         endian-blob->sint4
32         endian-blob->uint1
33         endian-blob->uint2
34         endian-blob->uint4
35         endian-blob->ieee_float32
36         endian-blob->ieee_float64
37         endian-blob->s8vector
38         endian-blob->s16vector
39         endian-blob->s32vector
40         endian-blob->u8vector
41         endian-blob->u16vector
42         endian-blob->u32vector
43         endian-blob->f32vector
44         endian-blob->f64vector
45
46         sint1->endian-blob
47         sint2->endian-blob
48         sint4->endian-blob
49         uint1->endian-blob
50         uint2->endian-blob
51         uint4->endian-blob
52         ieee_float32->endian-blob
53         ieee_float64->endian-blob
54         s8vector->endian-blob
55         s16vector->endian-blob
56         s32vector->endian-blob
57         u8vector->endian-blob
58         u16vector->endian-blob
59         u32vector->endian-blob
60         f32vector->endian-blob
61         f64vector->endian-blob
62         
63         MSB LSB
64         )
65
66
67        (import scheme chicken foreign)
68
69        (require-extension srfi-4 byte-blob)
70
71(define-record-type endian-blob
72  (make-endian-blob object mode )
73  endian-blob?
74  (object   endian-blob-object )
75  (mode     endian-blob-mode )
76  )
77
78(define MSB    0)
79(define LSB    1)
80
81(define (byte-blob->endian-blob b . rest) 
82  (let-optionals rest ((mode MSB))
83   (assert (byte-blob? b))
84   (make-endian-blob b mode)))
85
86(define endian-blob->byte-blob endian-blob-object)
87
88#>
89#include "floatformat.h"
90
91typedef enum { MSB, LSB } byte_order_t;
92
93// Is the present machine mode MSB first?
94int machine_mode_is_MSB (void)
95{
96    union {
97        int i;
98        char c[sizeof(int)];
99    } x;
100    x.i = 1;
101
102    return (!(x.c[0] == 1));
103}
104
105// Is the given byte order MSB first?
106int endian_mode_is_MSB(byte_order_t b) 
107{ 
108     return (b == MSB);
109}
110
111
112void cfrom_sint1 (char item, unsigned char *b, unsigned int offset, int mode)
113{
114    b[offset] = item;
115}
116
117void cfrom_sint2 (short item, unsigned char *b, unsigned int offset, int mode)
118{
119     if ( endian_mode_is_MSB(mode) )
120     {
121          b[offset+0] = (item>>8) & 0xff;
122          b[offset+1] = item & 0xff;
123     }
124     else
125     {
126          b[offset+0] = item & 0xff;
127          b[offset+1] = (item>>8) & 0xff;
128     }
129}
130
131void cfrom_sint4 (int item, unsigned char *b, unsigned int offset, int mode)
132{
133     int i, k;
134
135     if ( endian_mode_is_MSB(mode) )
136     {
137          k = 24;
138          for(i=0; i < 4; i++)
139          {
140               b[offset+i] = (item >> k) & 0xff;
141               k -= 8;
142          }
143     }
144     else
145     {
146          for(i=0; i < 4; i++)
147          {
148               b[offset+i] = item & 0xff;
149               item >>= 8;
150          }
151     }
152}
153
154void cfrom_uint1 (unsigned char item, unsigned char *b, unsigned int offset, int mode)
155{
156    b[offset] = item;
157}
158
159void cfrom_uint2 (unsigned short item, unsigned char *b, unsigned int offset, int mode)
160{
161     if ( endian_mode_is_MSB(mode) )
162     {
163          b[offset+0] = (item>>8) & 0xff;
164          b[offset+1] = item & 0xff;
165     }
166     else
167     {
168          b[offset+0] = item & 0xff;
169          b[offset+1] = (item>>8) & 0xff;
170     }
171}
172
173void cfrom_uint4 (unsigned int item, unsigned char *b, unsigned int offset, int mode)
174{
175     int i, k;
176     
177     if ( endian_mode_is_MSB(mode) )
178     {
179          k = 24;
180          for(i=0; i < 4; i++)
181          {
182               b[offset+i] = (item >> k) & 0xff;
183               k -= 8;
184          }
185     }
186     else
187     {
188          for(i=0; i < 4; i++)
189          {
190               b[offset+i] = item & 0xff;
191               item >>= 8;
192          }
193     }
194}
195
196void cfrom_ieee_float32 (float item, unsigned char *b, unsigned int offset, int mode)
197{
198     double d;
199
200     d = item;
201
202     if ( endian_mode_is_MSB(mode) )
203     {
204          double_to_floatformat (&floatformat_ieee_single_big, &d, b+offset);
205     }
206     else
207     {
208          double_to_floatformat (&floatformat_ieee_single_little, &d, b+offset);
209     }
210}
211
212
213void cfrom_ieee_float64 (double item, unsigned char *b, unsigned int offset, int mode)
214{
215     double d;
216
217     d = item;
218
219     if ( endian_mode_is_MSB(mode) )
220     {
221          double_to_floatformat (&floatformat_ieee_double_big, &d, b+offset);
222     }
223     else
224     {
225          double_to_floatformat (&floatformat_ieee_double_little, &d, b+offset);
226     }
227}
228
229void cfrom_s8vector (unsigned int n, unsigned char *b, char *v, unsigned int offset, int mode)
230{
231   memcpy((void *)(b+offset),(const void *)v,n);
232}
233
234
235void cfrom_s16vector (unsigned int n, unsigned char *b, short *v, unsigned int offset, int mode)
236{
237  unsigned int i,p;
238
239  p = offset;
240  for (i=0; i<n; i++,p += 2)
241  {
242       cfrom_sint2 (v[i], b, p, mode);
243  }
244}
245
246
247void cfrom_s32vector (unsigned int n, unsigned char *b, int *v, unsigned int offset, int mode)
248{
249  unsigned int i,p;
250
251  p = offset;
252  for (i=0; i<n; i++,p += 4)
253  {
254       cfrom_sint4 (v[i], b, p, mode);
255  }
256}
257
258
259void cfrom_u8vector (unsigned int n, unsigned char *b, unsigned char *v, unsigned int offset, int mode)
260{
261   memcpy((void *)(b+offset),(const void *)v,n);
262}
263
264
265void cfrom_u16vector (unsigned int n, unsigned char *b, unsigned short *v, unsigned int offset, int mode)
266{
267  unsigned int i,p;
268
269  p = offset;
270  for (i=0; i<n; i++,p += 2)
271  {
272       cfrom_uint2 (v[i], b, p, mode);
273  }
274}
275
276
277void cfrom_u32vector (unsigned int n, unsigned char *b, unsigned int *v, unsigned int offset, int mode)
278{
279  unsigned int i,p;
280
281  p = offset;
282  for (i=0; i<n; i++,p += 4)
283  {
284       cfrom_uint4 (v[i], b, p, mode);
285  }
286}
287
288
289void cfrom_f32vector (unsigned int n, unsigned char *b, float *v, unsigned int offset, int mode)
290{
291  unsigned int i,p;
292
293  p = offset;
294  for (i=0; i<n; i++,p += 4)
295  {
296       cfrom_ieee_float32 (v[i], b, p, mode);
297  }
298}
299
300
301void cfrom_f64vector (unsigned int n, unsigned char *b, double *v, unsigned int offset, int mode)
302{
303  unsigned int i,p;
304
305  p = offset;
306  for (i=0; i<n; i++,p += 8)
307  {
308       cfrom_ieee_float64 (v[i], b, p, mode);
309  }
310}
311
312char cto_sint1 (unsigned char *b, unsigned int offset, int mode)
313{
314   return b[offset];
315}
316
317short cto_sint2 (unsigned char *b, unsigned int offset, int mode)
318{
319   short result;
320   
321   if( endian_mode_is_MSB(mode) )
322     result = (b[offset+0] << 8) | b[offset+1];
323   else
324     result = (b[offset+1] << 8) | b[offset+0];
325
326   return (result);
327}
328
329int cto_sint4 (unsigned char *b, unsigned int offset, int mode)
330{
331   int result;
332
333   if ( endian_mode_is_MSB(mode) )
334        result = (b[offset+0] << 24) | (b[offset+1] << 16) |
335                 (b[offset+2] << 8)  | (b[offset+3]);
336     else
337          result = (b[offset+3] << 24) | (b[offset+2] << 16) |
338                   (b[offset+1] << 8) | (b[offset+0]);
339
340   return(result);
341}
342
343unsigned char cto_uint1 (unsigned char *b, unsigned int offset, int mode)
344{
345   return b[offset];
346}
347
348unsigned short cto_uint2 (unsigned char *b, unsigned int offset, int mode)
349{
350   unsigned short result;
351   
352   if( endian_mode_is_MSB(mode) )
353     result = (b[offset+0] << 8) | b[offset+1];
354   else
355     result = (b[offset+1] << 8) | b[offset+0];
356
357   return (result);
358}
359
360unsigned int cto_uint4 (unsigned char *b, unsigned int offset, int mode)
361{
362   unsigned int result;
363
364   if ( endian_mode_is_MSB(mode) )
365        result = (b[offset+0] << 24) | (b[offset+1] << 16) |
366                 (b[offset+2] << 8)  | (b[offset+3]);
367     else
368          result = (b[offset+3] << 24) | (b[offset+2] << 16) |
369                   (b[offset+1] << 8) | (b[offset+0]);
370
371   return(result);
372}
373
374
375float cto_ieee_float32 (unsigned char *b, unsigned int offset, int mode)
376{
377   ssize_t s;
378   double d;
379   const struct floatformat *fmt;
380   unsigned long exponent;
381
382   d = 0.0;
383
384   if ( endian_mode_is_MSB(mode) )
385   {
386     fmt = &floatformat_ieee_single_big;
387   }
388   else
389   {
390     fmt = &floatformat_ieee_single_little;
391   }
392
393   exponent = get_field ((unsigned char *)(b+offset), fmt->byteorder, fmt->totalsize,
394                         fmt->exp_start, fmt->exp_len);
395
396   floatformat_to_double(fmt, b+offset, &d);
397
398   return((float)d);
399}
400
401double cto_ieee_float64 (unsigned char *b, unsigned int offset, int mode)
402{
403   ssize_t s;
404   double d;
405   const struct floatformat *fmt;
406   unsigned long exponent;
407
408   d = 0.0;
409
410   if ( endian_mode_is_MSB(mode) )
411   {
412     fmt = &floatformat_ieee_double_big;
413   }
414   else
415   {
416     fmt = &floatformat_ieee_double_little;
417   }
418
419   exponent = get_field ((unsigned char *)(b+offset), fmt->byteorder, fmt->totalsize,
420                         fmt->exp_start, fmt->exp_len);
421
422   floatformat_to_double(fmt, b+offset, &d);
423
424   return(d);
425}
426
427void cto_s8vector (unsigned int n, char *v, unsigned char *b, unsigned int offset, int mode)
428{
429   memcpy((void *)v,(const void *)(b+offset),n);
430}
431
432
433void cto_s16vector (unsigned int n, short *v, unsigned char *b, unsigned int offset, int mode)
434{
435  unsigned int i,p; short r;
436
437  p = offset;
438  for (i=0; i<n; i++,p += 2)
439  {
440       r = cto_sint2 (b, p, mode);
441       v[i] = r;
442  }
443}
444
445
446void cto_s32vector (unsigned int n, int *v, unsigned char *b, unsigned int offset, int mode)
447{
448  unsigned int i,p; int r;
449
450  p = offset;
451  for (i=0; i<n; i++,p += 4)
452  {
453       r = cto_sint4 (b, p, mode);
454       v[i] = r;
455  }
456}
457
458void cto_u8vector (unsigned int n, unsigned char *v, unsigned char *b, unsigned int offset, int mode)
459{
460   memcpy((void *)v,(const void *)(b+offset),n);
461}
462
463
464void cto_u16vector (unsigned int n, unsigned short *v, unsigned char *b, unsigned int offset, int mode)
465{
466  unsigned int i,p; unsigned short r;
467
468  p = offset;
469  for (i=0; i<n; i++,p += 2)
470  {
471       r = cto_uint2 (b, p, mode);
472       v[i] = r;
473  }
474}
475
476
477void cto_u32vector (unsigned int n, unsigned int *v, unsigned char *b, unsigned int offset, int mode)
478{
479  unsigned int i,p; unsigned int r;
480
481  p = offset;
482  for (i=0; i<n; i++,p += 4)
483  {
484       r = cto_uint4 (b, p, mode);
485       v[i] = r;
486  }
487}
488
489
490void cto_f32vector (unsigned int n, float *v, unsigned char *b, unsigned int offset, int mode)
491{
492  unsigned int i,p; float r;
493
494  p = offset;
495  for (i=0; i<n; i++,p += 4)
496  {
497       r = cto_ieee_float32 (b, p, mode);
498       v[i] = r;
499  }
500}
501
502
503void cto_f64vector (unsigned int n, double *v, unsigned char *b, unsigned int offset, int mode)
504{
505  unsigned int i,p; double r;
506
507  p = offset;
508  for (i=0; i<n; i++,p += 8)
509  {
510       r = cto_ieee_float64 (b, p, mode);
511       v[i] = r;
512  }
513}
514
515
516<#
517
518(define machine_mode_is_MSB 
519  (foreign-lambda bool  "machine_mode_is_MSB" ))
520
521(define from_sint1 
522  (foreign-lambda void  "cfrom_sint1" byte nonnull-blob unsigned-int integer))
523
524(define from_sint2
525  (foreign-lambda void "cfrom_sint2" short nonnull-blob unsigned-int integer))
526
527(define from_sint4
528  (foreign-lambda void "cfrom_sint4" int nonnull-blob unsigned-int integer))
529
530
531(define from_uint1 
532  (foreign-lambda void  "cfrom_uint1" unsigned-byte nonnull-blob unsigned-int integer))
533
534(define from_uint2
535  (foreign-lambda void "cfrom_uint2" unsigned-short nonnull-blob unsigned-int integer))
536
537(define from_uint4
538  (foreign-lambda void "cfrom_uint4" unsigned-int nonnull-blob unsigned-int integer))
539
540(define from_ieee_float32 
541  (foreign-lambda void "cfrom_ieee_float32" float nonnull-blob unsigned-int integer ))
542
543(define from_ieee_float64
544    (foreign-lambda void "cfrom_ieee_float64" double nonnull-blob unsigned-int integer ))
545
546
547
548(define from_s8vector 
549  (foreign-lambda void  "cfrom_s8vector"  unsigned-int nonnull-blob s8vector unsigned-int integer ))
550
551(define from_s16vector
552  (foreign-lambda void "cfrom_s16vector"  unsigned-int nonnull-blob s16vector unsigned-int integer))
553
554(define from_s32vector
555  (foreign-lambda void "cfrom_s32vector"  unsigned-int nonnull-blob s32vector unsigned-int integer))
556
557(define from_u8vector 
558  (foreign-lambda void  "cfrom_u8vector"  unsigned-int nonnull-blob u8vector unsigned-int integer ))
559
560(define from_u16vector
561  (foreign-lambda void "cfrom_u16vector"  unsigned-int nonnull-blob u16vector unsigned-int integer))
562
563(define from_u32vector
564  (foreign-lambda void "cfrom_u32vector"  unsigned-int nonnull-blob u32vector unsigned-int integer))
565
566(define from_f32vector
567  (foreign-lambda void "cfrom_f32vector"  unsigned-int nonnull-blob f32vector unsigned-int integer))
568
569(define from_f64vector
570  (foreign-lambda void "cfrom_f64vector"  unsigned-int nonnull-blob f64vector unsigned-int integer))
571
572
573(define to_sint1 
574  (foreign-lambda byte  "cto_sint1" nonnull-blob unsigned-int integer))
575
576(define to_sint2
577  (foreign-lambda short "cto_sint2" nonnull-blob unsigned-int integer))
578
579(define to_sint4
580  (foreign-lambda int "cto_sint4" nonnull-blob unsigned-int integer))
581
582
583(define to_uint1 
584  (foreign-lambda unsigned-byte  "cto_uint1" nonnull-blob unsigned-int integer))
585
586(define to_uint2
587  (foreign-lambda unsigned-short "cto_uint2" nonnull-blob unsigned-int integer))
588
589(define to_uint4
590  (foreign-lambda unsigned-int "cto_uint4" nonnull-blob unsigned-int integer))
591
592(define to_ieee_float32 
593  (foreign-lambda float "cto_ieee_float32"  nonnull-blob unsigned-int integer ))
594
595(define to_ieee_float64
596    (foreign-lambda double "cto_ieee_float64"  nonnull-blob unsigned-int integer ))
597
598
599
600(define to_s8vector 
601  (foreign-lambda void "cto_s8vector" unsigned-int s8vector nonnull-blob unsigned-int integer ))
602
603(define to_s16vector
604  (foreign-lambda void "cto_s16vector" unsigned-int s16vector nonnull-blob unsigned-int integer))
605
606(define to_s32vector
607  (foreign-lambda void "cto_s32vector" unsigned-int s32vector nonnull-blob unsigned-int integer))
608
609(define to_u8vector 
610  (foreign-lambda void "cto_u8vector" unsigned-int u8vector nonnull-blob unsigned-int integer ))
611
612(define to_u16vector
613  (foreign-lambda void "cto_u16vector" unsigned-int u16vector nonnull-blob unsigned-int integer))
614
615(define to_u32vector
616  (foreign-lambda void "cto_u32vector" unsigned-int u32vector nonnull-blob unsigned-int integer))
617
618(define to_f32vector
619  (foreign-lambda void "cto_f32vector" unsigned-int f32vector nonnull-blob unsigned-int integer))
620
621(define to_f64vector
622  (foreign-lambda void "cto_f64vector" unsigned-int f64vector nonnull-blob unsigned-int integer))
623
624
625(define machine-mode (if (machine_mode_is_MSB) MSB LSB))
626
627
628(define (sint1->endian-blob n . rest)
629  (let-optionals rest ((mode MSB))
630    (let ((bb (s8vector->blob/shared (s8vector n))))
631      (if (not (fx= machine-mode mode))
632          (from_sint1 n bb 0 mode))
633      (make-endian-blob (blob->byte-blob bb) mode))))
634
635
636(define (sint2->endian-blob n . rest)
637  (let-optionals rest ((mode MSB))
638    (let ((bb (s16vector->blob/shared (s16vector n))))
639      (if (not (fx= machine-mode mode))
640          (from_sint2 n bb 0 mode))
641      (make-endian-blob (blob->byte-blob bb) mode))))
642
643
644(define (sint4->endian-blob n . rest)
645  (let-optionals rest ((mode MSB))
646    (let ((bb (s32vector->blob/shared (s32vector n))))
647      (if (not (fx= machine-mode mode))
648          (from_sint4 n bb 0 mode))
649      (make-endian-blob (blob->byte-blob bb) mode))))
650
651
652(define (uint1->endian-blob n . rest)
653  (let-optionals rest ((mode MSB))
654    (let ((bb (u8vector->blob/shared (u8vector n))))
655      (if (not (fx= machine-mode mode))
656          (from_uint1 n bb 0 mode))
657      (make-endian-blob (blob->byte-blob bb) mode))))
658
659
660(define (uint2->endian-blob n . rest)
661  (let-optionals rest ((mode MSB))
662    (let ((bb (u16vector->blob/shared (u16vector n))))
663      (if (not (fx= machine-mode mode))
664          (from_uint2 n bb 0 mode))
665      (make-endian-blob (blob->byte-blob bb) mode))))
666
667
668(define (uint4->endian-blob n . rest)
669  (let-optionals rest ((mode MSB))
670    (let ((bb (u32vector->blob/shared (u32vector n))))
671      (if (not (fx= machine-mode mode))
672          (from_uint4 n bb 0 mode))
673      (make-endian-blob (blob->byte-blob bb) mode))))
674
675
676(define (ieee_float32->endian-blob n . rest)
677  (let-optionals rest ((mode MSB))
678    (let ((bb (f32vector->blob/shared (f32vector n))))
679      (if (not (fx= machine-mode mode))
680          (from_ieee_float32 n bb 0 mode))
681      (make-endian-blob (blob->byte-blob bb) mode))))
682
683
684(define (ieee_float64->endian-blob n . rest)
685  (let-optionals rest ((mode MSB))
686    (let ((bb (f64vector->blob/shared (f64vector n))))
687      (if (not (fx= machine-mode mode))
688          (from_ieee_float64 n bb 0 mode))
689      (make-endian-blob (blob->byte-blob bb) mode))))
690
691
692(define (s8vector->endian-blob v . rest)
693  (let-optionals rest ((mode MSB))
694   (if (fx= machine-mode mode) 
695       (make-endian-blob (s8vector->byte-blob v) mode)
696       (let* ((n  (s8vector-length v))
697              (bb (byte-blob-replicate n 0))
698              (b  (make-endian-blob bb mode)))
699         (from_s8vector n (byte-blob-object bb) v
700                        (byte-blob-offset bb) 
701                        (endian-blob-mode b))
702         b))))
703
704
705(define (s16vector->endian-blob v . rest)
706  (let-optionals rest ((mode MSB))
707   (if (fx= machine-mode mode) 
708       (make-endian-blob (s16vector->byte-blob v) mode)
709       (let* ((n  (s16vector-length v))
710              (bb (byte-blob-replicate (* 2 n) 0))
711              (b  (make-endian-blob bb mode)))
712         (from_s16vector n (byte-blob-object bb) v
713                         (byte-blob-offset bb) 
714                         (endian-blob-mode b))
715         b))))
716
717
718(define (s32vector->endian-blob v . rest)
719  (let-optionals rest ((mode MSB))
720   (if (fx= machine-mode mode) 
721       (make-endian-blob (s32vector->byte-blob v) mode)
722       (let* ((n  (s32vector-length v))
723              (bb (byte-blob-replicate (* 4 n) 0))
724              (b  (make-endian-blob bb mode)))
725         (from_s32vector n (byte-blob-object bb) v
726                         (byte-blob-offset bb) 
727                         (endian-blob-mode b))
728         b))))
729
730(define (u8vector->endian-blob v . rest)
731  (let-optionals rest ((mode MSB))
732   (if (fx= machine-mode mode) 
733       (make-endian-blob (u8vector->byte-blob v) mode)
734       (let* ((n  (u8vector-length v))
735              (bb (byte-blob-replicate n 0))
736              (b  (make-endian-blob bb mode)))
737         (from_u8vector n (byte-blob-object bb) v
738                        (byte-blob-offset bb) 
739                        (endian-blob-mode b))
740         b))))
741
742
743(define (u16vector->endian-blob v . rest)
744  (let-optionals rest ((mode MSB))
745    (if (fx= machine-mode mode) 
746        (make-endian-blob (u16vector->byte-blob v) mode)
747        (let* ((n  (u16vector-length v))
748               (bb (byte-blob-replicate (* 2 n) 0))
749               (b  (make-endian-blob bb mode)))
750          (from_u16vector n (byte-blob-object bb) v
751                          (byte-blob-offset bb) 
752                          (endian-blob-mode b))
753          b))))
754
755
756(define (u32vector->endian-blob v . rest)
757  (let-optionals rest ((mode MSB))
758    (if (fx= machine-mode mode) 
759       (make-endian-blob (u32vector->byte-blob v) mode)
760       (let* ((n  (u32vector-length v))
761              (bb (byte-blob-replicate (* 4 n) 0))
762              (b  (make-endian-blob bb mode)))
763         (from_u32vector n (byte-blob-object bb) v
764                         (byte-blob-offset bb) 
765                         (endian-blob-mode b))
766         b))))
767
768
769(define (f32vector->endian-blob v . rest)
770  (let-optionals rest ((mode MSB))
771    (if (fx= machine-mode mode) 
772        (make-endian-blob (f32vector->byte-blob v) mode)
773        (let* ((n  (f32vector-length v))
774               (bb (byte-blob-replicate (* 4 n) 0))
775               (b  (make-endian-blob bb mode)))
776          (from_f32vector n (byte-blob-object bb) v
777                          (byte-blob-offset bb) 
778                          (endian-blob-mode b))
779          b))))
780
781
782(define (f64vector->endian-blob v . rest)
783  (let-optionals rest ((mode MSB))
784    (if (fx= machine-mode mode) 
785        (make-endian-blob (f64vector->byte-blob v) mode)
786        (let* ((n  (f64vector-length v))
787               (bb (byte-blob-replicate (* 8 n) 0))
788               (b  (make-endian-blob bb mode)))
789          (from_f64vector n (byte-blob-object bb) v
790                          (byte-blob-offset bb) 
791                          (endian-blob-mode b))
792          b))))
793
794(define (endian-blob->sint1 b)
795  (let ((bb (endian-blob->byte-blob b)))
796    (assert (= (byte-blob-length bb) 1))
797    (to_sint1 (byte-blob-object bb) (byte-blob-offset bb) 
798              (endian-blob-mode b))))
799
800
801(define (endian-blob->sint2 b)
802  (let ((bb (endian-blob->byte-blob b)))
803    (assert (= (byte-blob-length bb) 2))
804    (to_sint2 (byte-blob-object bb) (byte-blob-offset bb) 
805              (endian-blob-mode b))))
806
807
808(define (endian-blob->sint4 b)
809  (let ((bb (endian-blob->byte-blob b)))
810    (assert (= (byte-blob-length bb) 4))
811    (to_sint4 (byte-blob-object bb) (byte-blob-offset bb) 
812              (endian-blob-mode b))))
813
814
815(define (endian-blob->uint1 b)
816  (let ((bb (endian-blob->byte-blob b)))
817    (assert (= (byte-blob-length bb) 1))
818    (to_uint1 (byte-blob-object bb) (byte-blob-offset bb) 
819              (endian-blob-mode b))))
820
821
822(define (endian-blob->uint2 b)
823  (let ((bb (endian-blob->byte-blob b)))
824    (assert (= (byte-blob-length bb) 2))
825    (to_uint2 (byte-blob-object bb) (byte-blob-offset bb) 
826              (endian-blob-mode b))))
827
828
829(define (endian-blob->uint4 b)
830  (let ((bb (endian-blob->byte-blob b)))
831    (assert (= (byte-blob-length bb) 4))
832    (to_uint4 (byte-blob-object bb) (byte-blob-offset bb) 
833              (endian-blob-mode b))))
834
835
836(define (endian-blob->ieee_float32 b)
837  (let ((bb (endian-blob->byte-blob b)))
838    (assert (= (byte-blob-length bb) 4))
839    (to_ieee_float32 (byte-blob-object bb) (byte-blob-offset bb) 
840                      (endian-blob-mode b))))
841
842
843(define (endian-blob->ieee_float64 b)
844  (let ((bb (endian-blob->byte-blob b)))
845    (assert (= (byte-blob-length bb) 8))
846    (to_ieee_float64 (byte-blob-object bb) (byte-blob-offset bb) 
847                      (endian-blob-mode b))))
848
849(define (endian-blob->s8vector b)
850  (let* ((bb (endian-blob->byte-blob b))
851         (mode (endian-blob-mode b))
852         (n  (byte-blob-length bb)))
853    (assert (positive? n))
854    (if (fx= machine-mode mode) 
855         (byte-blob->s8vector bb)
856         (let ((v (make-s8vector n 0)))
857           (to_s8vector n v 
858                        (byte-blob-object bb) 
859                        (byte-blob-offset bb)
860                        mode)
861           v))))
862
863
864(define (endian-blob->s16vector b)
865  (let* ((bb (endian-blob->byte-blob b))
866         (mode (endian-blob-mode b))
867         (n  (byte-blob-length bb)))
868    (assert (and (positive? n) (zero? (modulo n 2))))
869    (if (fx= machine-mode mode) 
870         (byte-blob->s16vector bb)
871         (let* ((s  (/ n 2))
872                (v (make-s16vector s 0)))
873           (to_s16vector s v 
874                         (byte-blob-object bb) 
875                         (byte-blob-offset bb) 
876                         mode)
877           v))))
878
879
880(define (endian-blob->s32vector b)
881  (let* ((bb (endian-blob->byte-blob b))
882         (mode (endian-blob-mode b))
883         (n  (byte-blob-length bb)))
884    (assert (and (positive? n) (zero? (modulo n 4))))
885    (if (fx= machine-mode mode) 
886         (byte-blob->s32vector bb)
887         (let* ((s  (/ n 4))
888                (v (make-s32vector s 0)))
889           (to_s32vector s v 
890                         (byte-blob-object bb) 
891                         (byte-blob-offset bb) 
892                         mode)
893           v))))
894
895(define (endian-blob->u8vector b)
896  (let* ((bb (endian-blob->byte-blob b))
897         (mode (endian-blob-mode b))
898         (n  (byte-blob-length bb)))
899    (assert (positive? n))
900    (if (fx= machine-mode mode) 
901        (byte-blob->u8vector bb)
902        (let ((v (make-u8vector n 0)))
903          (to_u8vector n v 
904                       (byte-blob-object bb) 
905                       (byte-blob-offset bb) 
906                       mode)
907          v))))
908
909
910(define (endian-blob->u16vector b)
911  (let* ((bb (endian-blob->byte-blob b))
912         (mode (endian-blob-mode b))
913         (n  (byte-blob-length bb)))
914    (assert (and (positive? n) (zero? (modulo n 2))))
915    (if (fx= machine-mode mode) 
916        (byte-blob->u16vector bb)
917        (let* ((s  (/ n 2))
918               (v (make-u16vector s 0)))
919          (to_u16vector s v 
920                        (byte-blob-object bb) 
921                        (byte-blob-offset bb) 
922                        mode)
923          v))))
924
925
926(define (endian-blob->u32vector b)
927  (let* ((bb (endian-blob->byte-blob b))
928         (mode (endian-blob-mode b))
929         (n  (byte-blob-length bb)))
930    (assert (and (positive? n) (zero? (modulo n 4))))
931    (if (fx= machine-mode mode) 
932        (byte-blob->u32vector bb)
933        (let* ((s  (/ n 4))
934               (v (make-u32vector s 0)))
935          (to_u32vector s v 
936                        (byte-blob-object bb) 
937                        (byte-blob-offset bb) 
938                        mode)
939          v))))
940
941
942(define (endian-blob->f32vector b)
943  (let* ((bb (endian-blob->byte-blob b))
944         (mode (endian-blob-mode b))
945         (n  (byte-blob-length bb)))
946    (assert (and (positive? n) (zero? (modulo n 4))))
947    (if (fx= machine-mode mode) 
948         (byte-blob->f32vector bb)
949         (let* ((s  (/ n 4))
950                (v (make-f32vector s 0)))
951           (to_f32vector s v 
952                         (byte-blob-object bb) 
953                         (byte-blob-offset bb) 
954                    mode)
955           v))))
956
957
958(define (endian-blob->f64vector b)
959  (let* ((bb (endian-blob->byte-blob b))
960         (mode (endian-blob-mode b))
961         (n  (byte-blob-length bb)))
962    (assert (and (positive? n) (zero? (modulo n 8))))
963    (if (fx= machine-mode mode) 
964         (byte-blob->f64vector bb)
965         (let* ((s  (/ n 8))
966                (v (make-f64vector s 0)))
967           (to_f64vector s v 
968                         (byte-blob-object bb) 
969                         (byte-blob-offset bb) 
970                         mode)
971           v))))
972
973
974)
Note: See TracBrowser for help on using the repository browser.