/* Reads/writes 16/32 bit values using little endian */
/* Nice for reading MID files for example            */

#include <stdio.h>
#include <stdlib.h>


int to16bit(int c1, int c2);
long to32bit(int c1, int c2, int c3, int c4);
int read16bit(FILE *f);
long read32bit(FILE *f);
void write16bit(FILE *f, int data);
void write32bit(FILE *f, unsigned long data);


long to32bit(int c1, int c2, int c3, int c4)
{
       long value = 0L;

       value = (c1 & 0xff);
       value = (value<<8) + (c2 & 0xff);
       value = (value<<8) + (c3 & 0xff);
       value = (value<<8) + (c4 & 0xff);
       return (value);
}

int to16bit(int c1, int c2)
{
       return ((c1 & 0xff ) << 8) + (c2 & 0xff);
}

long read32bit(FILE *f)
{
       int c1, c2, c3, c4;

       c1 = getc(f);
       c2 = getc(f);
       c3 = getc(f);
       c4 = getc(f);
       return to32bit(c1, c2, c3, c4);
}

int read16bit(FILE *f)
{
       int c1, c2;

       c1 = getc(f);
       c2 = getc(f);
       return to16bit(c1, c2);
}


void write32bit(FILE *f, unsigned long data)
{
       putc((unsigned)((data >> 24) & 0xffL), f);
       putc((unsigned)((data >> 16) & 0xffL), f);
       putc((unsigned)((data >> 8 ) & 0xffL), f);
       putc((unsigned)(data & 0xff), f);
}

void write16bit(FILE *f, int data)
{
       putc((unsigned)((data & 0xff00) >> 8), f);
       putc((unsigned)(data & 0xff), f);
}