home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / PROGRAM / DDJ9403A.ZIP / DDR.ASC < prev    next >
Text File  |  1994-01-31  |  6KB  |  219 lines

  1. _BINARY-DATA PORTABILITY_
  2. by Jose Luu
  3.  
  4.  
  5. Listing One
  6.          
  7. typedef struct {
  8.      enum ddr_op    operation;     
  9.      struct ddr_ops *operations_vector;
  10.      void *       ddr_public;     /* for application usage */
  11.      char *       ddr_private;         /* for internal use 1 
  12.      */
  13.      char *       ddr_base;       /* for internal use 2 */
  14.      int          nCount;              /* for internal use 3 
  15.      */
  16. }     DDR;
  17.  
  18. struct ddr_ops {
  19.      BOOL (*getlong)();
  20.      BOOL (*putlong)();
  21.      BOOL (*getshort)();
  22.      BOOL (*putshort)();
  23.      BOOL (*getbytes)();
  24.      BOOL (*putbytes)();
  25.      void (*destroy)();
  26. }    ;
  27.  
  28. enum ddr_op {
  29.      DDR_ENCODE = 0,
  30.      DDR_DECODE = 1,
  31. }    ;
  32.  
  33.  
  34.  
  35. Listing Two
  36.  
  37. #ifdef unix              /* used in Ddr.h (via makeheaders) */
  38.  
  39. #if defined(sparc) || defined(rs6000) || defined (hp700) || defined(m88k)
  40. #define BIG_ENDIAN
  41. #define ALIGNED
  42. #elif defined(i86) || defined(vax)
  43. #define LITTLE_ENDIAN
  44. #elif defined(mips)
  45. #define LITTLE_ENDIAN
  46. #define ALIGNED
  47. #endif
  48.  
  49. /* Move<type>(from,to) */
  50.  
  51. /*
  52.  * Byte moving, with byte-swapping.
  53.  * For use on 68000, sparc and most of the riscs
  54.  */
  55.  
  56. #if defined(BIG_ENDIAN)
  57. #define MoveByte(pSrc,pDest)    (*(char*)(pDest) = *((char*)(pSrc)),1)
  58. #define MoveShort(pSrc,pDest)   (*(char*)(pDest) = *((char*)(pSrc)+1),\
  59.                                 *((char*)(pDest)+1) = *(char*)(pSrc),2)
  60. #define MoveLong(pSrc,pDest)    (*(char*)(pDest) = *((char*)(pSrc)+3),\
  61.                                 *((char*)(pDest)+1) = *((char*)(pSrc)+2),\
  62.                                 *((char*)(pDest)+2) = *((char*)(pSrc)+1),\
  63.  
  64. #elif defined(LITTLE_ENDIAN)
  65. #ifndef ALIGNED
  66.  
  67.  /* Low-level byte moving, without byte-swapping. Use these definitions for 386
  68.   * and other low-enders ciscs that dont have alignment constraints. (vax) */
  69.  
  70. #define MoveByte(pSrc,pDest)  (*(char *)(pDest) = *(char*)(pSrc),1)
  71. #define MoveShort(pSrc,pDest) (*(short *)(pDest) = *(short*)(pSrc),2)
  72. #define MoveLong(pSrc,pDest)  (*(long *)(pDest) = *(long*)(pSrc),4)
  73. #else
  74.  
  75.  /* use this for mips(ultrix) and may be other riscs (alpha) */
  76.  
  77. #define MoveByte(pSrc,pDest)  (*(char *)(pDest) = *(char *)(pSrc),1)
  78. #define MoveShort(pSrc,pDest) (*(char*)(pDest) = *((char*)(pSrc)),\
  79.                               *((char*)(pDest)+1) = *(char*)(pSrc)+1,2)
  80. #define MoveLong(pSrc,pDest)  (*(char*)(pDest) = *((char*)(pSrc)),\
  81.                               *((char*)(pDest)+1) = *((char*)(pSrc)+1),\
  82.                               *((char*)(pDest)+2) = *((char*)(pSrc)+2),\
  83.                               *((char*)(pDest)+3) = *(char*)(pSrc)+3, 4)
  84. #endif
  85. #else
  86. #error "unknown machine architecture"
  87. #endif
  88.  
  89.  
  90.  
  91. Example 1
  92.  
  93. struct MYSTRUCTURE {
  94.    int mydata1;
  95.    struc1 mydata2;
  96.    long mydata3;
  97. } mydata;
  98.          
  99. nStatus = fwrite (&mydata, sizeof(MYSTRUCTURE), 1, stream);
  100.  
  101.  
  102.  
  103.  
  104. Example 2
  105.  
  106. (a)
  107.  
  108. struct MYSTRUCTURE {
  109.     int mydata1;
  110.     struc1 mydata2;
  111.     long mydata3;
  112. };
  113.  
  114.  
  115. (b)
  116.          
  117. bool_t ddr_MYSTRUCTURE (ddrs, objp) 
  118.     DDR *ddrs;
  119.     MYSTRUCTURE *objp;
  120. {
  121.     if (!ddr_int(ddrs,objp->mydata1))return (FALSE);
  122.  
  123.     if (!ddr_struc1(ddrs,objp->mydata2))return (FALSE);
  124.     if (!ddr_long(ddrs,objp->mydata3))return (FALSE);
  125.     return (TRUE);
  126. }
  127.  
  128.  
  129. Example 3
  130.  
  131. nStatus =      write (fd, &mydata, sizeof(mydata));
  132. ddr_write (fd, mydata, sizeof(mydata), MYSTRUCTURE, &nStatus);
  133. nStatus = fwrite (&mydata, sizeof(mydata), 1, stream);
  134. ddr_fwrite (&mydata, sizeof(mydata), 1, stream, MYSTRUCTURE, &nStatus);
  135. nStatus = read (fd, &mydata, sizeof(mydata));
  136. ddr_read (fd, &mydata, sizeof(mydata), MYSTRUCTURE, &nStatus); 
  137. nStatus = fread (&mydata, sizeof(mydata), 1, stream);
  138. ddr_fread (&mydata, sizeof(mydata), 1, stream, MYSTRUCTURE, &nStatus);
  139.  
  140.  
  141.  
  142. Example 4
  143.  
  144. (a)
  145.  
  146. ddr_fread (pData, nSize, nNumber, stream, Name, pnStatus) {
  147.     DDR ddrs;
  148.     ddrstdio_create (&ddrs, stream, DDR_DECODE);
  149.  
  150.     if (ddr_##Name(&ddrs,(void*)(pData))) 
  151.        *(pnStatus) = ddrs.nCount;
  152.     else *pnStatus = -1;
  153.     ddrstdio_destroy (&ddrs); /* kill the handle when done */
  154. }
  155.  
  156.  
  157. (b)
  158.  
  159. if (ddr_MYSTRUCTURE(&ddrs,(void*)(pData))) ...
  160.  
  161. (c)
  162.  
  163. bool_t ddr_MYSTRUCTURE (ddrs, objp) 
  164.     DDR *ddrs;
  165.     MYSTRUCTURE *objp;
  166. {
  167.     if (!ddr_int(ddrs, objp->mydata1)) return (FALSE);
  168.     if (!ddr_struc1(ddrs, objp->mydata1)) return (FALSE);
  169.     /* etc... */
  170.     return (TRUE);
  171. }
  172.  
  173.  
  174.  
  175.  
  176. Example 5
  177.  
  178. (a)
  179.          
  180. bool_t ddr_int(DDR * ddrs, int *ip) {
  181.     short sValue;
  182.     switch (ddrs->operation) {
  183.     case DDR_ENCODE:
  184.         return (DDR_PUTSHORT(ddrs, ((short *) ip)));
  185.     case DDR_DECODE:
  186.         *ip = 0;       /* clear whole int because the reading will only affect the lower part */
  187.         if (!DDR_GETSHORT(ddrs, &sValue)) {
  188.             return (FALSE);
  189.         }
  190.         *ip = sValue;  /* this is how the translated int is passed back up */
  191.         return (TRUE);
  192. (b)
  193.          
  194.  #define DDR_GETSHORT (ddrs, shortp)
  195.      (*(ddrs)->operations_vector->getshort)(ddrs, shortp)
  196.      
  197.  
  198.  
  199. Example 6
  200.  
  201. (a)
  202.          
  203. boo_t ddrstdio_getshort(DDR * ddrs, short *sp) {
  204.      short sBuffer;
  205.      if (fread((caddr_t) & sBuffer, sizeof(short), 1, (FILE *) 
  206.             ddrs->ddr_private) != 1)
  207.          return (FALSE);  /* If you cant get the int, return a fail code */
  208.       MoveShort(&sBuffer, sp);
  209.       ddrs->nCount += sizeof(short);
  210.       return (TRUE);
  211.  }
  212.  
  213.  
  214.  
  215. (b)              
  216.  
  217. #define MoveShort(pSrc,pDest) (*(char*)(pDest) = *((char *)(pSrc)+1), *((char*)(pDest)+1) = *(char *)(pSrc))
  218.  
  219.