Actual source code: bread.c
2: #include <stdio.h>
3: #include petscsys.h
4: #include src/sys/src/viewer/impls/socket/socket.h
5: #include "mex.h"
8: /*
9: TAKEN from src/sys/src/fileio/sysio.c The swap byte routines are
10: included here because the Matlab programs that use this do NOT
11: link to the PETSc libraries.
12: */
13: #include <errno.h>
14: #if defined(PETSC_HAVE_UNISTD_H)
15: #include <unistd.h>
16: #endif
18: #if !defined(PETSC_WORDS_BIGENDIAN)
19: /*
20: SYByteSwapInt - Swap bytes in an integer
21: */
24: void SYByteSwapInt(int *buff,int n)
25: {
26: int i,j,tmp;
27: char *ptr1,*ptr2 = (char*)&tmp;
28: for (j=0; j<n; j++) {
29: ptr1 = (char*)(buff + j);
30: for (i=0; i<sizeof(int); i++) {
31: ptr2[i] = ptr1[sizeof(int)-1-i];
32: }
33: buff[j] = tmp;
34: }
35: }
36: /*
37: SYByteSwapShort - Swap bytes in a short
38: */
41: void SYByteSwapShort(short *buff,int n)
42: {
43: int i,j;
44: short tmp;
45: char *ptr1,*ptr2 = (char*)&tmp;
46: for (j=0; j<n; j++) {
47: ptr1 = (char*)(buff + j);
48: for (i=0; i<sizeof(short); i++) {
49: ptr2[i] = ptr1[sizeof(int)-1-i];
50: }
51: buff[j] = tmp;
52: }
53: }
54: /*
55: SYByteSwapScalar - Swap bytes in a double
56: Complex is dealt with as if array of double twice as long.
57: */
60: void SYByteSwapScalar(PetscScalar *buff,int n)
61: {
62: int i,j;
63: double tmp,*buff1 = (double*)buff;
64: char *ptr1,*ptr2 = (char*)&tmp;
65: #if defined(PETSC_USE_COMPLEX)
66: n *= 2;
67: #endif
68: for (j=0; j<n; j++) {
69: ptr1 = (char*)(buff1 + j);
70: for (i=0; i<sizeof(double); i++) {
71: ptr2[i] = ptr1[sizeof(double)-1-i];
72: }
73: buff1[j] = tmp;
74: }
75: }
76: #endif
80: /*
81: PetscBinaryRead - Reads from a binary file.
83: Input Parameters:
84: . fd - the file
85: . n - the number of items to read
86: . type - the type of items to read (PETSC_INT or PETSC_SCALAR)
88: Output Parameters:
89: . p - the buffer
91: Notes: does byte swapping to work on all machines.
92: */
93: PetscErrorCode PetscBinaryRead(int fd,void *p,int n,PetscDataType type)
94: {
96: int maxblock,wsize,err;
97: char *pp = (char*)p;
98: #if !defined(PETSC_WORDS_BIGENDIAN)
99: int ntmp = n;
100: void *ptmp = p;
101: #endif
103: maxblock = 65536;
104: if (type == PETSC_INT) n *= sizeof(int);
105: else if (type == PETSC_SCALAR) n *= sizeof(PetscScalar);
106: else if (type == PETSC_SHORT) n *= sizeof(short);
107: else printf("PetscBinaryRead: Unknown type");
108:
109: while (n) {
110: wsize = (n < maxblock) ? n : maxblock;
111: err = read(fd,pp,wsize);
112: #if !defined(PETSC_MISSING_ERRNO_EINTR)
113: if (err < 0 && errno == EINTR) continue;
114: #endif
115: if (!err && wsize > 0) return 1;
116: if (err < 0) {
117: perror("error reading");
118: return err;
119: }
120: n -= err;
121: pp += err;
122: }
123: #if !defined(PETSC_WORDS_BIGENDIAN)
124: if (type == PETSC_INT) SYByteSwapInt((int*)ptmp,ntmp);
125: else if (type == PETSC_SCALAR) SYByteSwapScalar((PetscScalar*)ptmp,ntmp);
126: else if (type == PETSC_SHORT) SYByteSwapShort((short*)ptmp,ntmp);
127: #endif
129: return 0;
130: }