Blame src/components/appio/tests/iozone/libbif.c

Packit Service a1973e
/* 
Packit Service a1973e
 * Here is a very simple set of routines to write an Excel worksheet 
Packit Service a1973e
 * Microsoft BIFF format. The Excel version is set to 2.0 so that it 
Packit Service a1973e
 * will work with all versions of Excel.
Packit Service a1973e
 *
Packit Service a1973e
 * Author: Don Capps 
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
/* 
Packit Service a1973e
 * Note: rows and colums should not exceed 255 or this code will 
Packit Service a1973e
 * act poorly
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#ifdef Windows
Packit Service a1973e
#include <Windows.h>
Packit Service a1973e
#endif
Packit Service a1973e
#include <sys/types.h>
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <sys/file.h>
Packit Service a1973e
#if defined(__AIX__) || defined(__FreeBSD__) || defined(__DragonFly__)
Packit Service a1973e
#include <fcntl.h>
Packit Service a1973e
#else
Packit Service a1973e
#include <sys/fcntl.h>
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#if defined(OSV5) || defined(linux) || defined (__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__)
Packit Service a1973e
#include <string.h>
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#if defined(linux) || defined(__DragonFly__) || defined(macosx)
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#if (defined(solaris) && defined( __LP64__ )) || defined(__s390x__) || defined(FreeBSD)
Packit Service a1973e
/* If we are building for 64-bit Solaris, all functions that return pointers
Packit Service a1973e
 * must be declared before they are used; otherwise the compiler will assume
Packit Service a1973e
 * that they return ints and the top 32 bits of the pointer will be lost,
Packit Service a1973e
 * causing segmentation faults.  The following includes take care of this.
Packit Service a1973e
 * It should be safe to add these for all other OSs too, but we're only
Packit Service a1973e
 * doing it for Solaris now in case another OS turns out to be a special case.
Packit Service a1973e
 */
Packit Service a1973e
#include <sys/stat.h>
Packit Service a1973e
#include <fcntl.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <string.h>
Packit Service a1973e
#endif
Packit Service a1973e
/* Little Endian */
Packit Service a1973e
#define ENDIAN_1  1
Packit Service a1973e
/* Big Endian    */
Packit Service a1973e
#define ENDIAN_2  2
Packit Service a1973e
/* Middle Endian */
Packit Service a1973e
#define ENDIAN_3  3
Packit Service a1973e
/* Middle Endian */
Packit Service a1973e
#define ENDIAN_4  4
Packit Service a1973e
Packit Service a1973e
int junk, *junkp;
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
/************************************************************************/
Packit Service a1973e
/* Here is the API... Enjoy 						*/
Packit Service a1973e
/************************************************************************/
Packit Service a1973e
/* Create worksheet 							*/
Packit Service a1973e
int create_xls(char *);			
Packit Service a1973e
/*    Args: Filename							*/
Packit Service a1973e
/*    									*/
Packit Service a1973e
/* Close worksheet 							*/
Packit Service a1973e
void close_xls(int);			
Packit Service a1973e
/*   Args: file descriptor						*/
Packit Service a1973e
/*    									*/
Packit Service a1973e
/* Put a 16 bit integer in worksheet 					*/
Packit Service a1973e
void do_int(int,int,int,int);		
Packit Service a1973e
/*    Args: file descriptor,						*/
Packit Service a1973e
/*    	  value,							*/
Packit Service a1973e
/*	  row,								*/
Packit Service a1973e
/*	  column							*/
Packit Service a1973e
Packit Service a1973e
/* Put a double in 8 byte float 					*/
Packit Service a1973e
void do_float(int,double,int,int); 	
Packit Service a1973e
/*    Args: file descriptor,						*/
Packit Service a1973e
/*    	  value,							*/
Packit Service a1973e
/*	  row,								*/
Packit Service a1973e
/*	  column							*/
Packit Service a1973e
/* Put a string in worksheet 						*/
Packit Service a1973e
void do_label(int,char *,int,int);	
Packit Service a1973e
/*    Args: file descriptor,						*/
Packit Service a1973e
/*   	  string,							*/
Packit Service a1973e
/*	  row,								*/
Packit Service a1973e
/*	  column							*/
Packit Service a1973e
/************************************************************************/
Packit Service a1973e
Packit Service a1973e
char libbif_version[] = "Libbif Version $Revision$";
Packit Service a1973e
void do_eof(int );		/* Used internally */
Packit Service a1973e
void do_header(int );		/* Used internally */
Packit Service a1973e
int endian(void);
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#define BOF 0x9
Packit Service a1973e
#define INTEGER 0x2
Packit Service a1973e
#define FLOAT 0x3
Packit Service a1973e
#define LABEL 0x4
Packit Service a1973e
#define EXCEL_VERS 0x2
Packit Service a1973e
#define WORKSHEET 0x10
Packit Service a1973e
Packit Service a1973e
struct bof_record{ 		/* Beginning of file */
Packit Service a1973e
	char hi_opcode;
Packit Service a1973e
	char lo_opcode;
Packit Service a1973e
	char hi_length;
Packit Service a1973e
	char lo_length;
Packit Service a1973e
	char hi_version;	/* Excel version */
Packit Service a1973e
	char lo_version;
Packit Service a1973e
	char hi_filetype;
Packit Service a1973e
	char lo_filetype;
Packit Service a1973e
	};
