SBSPSS/Utils/Libs/GLib/IFF.CPP
2000-12-04 14:13:40 +00:00

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);
}