Category : Files from Magazines
Archive   : DDJ9403A.ZIP
Filename : DDR.ASC

 
Output of file : DDR.ASC contained in archive : DDJ9403A.ZIP
_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(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))



  3 Responses to “Category : Files from Magazines
Archive   : DDJ9403A.ZIP
Filename : DDR.ASC

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/