staden-lg/src/indexseqlibs/mach-io.c

239 lines
3.9 KiB
C

/*
** Machine independant io:
** For reading and writing to big-endian and little-endian files
**
** Routines available:
** be_write_int_1()
** be_write_int_2()
** be_write_int_4()
** be_read_int_1()
** be_read_int_2()
** be_read_int_4()
** le_write_int_1()
** le_write_int_2()
** le_write_int_4()
** le_read_int_1()
** le_read_int_2()
** le_read_int_4()
**
** All routine return:
** 0 - an error has occurred during io operation
** 1 - value suggessfully read or written
*/
#include <stdio.h>
#include "mach-io.h"
/**********************************************************************/
/* IO for big-endian files */
/**********************************************************************/
int be_write_int_1(FILE *fp, uint_1 *i1)
/*
** Write a big-endian int_1
*/
{
if (fwrite(i1, sizeof(uint_1), 1, fp) != 1) return (0);
return (1);
}
int be_write_int_2(FILE *fp, uint_2 *i2)
/*
** Write a big-endian int_2
*/
{
uint_1 buf[sizeof(int_2)];
buf[0] = (uint_1) (*i2>>8)&255;
buf[1] = (uint_1) *i2&255;
if (fwrite(buf, sizeof(buf), 1, fp) != 1) return (0);
return (1);
}
int be_write_int_4(FILE *fp, uint_4 *i4)
/*
** Write a big-endian int_4
*/
{
uint_1 buf[sizeof(*i4)];
buf[0] = (uint_1) (*i4>>24)&255;
buf[1] = (uint_1) (*i4>>16)&255;
buf[2] = (uint_1) (*i4>>8)&255;
buf[3] = (uint_1) *i4&255;
if (fwrite(buf, sizeof(buf), 1, fp) != 1) return (0);
return (1);
}
int be_read_int_1(FILE *fp, uint_1 *i1)
/*
** Read a big-endian int_1
*/
{
if (fread(i1, sizeof(uint_1), 1, fp) != 1) return (0);
return (1);
}
int be_read_int_2(FILE *fp, uint_2 *i2)
/*
** Read a big-endian int_2
*/
{
uint_1 buf[sizeof(int_2)];
if (fread(buf, sizeof(buf), 1, fp) != 1) return (0);
*i2 =
(((uint_2)buf[1]) +
((uint_2)buf[0]<<8));
return (1);
}
int be_read_int_4(FILE *fp, uint_4 *i4)
/*
** Read a big-endian int_4
*/
{
uint_1 buf[sizeof(int_4)];
if (fread(buf, sizeof(buf), 1, fp) != 1) return (0);
*i4 =
(((uint_4)buf[3]) +
((uint_4)buf[2]<<8) +
((uint_4)buf[1]<<16) +
((uint_4)buf[0]<<24));
return (1);
}
/**********************************************************************/
/* IO for little-endian files */
/**********************************************************************/
int le_write_int_1(FILE *fp, uint_1 *i1)
/*
** Write a little-endian int_1
*/
{
if (fwrite(i1, sizeof(uint_1), 1, fp) != 1) return (0);
return (1);
}
int le_write_int_2(FILE *fp, uint_2 *i2)
/*
** Write a little-endian int_2
*/
{
uint_1 buf[sizeof(int_2)];
buf[1] = (uint_1) (*i2>>8)&255;
buf[0] = (uint_1) *i2&255;
if (fwrite(buf, sizeof(buf), 1, fp) != 1) return (0);
return (1);
}
int le_write_int_4(FILE *fp, uint_4 *i4)
/*
** Write a little-endian int_4
*/
{
uint_1 buf[sizeof(int_4)];
buf[3] = (uint_1) (*i4>>24)&255;
buf[2] = (uint_1) (*i4>>16)&255;
buf[1] = (uint_1) (*i4>>8)&255;
buf[0] = (uint_1) *i4&255;
if (fwrite(buf, sizeof(buf), 1, fp) != 1) return (0);
return (1);
}
int le_read_int_1(FILE *fp, uint_1 *i1)
/*
** Read a little-endian int_1
*/
{
if (fread(i1, sizeof(uint_1), 1, fp) != 1) return (0);
return (1);
}
int le_read_int_2(FILE *fp, uint_2 *i2)
/*
** Read a little-endian int_2
*/
{
uint_1 buf[sizeof(int_2)];
if (fread(buf, sizeof(buf), 1, fp) != 1) return (0);
*i2 =
(((uint_2)buf[0]) +
((uint_2)buf[1]<<8));
return (1);
}
int le_read_int_4(FILE *fp, uint_4 *i4)
/*
** Read a little-endian int_4
*/
{
uint_1 buf[sizeof(int_4)];
if (fread(buf, sizeof(buf), 1, fp) != 1) return (0);
*i4 =
(((uint_4)buf[0]) +
((uint_4)buf[1]<<8) +
((uint_4)buf[2]<<16) +
((uint_4)buf[3]<<24));
return (1);
}