added an old version of mikmod for dos
[dosdemo] / libs / oldmik / src / mmio.c
diff --git a/libs/oldmik/src/mmio.c b/libs/oldmik/src/mmio.c
new file mode 100644 (file)
index 0000000..1cedb8f
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+
+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
+
+*/
+#include <stdio.h>
+#include "mikmod.h"
+
+char *ERROR_ALLOC_STRUCT="Error allocating structure";
+char *ERROR_LOADING_PATTERN="Error loading pattern";
+char *ERROR_LOADING_TRACK="Error loading track";
+char *ERROR_LOADING_HEADER="Error loading header";
+char *ERROR_NOT_A_MODULE="Unknown module format";
+char *ERROR_LOADING_SAMPLEINFO="Error loading sampleinfo";
+char *ERROR_OUT_OF_HANDLES="Out of sample-handles";
+char *ERROR_SAMPLE_TOO_BIG="Sample too big, out of memory";
+
+char *myerr;
+
+static long _mm_iobase=0;
+
+int _mm_fseek(FILE *stream, long offset, int whence)
+{
+       return fseek(stream,
+                                (whence==SEEK_SET) ? offset+_mm_iobase : offset,
+                                whence);
+}
+
+long _mm_ftell(FILE *stream)
+{
+       return ftell(stream)-_mm_iobase;
+}
+
+void _mm_setiobase(long iobase)
+{
+       _mm_iobase=iobase;
+}
+
+void _mm_write_SBYTE(SBYTE data,FILE *fp)
+{
+       fputc(data,fp);
+}
+
+void _mm_write_UBYTE(UBYTE data,FILE *fp)
+{
+       fputc(data,fp);
+}
+
+void _mm_write_M_UWORD(UWORD data,FILE *fp)
+{
+       _mm_write_UBYTE(data>>8,fp);
+       _mm_write_UBYTE(data&0xff,fp);
+}
+
+void _mm_write_I_UWORD(UWORD data,FILE *fp)
+{
+       _mm_write_UBYTE(data&0xff,fp);
+       _mm_write_UBYTE(data>>8,fp);
+}
+
+void _mm_write_M_SWORD(SWORD data,FILE *fp)
+{
+       _mm_write_M_UWORD((UWORD)data,fp);
+}
+
+void _mm_write_I_SWORD(SWORD data,FILE *fp)
+{
+       _mm_write_I_UWORD((UWORD)data,fp);
+}
+
+void _mm_write_M_ULONG(ULONG data,FILE *fp)
+{
+       _mm_write_M_UWORD(data>>16,fp);
+       _mm_write_M_UWORD(data&0xffff,fp);
+}
+
+void _mm_write_I_ULONG(ULONG data,FILE *fp)
+{
+       _mm_write_I_UWORD(data&0xffff,fp);
+       _mm_write_I_UWORD(data>>16,fp);
+}
+
+void _mm_write_M_SLONG(SLONG data,FILE *fp)
+{
+       _mm_write_M_ULONG((ULONG)data,fp);
+}
+
+void _mm_write_I_SLONG(SLONG data,FILE *fp)
+{
+       _mm_write_I_ULONG((ULONG)data,fp);
+}
+
+
+#define DEFINE_MULTIPLE_WRITE_FUNCTION(type_name, type)        \
+void                                                           \
+_mm_write_##type_name##S (type *buffer, int number, FILE *fp)  \
+{                                                              \
+       while(number>0){                                           \
+               _mm_write_##type_name(*(buffer++),fp);                             \
+               number--;                                                                                          \
+       }                                                                                                                  \
+}
+
+DEFINE_MULTIPLE_WRITE_FUNCTION ( SBYTE,  SBYTE)
+DEFINE_MULTIPLE_WRITE_FUNCTION (UBYTE, UBYTE)
+
+DEFINE_MULTIPLE_WRITE_FUNCTION (M_SWORD,   SWORD)
+DEFINE_MULTIPLE_WRITE_FUNCTION (M_UWORD, UWORD)
+DEFINE_MULTIPLE_WRITE_FUNCTION (I_SWORD,   SWORD)
+DEFINE_MULTIPLE_WRITE_FUNCTION (I_UWORD, UWORD)
+
+DEFINE_MULTIPLE_WRITE_FUNCTION (M_SLONG,   SLONG)
+DEFINE_MULTIPLE_WRITE_FUNCTION (M_ULONG, ULONG)
+DEFINE_MULTIPLE_WRITE_FUNCTION (I_SLONG,   SLONG)
+DEFINE_MULTIPLE_WRITE_FUNCTION (I_ULONG, ULONG)
+
+
+SBYTE _mm_read_SBYTE(FILE *fp)
+{
+       return(fgetc(fp));
+}
+
+UBYTE _mm_read_UBYTE(FILE *fp)
+{
+       return(fgetc(fp));
+}
+
+UWORD _mm_read_M_UWORD(FILE *fp)
+{
+       UWORD result=((UWORD)_mm_read_UBYTE(fp))<<8;
+       result|=_mm_read_UBYTE(fp);
+       return result;
+}
+
+UWORD _mm_read_I_UWORD(FILE *fp)
+{
+       UWORD result=_mm_read_UBYTE(fp);
+       result|=((UWORD)_mm_read_UBYTE(fp))<<8;
+       return result;
+}
+
+SWORD _mm_read_M_SWORD(FILE *fp)
+{
+       return((SWORD)_mm_read_M_UWORD(fp));
+}
+
+SWORD _mm_read_I_SWORD(FILE *fp)
+{
+       return((SWORD)_mm_read_I_UWORD(fp));
+}
+
+ULONG _mm_read_M_ULONG(FILE *fp)
+{
+       ULONG result=((ULONG)_mm_read_M_UWORD(fp))<<16;
+       result|=_mm_read_M_UWORD(fp);
+       return result;
+}
+
+ULONG _mm_read_I_ULONG(FILE *fp)
+{
+       ULONG result=_mm_read_I_UWORD(fp);
+       result|=((ULONG)_mm_read_I_UWORD(fp))<<16;
+       return result;
+}
+
+SLONG _mm_read_M_SLONG(FILE *fp)
+{
+       return((SLONG)_mm_read_M_ULONG(fp));
+}
+
+SLONG _mm_read_I_SLONG(FILE *fp)
+{
+       return((SLONG)_mm_read_I_ULONG(fp));
+}
+
+
+int _mm_read_str(char *buffer,int number,FILE *fp)
+{
+       fread(buffer,1,number,fp);
+       return !feof(fp);
+}
+
+
+#define DEFINE_MULTIPLE_READ_FUNCTION(type_name, type)         \
+int                                                            \
+_mm_read_##type_name##S (type *buffer, int number, FILE *fp)   \
+{                                                              \
+       while(number>0){                                           \
+               *(buffer++)=_mm_read_##type_name(fp);                              \
+               number--;                                                                                          \
+       }                                                                                                                  \
+       return !feof(fp);                                                                                  \
+}
+
+DEFINE_MULTIPLE_READ_FUNCTION ( SBYTE,  SBYTE)
+DEFINE_MULTIPLE_READ_FUNCTION (UBYTE, UBYTE)
+
+DEFINE_MULTIPLE_READ_FUNCTION (M_SWORD,   SWORD)
+DEFINE_MULTIPLE_READ_FUNCTION (M_UWORD, UWORD)
+DEFINE_MULTIPLE_READ_FUNCTION (I_SWORD,   SWORD)
+DEFINE_MULTIPLE_READ_FUNCTION (I_UWORD, UWORD)
+
+DEFINE_MULTIPLE_READ_FUNCTION (M_SLONG,   SLONG)
+DEFINE_MULTIPLE_READ_FUNCTION (M_ULONG, ULONG)
+DEFINE_MULTIPLE_READ_FUNCTION (I_SLONG,   SLONG)
+DEFINE_MULTIPLE_READ_FUNCTION (I_ULONG, ULONG)