Packit Service a1973e
struct int_record {
Packit Service a1973e
	char hi_opcode;		/* Type 2 of record */
Packit Service a1973e
	char lo_opcode;
Packit Service a1973e
	char hi_length;
Packit Service a1973e
	char lo_length;
Packit Service a1973e
	char hi_row;
Packit Service a1973e
	char lo_row;
Packit Service a1973e
	char hi_column;
Packit Service a1973e
	char lo_column;
Packit Service a1973e
	char rgbhi;
Packit Service a1973e
	char rgbmed;
Packit Service a1973e
	char rgblo;
Packit Service a1973e
	char hi_data;
Packit Service a1973e
	char lo_data;
Packit Service a1973e
	};
Packit Service a1973e
struct label_record {
Packit Service a1973e
	char hi_opcode;		/* Type 4 of record */
Packit Service a1973e
	char lo_opcode;
Packit Service a1973e
	char hi_length;
Packit Service a1973e
	char lo_length;
Packit Service a1973e
	char hi_row;
Packit Service a1973e
	char lo_row;
Packit Service a1973e
	char hi_column;
Packit Service a1973e
	char lo_column;
Packit Service a1973e
	char rgbhi;
Packit Service a1973e
	char rgbmed;
Packit Service a1973e
	char rgblo;
Packit Service a1973e
	char string_length;
Packit Service a1973e
	char str_array[256];
Packit Service a1973e
	};
Packit Service a1973e
struct float_record {		/* Type 3 record */
Packit Service a1973e
	char hi_opcode;
Packit Service a1973e
	char lo_opcode;
Packit Service a1973e
	char hi_length;
Packit Service a1973e
	char lo_length;
Packit Service a1973e
	char hi_row;
Packit Service a1973e
	char lo_row;
Packit Service a1973e
	char hi_column;
Packit Service a1973e
	char lo_column;
Packit Service a1973e
	char rgbhi;
Packit Service a1973e
	char rgbmed;
Packit Service a1973e
	char rgblo;
Packit Service a1973e
	double data;
Packit Service a1973e
	};
Packit Service a1973e
/*
Packit Service a1973e
 * Write the EOF and close the file 
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
close_xls(int fd)
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
close_xls(fd)
Packit Service a1973e
int fd;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	do_eof(fd);
Packit Service a1973e
	close(fd);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Create xls worksheet. Create file and put the BOF record in it.
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
int
Packit Service a1973e
create_xls(char *name)
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
create_xls(name)
Packit Service a1973e
char *name;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	int fd;
Packit Service a1973e
	unlink(name);
Packit Service a1973e
#ifdef Windows
Packit Service a1973e
	fd=open(name,O_BINARY|O_CREAT|O_RDWR,0666);
Packit Service a1973e
#else
Packit Service a1973e
	fd=open(name,O_CREAT|O_RDWR,0666);
Packit Service a1973e
#endif
Packit Service a1973e
	if(fd<0)
Packit Service a1973e
	{
Packit Service a1973e
		printf("Error opening file %s\n",name);
Packit Service a1973e
		exit(-1);
Packit Service a1973e
	}
Packit Service a1973e
	do_header(fd);
Packit Service a1973e
	return(fd);
Packit Service a1973e
}
Packit Service a1973e
	
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
do_header(int fd) /* Stick the BOF at the beginning of the file */
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
do_header(fd) 
Packit Service a1973e
int fd;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	struct bof_record bof;
Packit Service a1973e
	bof.hi_opcode=BOF;
