home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 13
/
mediashare_13.zip
/
mediashare_13
/
ZIPPED
/
PROGRAM
/
DDJ9403A.ZIP
/
DDR.ASC
< prev
next >
Wrap
Text File
|
1994-01-31
|
6KB
|
219 lines
_BINARY-DATA PORTABILITY_
by Jose Luu
Listing One
typedef struct {
enum ddr_op operation;
struct ddr_ops *operations_vector;
void * ddr_public; /* for application usage */
char * ddr_private; /* for internal use 1
*/
char * ddr_base; /* for internal use 2 */
int nCount; /* for internal use 3
*/
} DDR;
struct ddr_ops {
BOOL (*getlong)();
BOOL (*putlong)();
BOOL (*getshort)();
BOOL (*putshort)();
BOOL (*getbytes)();
BOOL (*putbytes)();
void (*destroy)();
} ;
enum ddr_op {
DDR_ENCODE = 0,
DDR_DECODE = 1,
} ;
Listing Two
#ifdef unix /* used in Ddr.h (via makeheaders) */
#if defined(sparc) || defined(rs6000) || defined (hp700) || defined(m88k)
#define BIG_ENDIAN
#define ALIGNED
#elif defined(i86) || defined(vax)
#define LITTLE_ENDIAN
#elif defined(mips)
#define LITTLE_ENDIAN
#define ALIGNED
#endif
/* Move<type>(from,to) */
/*
* Byte moving, with byte-swapping.
* For use on 68000, sparc and most of the riscs
*/
#if defined(BIG_ENDIAN)
#define MoveByte(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)),1)
#define MoveShort(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)+1),\
*((char*)(pDest)+1) = *(char*)(pSrc),2)
#define MoveLong(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)+3),\
*((char*)(pDest)+1) = *((char*)(pSrc)+2),\
*((char*)(pDest)+2) = *((char*)(pSrc)+1),\
#elif defined(LITTLE_ENDIAN)
#ifndef ALIGNED
/* Low-level byte moving, without byte-swapping. Use these definitions for 386
* and other low-enders ciscs that dont have alignment constraints. (vax) */
#define MoveByte(pSrc,pDest) (*(char *)(pDest) = *(char*)(pSrc),1)
#define MoveShort(pSrc,pDest) (*(short *)(pDest) = *(short*)(pSrc),2)
#define MoveLong(pSrc,pDest) (*(long *)(pDest) = *(long*)(pSrc),4)
#else
/* use this for mips(ultrix) and may be other riscs (alpha) */
#define MoveByte(pSrc,pDest) (*(char *)(pDest) = *(char *)(pSrc),1)
#define MoveShort(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)),\
*((char*)(pDest)+1) = *(char*)(pSrc)+1,2)
#define MoveLong(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)),\
*((char*)(pDest)+1) = *((char*)(pSrc)+1),\
*((char*)(pDest)+2) = *((char*)(pSrc)+2),\
*((char*)(pDest)+3) = *(char*)(pSrc)+3, 4)
#endif
#else
#error "unknown machine architecture"
#endif
Example 1
struct MYSTRUCTURE {
int mydata1;
struc1 mydata2;
long mydata3;
} mydata;
nStatus = fwrite (&mydata, sizeof(MYSTRUCTURE), 1, stream);
Example 2
(a)
struct MYSTRUCTURE {
int mydata1;
struc1 mydata2;
long mydata3;
};
(b)
bool_t ddr_MYSTRUCTURE (ddrs, objp)
DDR *ddrs;
MYSTRUCTURE *objp;
{
if (!ddr_int(ddrs,objp->mydata1))return (FALSE);
if (!ddr_struc1(ddrs,objp->mydata2))return (FALSE);
if (!ddr_long(ddrs,objp->mydata3))return (FALSE);
return (TRUE);
}
Example 3
nStatus = write (fd, &mydata, sizeof(mydata));
ddr_write (fd, mydata, sizeof(mydata), MYSTRUCTURE, &nStatus);
nStatus = fwrite (&mydata, sizeof(mydata), 1, stream);
ddr_fwrite (&mydata, sizeof(mydata), 1, stream, MYSTRUCTURE, &nStatus);
nStatus = read (fd, &mydata, sizeof(mydata));
ddr_read (fd, &mydata, sizeof(mydata), MYSTRUCTURE, &nStatus);
nStatus = fread (&mydata, sizeof(mydata), 1, stream);
ddr_fread (&mydata, sizeof(mydata), 1, stream, MYSTRUCTURE, &nStatus);
Example 4
(a)
ddr_fread (pData, nSize, nNumber, stream, Name, pnStatus) {
DDR ddrs;
ddrstdio_create (&ddrs, stream, DDR_DECODE);
if (ddr_##Name(&ddrs,(void*)(pData)))
*(pnStatus) = ddrs.nCount;
else *pnStatus = -1;
ddrstdio_destroy (&ddrs); /* kill the handle when done */
}
(b)
if (ddr_MYSTRUCTURE(&ddrs,(void*)(pData))) ...
(c)
bool_t ddr_MYSTRUCTURE (ddrs, objp)
DDR *ddrs;
MYSTRUCTURE *objp;
{
if (!ddr_int(ddrs, objp->mydata1)) return (FALSE);
if (!ddr_struc1(ddrs, objp->mydata1)) return (FALSE);
/* etc... */
return (TRUE);
}
Example 5
(a)
bool_t ddr_int(DDR * ddrs, int *ip) {
short sValue;
switch (ddrs->operation) {
case DDR_ENCODE:
return (DDR_PUTSHORT(ddrs, ((short *) ip)));
case DDR_DECODE:
*ip = 0; /* clear whole int because the reading will only affect the lower part */
if (!DDR_GETSHORT(ddrs, &sValue)) {
return (FALSE);
}
*ip = sValue; /* this is how the translated int is passed back up */
return (TRUE);
(b)
#define DDR_GETSHORT (ddrs, shortp)
(*(ddrs)->operations_vector->getshort)(ddrs, shortp)
Example 6
(a)
boo_t ddrstdio_getshort(DDR * ddrs, short *sp) {
short sBuffer;
if (fread((caddr_t) & sBuffer, sizeof(short), 1, (FILE *)
ddrs->ddr_private) != 1)
return (FALSE); /* If you cant get the int, return a fail code */
MoveShort(&sBuffer, sp);
ddrs->nCount += sizeof(short);
return (TRUE);
}
(b)
#define MoveShort(pSrc,pDest) (*(char*)(pDest) = *((char *)(pSrc)+1), *((char*)(pDest)+1) = *(char *)(pSrc))