Blob Blame Raw


#include "casmfileinfo.h"

namespace
{

//==============================================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/*---------------------------------------------------------------------------*/

#define SKIP_BLANKS(s)                                                  \
	{                                                                   \
		while (*s && (*s == ' ' || *s == '\t') && *s != 10 && *s != 13) \
			s++;                                                        \
	}

#define GET_WORD(s, p)                                                \
	{                                                                 \
		while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) \
			*(p++) = *(s++);                                          \
		*p = '\0';                                                    \
	}

#define SKIP_WORD(s)                                                  \
	{                                                                 \
		while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) \
			s++;                                                      \
	}

/*------------------------------------------------------------------------*/

#ifdef WIN32
#include <stdlib.h>
#define TOONZMAXPATHLEN _MAX_PATH
#else
#include <sys/param.h>
#define TOONZMAXPATHLEN MAXPATHLEN
#endif

/*------------------------------------------------------------------------*/

int get_frame_number(char *s)
{
	int j, i = 0;
	while (s[i] && (s[i] < '0' || s[i] > '9'))
		i++;
	if (!s[i])
		return 0;
	j = i;
	while (s[i] && (s[i] >= '0' && s[i] <= '9'))
		i++;
	s[i] = '\0';

	return (atoi(s + j));
}

//==============================================================================

int compute_casm_range(const char *filename, int &start, int &end, bool &interlaced)
{
	FILE *fp;
	bool first_flag = true;
	int cnt, frame = 1;
	char buffer[TOONZMAXPATHLEN], *s;

	start = 0;
	end = 0;
	interlaced = false;

	if (filename)
		fp = fopen(filename, "r");
	else
		fp = fdopen(0, "r");

	if (!fp)
		return 0;

	cnt = 0;

	while (fgets(buffer, TOONZMAXPATHLEN, fp)) {
		s = buffer;
		SKIP_BLANKS(s)
		if (strncmp(s, "FRAME", 5) == 0) {
			frame = get_frame_number(s);
			if (first_flag) {
				start = frame;
				first_flag = false;
			}
			cnt++;
		} else if (strncmp(s, "FIELD", 5) == 0)
			interlaced = true;
	}

	if (!first_flag)
		end = frame;
	else {
		start = 0;
		end = 0;
	}

	if (fp != stdin)
		fclose(fp);

	if (interlaced) {
		start = ((start) + 1) / 2;
		end = ((end) + 1) / 2;
	}

	return cnt;
}
}

//==============================================================================

CasmFileInfo::CasmFileInfo(const TFilePath &fp)
	: m_fp(fp)
{
}

//------------------------------------------------------------------------------

void CasmFileInfo::getFrameRange(int &startFrame, int &endFrame, bool &interlaced)
{
	int rc = compute_casm_range(
		toString(m_fp.getWideString()).c_str(),
		startFrame, endFrame, interlaced);
}