Packit Service a1973e
	bof.lo_opcode = 0x0;
Packit Service a1973e
	bof.hi_length=0x4;
Packit Service a1973e
	bof.lo_length=0x0;
Packit Service a1973e
	bof.hi_version=EXCEL_VERS;
Packit Service a1973e
	bof.lo_version=0x0;
Packit Service a1973e
	bof.hi_filetype=WORKSHEET;
Packit Service a1973e
	bof.lo_filetype=0x0;
Packit Service a1973e
	junk=write(fd,&bof,sizeof(struct bof_record));
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Put an integer (16 bit) in the worksheet 
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
do_int(int fd,int val, int row, int column)
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
do_int(fd,val,row,column)
Packit Service a1973e
int fd,val,row,column;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	struct int_record intrec;
Packit Service a1973e
	short s_row,s_column;
Packit Service a1973e
	s_row=(short)row;
Packit Service a1973e
	s_column=(short)column;
Packit Service a1973e
        intrec.hi_opcode=INTEGER;
Packit Service a1973e
        intrec.lo_opcode=0x00;
Packit Service a1973e
        intrec.hi_length=0x09;
Packit Service a1973e
        intrec.lo_length=0x00;
Packit Service a1973e
        intrec.rgbhi=0x0;
Packit Service a1973e
        intrec.rgbmed=0x0;
Packit Service a1973e
        intrec.rgblo=0x0;
Packit Service a1973e
        intrec.hi_row=(char)s_row&0xff;
Packit Service a1973e
        intrec.lo_row=(char)(s_row>>8)&0xff;
Packit Service a1973e
        intrec.hi_column=(char)(s_column&0xff);
Packit Service a1973e
        intrec.lo_column=(char)(s_column>>8)&0xff;
Packit Service a1973e
        intrec.hi_data=(val & 0xff);
Packit Service a1973e
        intrec.lo_data=(val & 0xff00)>>8;
Packit Service a1973e
	junk=write(fd,&intrec,13);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* Note: This routine converts Big Endian to Little Endian 
Packit Service a1973e
 * and writes the record out.
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
/* 
Packit Service a1973e
 * Put a double in the worksheet as 8 byte float in IEEE format.
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
do_float(int fd, double value, int row, int column)
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
do_float(fd, value, row, column)
Packit Service a1973e
int fd;
Packit Service a1973e
double value;
Packit Service a1973e
int row,column;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	struct float_record floatrec;
Packit Service a1973e
	short s_row,s_column;
Packit Service a1973e
	unsigned char *sptr,*dptr;
Packit Service a1973e
	s_row=(short)row;
Packit Service a1973e
	s_column=(short)column;
Packit Service a1973e
        floatrec.hi_opcode=FLOAT;
Packit Service a1973e
        floatrec.lo_opcode=0x00;
Packit Service a1973e
        floatrec.hi_length=0xf;
Packit Service a1973e
        floatrec.lo_length=0x00;
Packit Service a1973e
        floatrec.rgbhi=0x0;
Packit Service a1973e
        floatrec.rgbmed=0x0;
Packit Service a1973e
        floatrec.rgblo=0x0;
Packit Service a1973e
        floatrec.hi_row=(char)(s_row&0xff);
Packit Service a1973e
        floatrec.lo_row=(char)((s_row>>8)&0xff);
Packit Service a1973e
        floatrec.hi_column=(char)(s_column&0xff);
Packit Service a1973e
        floatrec.lo_column=(char)((s_column>>8)&0xff);
Packit Service a1973e
	sptr =(unsigned char *) &value;
Packit Service a1973e
	dptr =(unsigned char *) &floatrec.data;
Packit Service a1973e
Packit Service a1973e
	if(endian()==ENDIAN_2) /* Big Endian */
