aboutsummaryrefslogtreecommitdiff
path: root/src/midiio/src/FileIO.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/midiio/src/FileIO.cpp')
-rw-r--r--src/midiio/src/FileIO.cpp761
1 files changed, 761 insertions, 0 deletions
diff --git a/src/midiio/src/FileIO.cpp b/src/midiio/src/FileIO.cpp
new file mode 100644
index 0000000..93ef153
--- /dev/null
+++ b/src/midiio/src/FileIO.cpp
@@ -0,0 +1,761 @@
+//
+// Copyright 1997 by Craig Stuart Sapp, All Rights Reserved.
+// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
+// Creation Date: Fri May 9 22:30:32 PDT 1997
+// Last Modified: Sun Dec 14 03:29:39 GMT-0800 1997
+// Filename: ...sig/maint/code/sigBase/FileIO.cpp
+// Web Address: http://sig.sapp.org/src/sigBase/FileIO.cpp
+// Documentation: http://sig.sapp.org/doc/classes/FileIO
+// Syntax: C++
+//
+// Description: Derived from the fstream class, this class has
+// functions which allow writing binary files in
+// both little and big endian formats. Useful for
+// writing files such as soundfiles and MIDI files
+// which require numbers to be stored in a particular
+// endian format.
+//
+
+#include "FileIO.h"
+#include "sigConfiguration.h"
+
+//////////////////////////////
+//
+// FileIO::FileIO --
+//
+
+FileIO::FileIO(void) {
+ // do nothing
+};
+
+FileIO::FileIO(const char* filename, std::ios::openmode state) :
+#ifdef VISUAL /* for stupid LF-CR prevention in DOS */
+ std::fstream(filename, state | ios::binary) {
+#else
+ std::fstream(filename, state) {
+#endif
+ // do nothing
+};
+
+
+
+//////////////////////////////
+//
+// FileIO::~FileIO --
+//
+
+FileIO::~FileIO() {
+ // do nothing
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::readBigEndian --
+// Read numbers from a file as big endian
+//
+
+void FileIO::readBigEndian(char& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(uchar& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(short& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(ushort& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(long& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(ulong& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(int& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(uint& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(float& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readBigEndian(double& aNumber) {
+ #ifdef OTHEREND
+ readNotMachineEndian(aNumber);
+ #else
+ readMachineEndian(aNumber);
+ #endif
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::readLittleEndian --
+// Read numbers from a file as little endian
+//
+
+void FileIO::readLittleEndian(char& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(uchar& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(short& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(ushort& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(long& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(ulong& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(int& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(uint& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(float& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::readLittleEndian(double& aNumber) {
+ #ifdef OTHEREND
+ readMachineEndian(aNumber);
+ #else
+ readNotMachineEndian(aNumber);
+ #endif
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::readMachineEndian --
+// Read numbers from a file in the same endian as the computer.
+//
+
+void FileIO::readMachineEndian(char& aNumber) {
+ this->read(&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(uchar& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(short& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(ushort& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(long& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(ulong& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(int& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(uint& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(float& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::readMachineEndian(double& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::readNotMachineEndian --
+// Read numbers from a file with different endian from the computer.
+//
+
+void FileIO::readNotMachineEndian(char& aNumber) {
+ this->read(&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(uchar& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(short& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(ushort& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(long& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(ulong& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(int& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(uint& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(float& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+void FileIO::readNotMachineEndian(double& aNumber) {
+ this->read((char*)&aNumber, sizeof(aNumber));
+ aNumber = flipBytes(aNumber);
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::writeBigEndian --
+//
+
+void FileIO::writeBigEndian(char aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(uchar aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(short aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(ushort aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(long aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(ulong aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(int aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(uint aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(float aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeBigEndian(double aNumber) {
+ #ifdef OTHEREND
+ writeNotMachineEndian(aNumber);
+ #else
+ writeMachineEndian(aNumber);
+ #endif
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::writeLittleEndian --
+//
+
+void FileIO::writeLittleEndian(char aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(uchar aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(short aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(ushort aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(long aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(ulong aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(int aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(uint aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(float aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+void FileIO::writeLittleEndian(double aNumber) {
+ #ifdef OTHEREND
+ writeMachineEndian(aNumber);
+ #else
+ writeNotMachineEndian(aNumber);
+ #endif
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::writeMachineEndian --
+//
+
+void FileIO::writeMachineEndian(char aNumber) {
+ this->write(&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(uchar aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(short aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(ushort aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(long aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(ulong aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(int aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(uint aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(float aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeMachineEndian(double aNumber) {
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+
+
+//////////////////////////////
+//
+// FileIO::writeNotMachineEndian --
+//
+
+void FileIO::writeNotMachineEndian(char aNumber) {
+ // aNumber = flipBytes(aNumber);
+ this->write(&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(uchar aNumber) {
+ // aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(short aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(ushort aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(long aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(ulong aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(int aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(uint aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(float aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+void FileIO::writeNotMachineEndian(double aNumber) {
+ aNumber = flipBytes(aNumber);
+ this->write((char*)&aNumber, sizeof(aNumber));
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+// private functions
+//
+
+
+//////////////////////////////
+//
+// flipBytes -- flip the bytes in a number
+//
+
+char FileIO::flipBytes(char aNumber) {
+ return aNumber;
+}
+
+
+uchar FileIO::flipBytes(uchar aNumber) {
+ return aNumber;
+}
+
+
+short FileIO::flipBytes(short aNumber) {
+ static uchar output[2];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[1];
+ output[1] = input[0];
+
+ return *((short*)(&output));
+}
+
+
+ushort FileIO::flipBytes(ushort aNumber) {
+ static uchar output[2];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[1];
+ output[1] = input[0];
+
+ return *((ushort*)(&output));
+}
+
+
+long FileIO::flipBytes(long aNumber) {
+ static uchar output[4];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[3];
+ output[1] = input[2];
+ output[2] = input[1];
+ output[3] = input[0];
+
+ return *((long*)(&output));
+}
+
+
+ulong FileIO::flipBytes(ulong aNumber) {
+ static uchar output[4];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[3];
+ output[1] = input[2];
+ output[2] = input[1];
+ output[3] = input[0];
+
+ return *((ulong*)(&output));
+}
+
+
+int FileIO::flipBytes(int aNumber) {
+ static uchar output[sizeof(uint)];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ for(uint i=0; i<sizeof(int); i++) {
+ output[i] = input[sizeof(int)-1-i];
+ }
+
+ return *((int*)(&output));
+}
+
+
+uint FileIO::flipBytes(uint aNumber) {
+ static uchar output[sizeof(uint)];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ for(uint i=0; i<sizeof(uint); i++) {
+ output[i] = input[sizeof(uint)-1-i];
+ }
+
+ return *((uint*)(&output));
+}
+
+
+
+float FileIO::flipBytes(float aNumber) {
+ static uchar output[4];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[3];
+ output[1] = input[2];
+ output[2] = input[1];
+ output[3] = input[0];
+
+ return *((float*)(&output));
+}
+
+
+double FileIO::flipBytes(double aNumber) {
+ static uchar output[8];
+ static uchar* input;
+ input = (uchar*)(&aNumber);
+
+ output[0] = input[7];
+ output[1] = input[6];
+ output[2] = input[5];
+ output[3] = input[4];
+ output[4] = input[3];
+ output[5] = input[2];
+ output[6] = input[1];
+ output[7] = input[0];
+
+ return *((double*)(&output));
+}
+
+
+
+/* This is what I want to use
+template<class type>
+type FileIO::flipBytes(type aThing) {
+ uchar* input = (uchar*)(&aNumber);
+ uchar output[sizeof(aThing)];
+
+ for(int i=0; i<sizeof(aThing); i++) {
+ output[i] = input[sizeof(aThing) - 1 - i];
+ }
+
+ return *((type*)(&output));
+}
+*/
+
+
+
+// md5sum: a82bcb961043a48d2cae34d5eaac0101 - FileIO.cpp =css= 20030102