#include "casmfileinfo.h" namespace { //============================================================================== #include #include #include /*---------------------------------------------------------------------------*/ #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 #define TOONZMAXPATHLEN _MAX_PATH #else #include #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); }