/* Name: MMIO.C Description: Miscellaneous I/O routines.. used to solve some portability issues (like big/little endian machines and word alignment in structures ) Also includes mikmod's ingenious error handling variable + some much used error strings. Portability: All systems - all compilers */ package audio.jmikmod.MikMod.MMIO; import java.io.IOException; import persist.SimulatedRandomAccessFile; import audio.jmikmod.MikMod.clMainBase; public class MMIO extends Object { public audio.jmikmod.MikMod.clMainBase m_; public String myerr; public String myerr_file; protected int _mm_iobase; public final int SEEK_SET = 0; public final int SEEK_CUR = 1; public final int SEEK_END = 2; public final int EOF = -1; public MMIO(clMainBase theMain) { m_ = theMain; myerr = new String(); myerr_file = new String(); } public int _mm_fseek(SimulatedRandomAccessFile stream, int offset, int whence) { try { if (whence == SEEK_SET) stream.seek(offset+_mm_iobase); else if (whence == SEEK_CUR) stream.seek(stream.getFilePointer()+offset); else // SEEK_END stream.seek(stream.length()+offset); return 0; } catch(IOException ioe1) { return 0; } /*return fseek(stream, (whence==SEEK_SET) ? offset+_mm_iobase : offset, whence);*/ } public int _mm_rewind(SimulatedRandomAccessFile x) { return _mm_fseek(x,0,SEEK_SET); } public int _mm_ftell(SimulatedRandomAccessFile stream) { try { //return ftell(stream)-_mm_iobase; return (int)(stream.getFilePointer() - _mm_iobase); } catch(IOException ioe1) { return -1; } } public void _mm_setiobase(int iobase) { _mm_iobase=iobase; } public void _mm_write_SBYTE(byte data,SimulatedRandomAccessFile fp) { try { //fputc(data,fp); byte buf[] = new byte[1]; buf[0] = data; fp.write(buf,0,1); } catch(IOException ioe1) { } } public void _mm_write_UBYTE(short data,SimulatedRandomAccessFile fp) { try { //fputc(data,fp); byte buf[] = new byte[1]; buf[0] = (data>127) ? ((byte)(data-256)) : ((byte)data); fp.write(buf,0,1); } catch(IOException ioe1) { } } public void _mm_write_M_UWORD(int data,SimulatedRandomAccessFile fp) { _mm_write_UBYTE((short)((data>>8)&0xff),fp); _mm_write_UBYTE((short)(data&0xff),fp); } public void _mm_write_I_UWORD(int data,SimulatedRandomAccessFile fp) { _mm_write_UBYTE((short)(data&0xff),fp); _mm_write_UBYTE((short)((data>>8)&0xff),fp); } public void _mm_write_M_SWORD(short data,SimulatedRandomAccessFile fp) { _mm_write_M_UWORD((data<0)?(((int)data)+0x10000):data,fp); } public void _mm_write_I_SWORD(short data,SimulatedRandomAccessFile fp) { _mm_write_I_UWORD((data<0)?(((int)data)+0x10000):data,fp); } public void _mm_write_M_ULONG(int data,SimulatedRandomAccessFile fp) { _mm_write_M_UWORD((data>>16)&0xffff,fp); _mm_write_M_UWORD(data&0xffff,fp); } public void _mm_write_I_ULONG(int data,SimulatedRandomAccessFile fp) { _mm_write_I_UWORD(data&0xffff,fp); _mm_write_I_UWORD((data>>16)&0xffff,fp); } public void _mm_write_M_SLONG(int data,SimulatedRandomAccessFile fp) { _mm_write_M_ULONG(data,fp); } public void _mm_write_I_SLONG(int data,SimulatedRandomAccessFile fp) { _mm_write_I_ULONG(data,fp); } public void _mm_write_SBYTES (byte buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_SBYTE(buffer[pos++],fp); number--; } } public void _mm_write_UBYTES2 (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_UBYTE(buffer[pos++],fp); number--; } } public void _mm_write_M_SWORDS (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_M_SWORD(buffer[pos++],fp); number--; } } public void _mm_write_M_UWORDS2 (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_M_UWORD(buffer[pos++],fp); number--; } } public void _mm_write_I_SWORDS (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_I_SWORD(buffer[pos++],fp); number--; } } public void _mm_write_I_UWORDS2 (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_I_UWORD(buffer[pos++],fp); number--; } } public void _mm_write_M_SLONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_M_SLONG(buffer[pos++],fp); number--; } } public void _mm_write_M_ULONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_M_ULONG(buffer[pos++],fp); number--; } } public void _mm_write_I_SLONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_I_SLONG(buffer[pos++],fp); number--; } } public void _mm_write_I_ULONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ _mm_write_I_ULONG(buffer[pos++],fp); number--; } } public byte _mm_read_SBYTE(SimulatedRandomAccessFile fp) { byte buf[] = new byte[1]; fp.read(buf,0,1); return buf[0]; } public short _mm_read_UBYTE(SimulatedRandomAccessFile fp) { //return(fgetc(fp)); return (short)fp.read(); } public int _mm_read_M_UWORD(SimulatedRandomAccessFile fp) { int result=((int)_mm_read_UBYTE(fp))<<8; result|=_mm_read_UBYTE(fp); return result; } public int _mm_read_I_UWORD(SimulatedRandomAccessFile fp) { int result=_mm_read_UBYTE(fp); result|=((int)_mm_read_UBYTE(fp))<<8; return result; } public short _mm_read_M_SWORD(SimulatedRandomAccessFile fp) { short result=(short)(_mm_read_UBYTE(fp)<<8); result|=_mm_read_UBYTE(fp); return result; //return((short)_mm_read_M_UWORD(fp)); } public short _mm_read_I_SWORD(SimulatedRandomAccessFile fp) { short result = _mm_read_UBYTE(fp); result |= (short)(_mm_read_UBYTE(fp)<<8); return result; //return((short)_mm_read_I_UWORD(fp)); } public int _mm_read_M_ULONG(SimulatedRandomAccessFile fp) { int result=((int)_mm_read_M_UWORD(fp))<<16; result|=_mm_read_M_UWORD(fp); return result; } public int _mm_read_I_ULONG(SimulatedRandomAccessFile fp) { int result=_mm_read_I_UWORD(fp); result|=((int)_mm_read_I_UWORD(fp))<<16; return result; } public int _mm_read_M_SLONG(SimulatedRandomAccessFile fp) { return((int)_mm_read_M_ULONG(fp)); } public int _mm_read_I_SLONG(SimulatedRandomAccessFile fp) { return((int)_mm_read_I_ULONG(fp)); } // isEOF is basically a utility function to catch all the // IOExceptions from the dependandt functions. // It's also make the code look more like the original // C source because it corresponds to feof. public boolean isEOF(SimulatedRandomAccessFile fp) { try { return (fp.getFilePointer() < fp.length()); } catch (IOException ioe1) { return true; } } public boolean _mm_read_str(byte buffer[],int number,SimulatedRandomAccessFile fp) { //fread(buffer,1,number,fp); fp.read(buffer,0,number); //return !feof(fp); return !isEOF(fp); } public boolean _mm_read_SBYTES (byte buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_SBYTE(fp); number--; } return !isEOF(fp); } public boolean _mm_read_UBYTES2 (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_UBYTE(fp); number--; } return !isEOF(fp); } public boolean _mm_read_M_SWORDS (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_M_SWORD(fp); number--; } return !isEOF(fp); } public boolean _mm_read_M_UWORDS2 (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_M_UWORD(fp); number--; } return !isEOF(fp); } public boolean _mm_read_I_SWORDS (short buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_I_SWORD(fp); number--; } return !isEOF(fp); } public boolean _mm_read_I_UWORDS2 (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_I_UWORD(fp); number--; } return !isEOF(fp); } public boolean _mm_read_M_SLONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_M_SLONG(fp); number--; } return !isEOF(fp); } public boolean _mm_read_M_ULONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_M_ULONG(fp); number--; } return !isEOF(fp); } public boolean _mm_read_I_SLONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_I_SLONG(fp); number--; } return !isEOF(fp); } public boolean _mm_read_I_ULONGS (int buffer[], int number, SimulatedRandomAccessFile fp) { int pos=0; while(number>0){ buffer[pos++]=_mm_read_I_ULONG(fp); number--; } return !isEOF(fp); } }