Packit Service a1973e
	{
Packit Service a1973e
	   dptr[0]=sptr[7]; /* Convert to Little Endian */
Packit Service a1973e
	   dptr[1]=sptr[6];
Packit Service a1973e
	   dptr[2]=sptr[5];
Packit Service a1973e
	   dptr[3]=sptr[4];
Packit Service a1973e
	   dptr[4]=sptr[3];
Packit Service a1973e
	   dptr[5]=sptr[2];
Packit Service a1973e
	   dptr[6]=sptr[1];
Packit Service a1973e
	   dptr[7]=sptr[0];
Packit Service a1973e
	}
Packit Service a1973e
	if(endian()==ENDIAN_3)  /* Middle Endian */
Packit Service a1973e
	{
Packit Service a1973e
	   dptr[0]=sptr[4]; /* 16 bit swapped ARM */
Packit Service a1973e
	   dptr[1]=sptr[5];
Packit Service a1973e
	   dptr[2]=sptr[6];
Packit Service a1973e
	   dptr[3]=sptr[7];
Packit Service a1973e
	   dptr[4]=sptr[0];
Packit Service a1973e
	   dptr[5]=sptr[1];
Packit Service a1973e
	   dptr[6]=sptr[2];
Packit Service a1973e
	   dptr[7]=sptr[3];
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if(endian()==ENDIAN_1) /* Little Endian */
Packit Service a1973e
	{
Packit Service a1973e
	   dptr[0]=sptr[0]; /* Do not convert to Little Endian */
Packit Service a1973e
	   dptr[1]=sptr[1];
Packit Service a1973e
	   dptr[2]=sptr[2];
Packit Service a1973e
	   dptr[3]=sptr[3];
Packit Service a1973e
	   dptr[4]=sptr[4];
Packit Service a1973e
	   dptr[5]=sptr[5];
Packit Service a1973e
	   dptr[6]=sptr[6];
Packit Service a1973e
	   dptr[7]=sptr[7];
Packit Service a1973e
	}
Packit Service a1973e
	if(endian()==-1) /* Unsupported architecture */
Packit Service a1973e
	{
Packit Service a1973e
	   dptr[0]=0;
Packit Service a1973e
	   dptr[1]=0;
Packit Service a1973e
	   dptr[2]=0;
Packit Service a1973e
	   dptr[3]=0;
Packit Service a1973e
	   dptr[4]=0;
Packit Service a1973e
	   dptr[5]=0;
Packit Service a1973e
	   dptr[6]=0;
Packit Service a1973e
	   dptr[7]=0;
Packit Service a1973e
	   printf("Excel output not supported on this architecture.\n");
Packit Service a1973e
	}
Packit Service a1973e
	junk=write(fd,&floatrec,11); /* Don't write floatrec. Padding problems */
Packit Service a1973e
	junk=write(fd,&floatrec.data,8); /* Write value seperately */
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * Put a string as a label in the worksheet.
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
do_label(int fd, char *string, int row, int column)
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
do_label(fd, string, row, column)
Packit Service a1973e
int fd;
Packit Service a1973e
char *string;
Packit Service a1973e
int row,column;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	struct label_record labelrec;
Packit Service a1973e
	short s_row,s_column;
Packit Service a1973e
	int i;
Packit Service a1973e
	for(i=0;i<255;i++)
Packit Service a1973e
		labelrec.str_array[i]=0;
Packit Service a1973e
	s_row=(short)row;
Packit Service a1973e
	s_column=(short)column;
Packit Service a1973e
	i=strlen(string);
Packit Service a1973e
        labelrec.hi_opcode=LABEL;
Packit Service a1973e
        labelrec.lo_opcode=0x00;
Packit Service a1973e
        labelrec.hi_length=0x08; /* 264 total bytes */
Packit Service a1973e
        labelrec.lo_length=0x01;
Packit Service a1973e
        labelrec.rgblo=0x0;
Packit Service a1973e
        labelrec.rgbmed=0x0;
Packit Service a1973e
        labelrec.rgbhi=0x0;
Packit Service a1973e
        labelrec.hi_row=(char)(s_row&0xff);
Packit Service a1973e
        labelrec.lo_row=(char)((s_row>>8)&0xff);
Packit Service a1973e
        labelrec.hi_column=(char)(s_column&0xff);
Packit Service a1973e
        labelrec.lo_column=(char)((s_column>>8)&0xff);
Packit Service a1973e
	labelrec.string_length=i;
Packit Service a1973e
	if(i > 255) /* If too long then terminate it early */
Packit Service a1973e
		string[254]=0;
Packit Service a1973e
	i=strlen(string);
Packit Service a1973e
	strcpy(labelrec.str_array,string);
Packit Service a1973e
Packit Service a1973e
	junk=write(fd,&labelrec,sizeof(struct label_record));
Packit Service a1973e
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/* 
Packit Service a1973e
 * Write the EOF in the file 
Packit Service a1973e
 */
Packit Service a1973e
#ifdef HAVE_ANSIC_C
Packit Service a1973e
void
Packit Service a1973e
do_eof(int fd) 
Packit Service a1973e
{
Packit Service a1973e
#else
Packit Service a1973e
do_eof(fd) 
Packit Service a1973e
int fd;
Packit Service a1973e
{
Packit Service a1973e
#endif
Packit Service a1973e
	char buf[]={0x0a,0x00,0x00,0x00};
Packit Service a1973e
	junk=write(fd,buf,4);
Packit Service a1973e
}
Packit Service a1973e
	
Packit Service a1973e
/* 
Packit Service a1973e
 * Routine to determine the Endian-ness of the system. This
Packit Service a1973e
 * is needed for Iozone to convert doubles (floats) into
Packit Service a1973e
 * Little-endian format. This is needed for Excel to be 
Packit Service a1973e
 * able to interpret the file 
Packit Service a1973e
 */
Packit Service a1973e
int
Packit Service a1973e
endian(void)
Packit Service a1973e
{
Packit Service a1973e
	long long foo = 0x0102030405060708LL;
Packit Service a1973e
	long foo1 = 0x012345678;
Packit Service a1973e
	unsigned char *c,c1,c2,c3,c4,c5,c6,c7,c8;
Packit Service a1973e
	c=(unsigned char *)&foo;
Packit Service a1973e
	c1=*c++;
Packit Service a1973e
	c2=*c++;
Packit Service a1973e
	c3=*c++;
Packit Service a1973e
	c4=*c++;
Packit Service a1973e
	c5=*c++;
Packit Service a1973e
	c6=*c++;
Packit Service a1973e
	c7=*c++;
Packit Service a1973e
	c8=*c;
Packit Service a1973e
Packit Service a1973e
	/*--------------------------------------------------------------*/
Packit Service a1973e
	/* printf("%x %x %x %x %x %x %x %x\n",c1,c2,c3,c4,c5,c6,c7,c8); */
Packit Service a1973e
	/*--------------------------------------------------------------*/
Packit Service a1973e
Packit Service a1973e
	/* Little Endian format ? ( Intel ) */
Packit Service a1973e
	if( (c1==0x08) && (c2==0x07) && (c3==0x06) && (c4==0x05) &&
Packit Service a1973e
		(c5==0x04) && (c6==0x03) && (c7==0x02) && (c8==0x01) )
Packit Service a1973e
		return(ENDIAN_1);
Packit Service a1973e
	/* Big Endian format ?    ( Sparc, Risc... */
Packit Service a1973e
	if( (c1==0x01) && (c2==0x02) && (c3==0x03) && (c4==0x04) &&
Packit Service a1973e
		(c5==0x05) && (c6==0x06) && (c7==0x07) && (c8==0x08) )
Packit Service a1973e
		return(ENDIAN_2);
Packit Service a1973e
	/* Middle Endian format ? ( ARM ... ) */
Packit Service a1973e
	if( (c1==0x04) && (c2==0x03) && (c3==0x02) && (c4==0x01) &&
Packit Service a1973e
		(c5==0x08) && (c6==0x07) && (c7==0x06) && (c8==0x05) )
Packit Service a1973e
		return(ENDIAN_3);
Packit Service a1973e
	c=(unsigned char *)&foo;;
Packit Service a1973e
	c1=*c++;
Packit Service a1973e
	c2=*c++;
Packit Service a1973e
	c3=*c++;
Packit Service a1973e
	c4=*c++;
Packit Service a1973e
	/* Another middle endian format ? ( PDP-11 ... ) */
Packit Service a1973e
	if( (c1==0x34) && (c2==0x12) && (c3==0x78) && (c4==0x56))
Packit Service a1973e
		return(ENDIAN_4);
Packit Service a1973e
Packit Service a1973e
	return(-1);
Packit Service a1973e
}