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