The R Project SVN R-packages

Rev

Rev 2080 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *  $Id: SASxport.h,v 1.1 2001/03/23 16:15:26 bates Exp $
 *
 *  This file is derived from code in the SAS Technical Support
 *  document TS-140 "The Record Layout of a Data Set in SAS Transport
 *  (XPORT) Format" available as 
 *       http://ftp.sas.com/techsup/download/technote/ts140.html
 */

#ifndef SASEXPORT_H
#define SASEXPORT_H

#include <string.h>     /* for memcpy and memset */
#include "foreign.h"
#include "swap_bytes.h"

/* double cnxptiee(double from, int fromtype, int totype); */



struct SAS_XPORT_header { 
  char sas_symbol[2][8];    /* should be "SAS     " */
  char saslib[8];       /* should be "SASLIB  " */
  char sasver[8];
  char sas_os[8];
  char sas_create[16];
  char sas_mod[16];
};

struct SAS_XPORT_member { 
  char sas_symbol[8];
  char sas_dsname[8];
  char sasdata[8];
  char sasver[8]; 
  char sas_osname[8];
  char sas_create[16];
  char sas_mod[16];
};

struct SAS_XPORT_namestr {
    short   ntype;              /* VARIABLE TYPE: 1=NUMERIC, 2=CHAR    */
    short   nhfun;              /* HASH OF NNAME (always 0)            */
    short   nlng;               /* LENGTH OF VARIABLE IN OBSERVATION   */
    short   nvar0;              /* VARNUM                              */
    char    nname[8];       /* NAME OF VARIABLE                    */
    char    nlabel[40];     /* LABEL OF VARIABLE                   */
    char    nform[8];       /* NAME OF FORMAT                      */
    short   nfl;                /* FORMAT FIELD LENGTH OR 0            */
    short   nfd;                /* FORMAT NUMBER OF DECIMALS           */
    short   nfj;                /* 0=LEFT JUSTIFICATION, 1=RIGHT JUST  */
    char    nfill[2];           /* (UNUSED, FOR ALIGNMENT AND FUTURE)  */
    char    niform[8];      /* NAME OF INPUT FORMAT                */
    short   nifl;               /* INFORMAT LENGTH ATTRIBUTE           */
    short   nifd;               /* INFORMAT NUMBER OF DECIMALS         */
    long    npos;               /* POSITION OF VALUE IN OBSERVATION    */
    char    rest[52];           /* remaining fields are irrelevant     */
};

#ifdef WORDS_BIGENDIAN

#define char_to_short(from, to)         \
    do { (to) = *((short *)(from)); } while (0)

#define char_to_int(from, to)           \
    do { (to) = *((int *)(from)); } while (0)

#define char_to_uint(from, to)          \
    do { (to) = *((unsigned int *)(from)); } while (0)

#else

#define char_to_short(from, to)         \
do {                        \
    swap_bytes_short(*((short *)(from)), to);   \
} while (0)

#define char_to_int(from, to)           \
do {                        \
    swap_bytes_int(*((int *)(from)), to);   \
} while (0)

#define char_to_uint(from, to)          \
do {                        \
    swap_bytes_uint(*((unsigned int *)(from)), to); \
} while (0)

#endif /* WORDS_BIGENDIAN */

#endif /* SASEXPORT_H */