⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdrstuff.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/* $Header: /home/harrison/c/tcgmsg/ipcv4.0/RCS/xdrstuff.c,v 1.1 91/12/06 17:27:57 harrison Exp Locker: harrison $ */#ifdef GOTXDR#include <rpc/types.h>#include <rpc/xdr.h>#ifdef CRAYextern bool_t xdr_char();extern char *malloc();#define NULL 0#endif#ifdef SEQUENTstatic bool_t xdr_char();  /* below from sun distribution tape */#define NULL 0#endif#ifdef HPUX#define NULL 0#endif#if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX)|| \    defined(AIX) || defined(KSR)extern void *malloc();#elseextern char *malloc();#endif#define XDR_BUF_LEN 4096        /* Size of XDR buffer in bytes */#define XDR_DOUBLE_LEN 8        /* Size of XDR double in bytes */#define XDR_LONG_LEN 4          /* Size of XDR long in bytes */#define XDR_CHAR_LEN 4          /* Size of XDR char in bytes */static char *xdrbuf_decode;static char *xdrbuf_encode;static XDR xdr_decode;static XDR xdr_encode;static int xdr_buf_allocated = 0; /* =1 if buffers allocated, 0 otherwise */extern void Error();void CreateXdrBuf()/*  Call at start to allocate the XDR buffers*/{  if (!xdr_buf_allocated) {    /* Malloc the buffer space */      if ( (xdrbuf_decode = malloc((unsigned) XDR_BUF_LEN)) == (char *) NULL)      Error("CreateXdrBuf: malloc of xdrbuf_decode failed",            (long) XDR_BUF_LEN);    if ( (xdrbuf_encode = malloc((unsigned) XDR_BUF_LEN)) == (char *) NULL)      Error("CreateXdrBuf: malloc of xdrbuf_encode failed",            (long) XDR_BUF_LEN);    /* Associate the xdr memory streams with the buffers */    xdrmem_create(&xdr_decode, xdrbuf_decode, XDR_BUF_LEN, XDR_DECODE);    xdrmem_create(&xdr_encode, xdrbuf_encode, XDR_BUF_LEN, XDR_ENCODE);    xdr_buf_allocated = 1;  }}void DestroyXdrBuf()/*  Call to free the xdr buffers*/{  if (xdr_buf_allocated) {    /* Destroy the buffers and free the space */    xdr_destroy(&xdr_encode);    xdr_destroy(&xdr_decode);    (void) free(xdrbuf_encode);    (void) free(xdrbuf_decode);    xdr_buf_allocated = 0;  }}int WriteXdrDouble(sock, x, n_double)    int sock;    double *x;    long n_double;/*  Write double x[n_double] to the socket translating to XDR representation.  Returned is the number of bytes written to the socket.  All errors are treated as fatal.*/{  int nd_per_buf = (XDR_BUF_LEN-4)/XDR_DOUBLE_LEN;                                              /* No. of XDR doubles per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_double > 0) {    len = (n_double > nd_per_buf) ? nd_per_buf : n_double;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_encode, (u_int) 0))      Error("WriteXdrDouble: xdr_setpos failed", (long) -1);    /* Translate the buffer and then write it to the socket */    if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                   (u_int) sizeof(double), xdr_double))       Error("WriteXdrDouble: xdr_array failed", (long) -1);    lenb = xdr_getpos(&xdr_encode);    if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb)      Error("WriteXdrDouble: WriteToSocket failed", (long) status);    nb += lenb;    n_double -= len;    x += len;  }  return nb;}int ReadXdrDouble(sock, x, n_double)    int sock;    double *x;    long n_double;/*  Read double x[n_double] from the socket translating from XDR representation.  Returned is the number of bytes read from the socket.  All errors are treated as fatal.*/{  int nd_per_buf = (XDR_BUF_LEN-4)/XDR_DOUBLE_LEN;                                               /* No. of XDR doubles per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_double > 0) {    len = (n_double > nd_per_buf) ? nd_per_buf : n_double;    lenb = 4 + len * XDR_DOUBLE_LEN;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_decode, (u_int) 0))      Error("ReadXdrDouble: xdr_setpos failed", (long) -1);    /* Read from the socket and then translate the buffer */    if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb)      Error("ReadXdrDouble: ReadFromSocket failed", (long) status);    if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                    (u_int) sizeof(double), xdr_double))       Error("ReadXdrDouble: xdr_array failed", (long) -1);    nb += lenb;    n_double -= len;    x += len;  }  return nb;}int WriteXdrLong(sock, x, n_long)    int sock;    long *x;    long n_long;/*  Write long x[n_long] to the socket translating to XDR representation.  Returned is the number of bytes written to the socket.  All errors are treated as fatal.*/{  int nd_per_buf = (XDR_BUF_LEN-4)/XDR_LONG_LEN;                                              /* No. of XDR longs per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_long > 0) {    len = (n_long > nd_per_buf) ? nd_per_buf : n_long;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_encode, (u_int) 0))      Error("WriteXdrLong: xdr_setpos failed", (long) -1);    /* Translate the buffer and then write it to the socket */    if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                   (u_int) sizeof(long), xdr_long))       Error("WriteXdrLong: xdr_array failed", (long) -1);    lenb = xdr_getpos(&xdr_encode);    if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb)      Error("WriteXdrLong: WriteToSocket failed", (long) status);    nb += lenb;    n_long -= len;    x += len;  }  return nb;}int ReadXdrLong(sock, x, n_long)    int sock;    long *x;    long n_long;/*  Read long x[n_long] from the socket translating from XDR representation.  Returned is the number of bytes read from the socket.  All errors are treated as fatal.*/{  int nd_per_buf = (XDR_BUF_LEN-4)/XDR_LONG_LEN;                                               /* No. of XDR longs per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_long > 0) {    len = (n_long > nd_per_buf) ? nd_per_buf : n_long;    lenb = 4 + len * XDR_LONG_LEN;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_decode, (u_int) 0))      Error("ReadXdrLong: xdr_setpos failed", (long) -1);    /* Read from the socket and then translate the buffer */    if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb)      Error("ReadXdrLong: ReadFromSocket failed", (long) status);    if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                    (u_int) sizeof(long), xdr_long))       Error("ReadXdrLong: xdr_array failed", (long) -1);    nb += lenb;    n_long -= len;    x += len;  }  return nb;}int WriteXdrChar(sock, x, n_char)    int sock;    char *x;    long n_char;/*  Write char x[n_char] to the socket translating to XDR representation.  Returned is the number of bytes written to the socket.  All errors are treated as fatal.*/{  int nc_per_buf = (XDR_BUF_LEN-4)/XDR_CHAR_LEN;                                              /* No. of XDR chars per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_char > 0) {    len = (n_char > nc_per_buf) ? nc_per_buf : n_char;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_encode, (u_int) 0))      Error("WriteXdrChar: xdr_setpos failed", (long) -1);    /* Translate the buffer and then write it to the socket */    if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                   (u_int) sizeof(char), xdr_char))       Error("WriteXdrChar: xdr_array failed", (long) -1);    lenb = xdr_getpos(&xdr_encode);    if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb)      Error("WriteXdrChar: WriteToSocket failed", (long) status);    nb += lenb;    n_char -= len;    x += len;  }  return nb;}int ReadXdrChar(sock, x, n_char)    int sock;    char *x;    long n_char;/*  Read char x[n_char] from the socket translating from XDR representation.  Returned is the number of bytes read from the socket.  All errors are treated as fatal.*/{  int nc_per_buf = (XDR_BUF_LEN-4)/XDR_CHAR_LEN;                                               /* No. of XDR chars per buf */  int status, nb=0;  u_int len;  long lenb;  if (!xdr_buf_allocated)    CreateXdrBuf();  /* Loop thru buffer loads */      while (n_char > 0) {    len = (n_char > nc_per_buf) ? nc_per_buf : n_char;    lenb = 4 + len * XDR_CHAR_LEN;    /* Position the xdr buffer to the beginning */    if (!xdr_setpos(&xdr_decode, (u_int) 0))      Error("ReadXdrChar: xdr_setpos failed", (long) -1);    /* Read from the socket and then translate the buffer */    if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb)      Error("ReadXdrChar: ReadFromSocket failed", (long) status);    if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN,                    (u_int) sizeof(char), xdr_char))       Error("ReadXdrChar: xdr_array failed", (long) -1);    nb += lenb;    n_char -= len;    x += len;  }  return nb;}#ifdef SEQUENT/* * XDR a char */static bool_t xdr_char(xdrs, cp)        XDR *xdrs;        char *cp;{        int i;        i = (*cp);        if (!xdr_int(xdrs, &i)) {                return (FALSE);        }        *cp = i;        return (TRUE);}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -