132 lines
2.8 KiB
C++
132 lines
2.8 KiB
C++
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ ³
|
|
³ FILE: IFF.CPP ³
|
|
³ ³
|
|
³ Written by Carl Muller 25 Sep 1990 ³
|
|
³ Modified by Carl Muller 13 Sep 1991 ³
|
|
³ ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
|
|
|
|
|
|
#include "iff.hpp"
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Start writing an IFF file ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
FILE *IFF_FILE::write(char const *filename)
|
|
{
|
|
stackptr = 0;
|
|
file = fopen(filename, "wb");
|
|
return file;
|
|
}
|
|
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Close an IFF file ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
void IFF_FILE::close()
|
|
{
|
|
fclose(file);
|
|
}
|
|
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Start an IFF form ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
void IFF_FILE::form(char name[5])
|
|
{
|
|
fputc('F', file);
|
|
fputc('O', file);
|
|
fputc('R', file);
|
|
fputc('M', file);
|
|
push(ftell(file));
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
fputc(name[0], file);
|
|
fputc(name[1], file);
|
|
fputc(name[2], file);
|
|
fputc(name[3], file);
|
|
}
|
|
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Finish an IFF form ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
void IFF_FILE::endform()
|
|
{
|
|
long pos1, pos2, len;
|
|
|
|
pos2 = ftell(file);
|
|
if (pos2 & 1)
|
|
{
|
|
fputc(0, file);
|
|
pos2++;
|
|
}
|
|
|
|
pos1 = pop();
|
|
len = pos2 - pos1 - 4L;
|
|
|
|
fseek(file, pos1, SEEK_SET);
|
|
fputc((UCHAR)(len>>24), file);
|
|
fputc((UCHAR)(len>>16) & 255, file);
|
|
fputc((UCHAR)(len>>8) & 255, file);
|
|
fputc((UCHAR)(len&0xff), file);
|
|
|
|
fseek(file,pos2,SEEK_SET);
|
|
}
|
|
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Start an IFF chunk ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
void IFF_FILE::chunk(char name[5])
|
|
{
|
|
fputc(name[0], file);
|
|
fputc(name[1], file);
|
|
fputc(name[2], file);
|
|
fputc(name[3], file);
|
|
push(ftell(file));
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
fputc(0, file);
|
|
}
|
|
|
|
|
|
|
|
/* ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ Finish an IFF chunk ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */
|
|
void IFF_FILE::endchunk()
|
|
{
|
|
long pos1, pos2, len;
|
|
|
|
pos2 = ftell(file);
|
|
if (pos2 & 1)
|
|
{
|
|
fputc(0, file);
|
|
pos2++;
|
|
}
|
|
pos1 = pop();
|
|
len = pos2 - pos1 - 4L;
|
|
fseek(file, pos1, SEEK_SET);
|
|
fputc((UCHAR)(len>>24), file);
|
|
fputc((UCHAR)(len>>16) & 255, file);
|
|
fputc((UCHAR)(len>>8) & 255, file);
|
|
fputc((UCHAR)(len&255), file);
|
|
fseek(file, pos2, SEEK_SET);
|
|
}
|
|
|
|
long IFF_FILE::tell()
|
|
{
|
|
return ftell(file);
|
|
}
|