1
2
3 #include "casmfileinfo.h"
4
5 namespace {
6
7 //==============================================================================
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12
13 /*---------------------------------------------------------------------------*/
14
15 #define SKIP_BLANKS(s) \
16 { \
17 while (*s && (*s == ' ' || *s == '\t') && *s != 10 && *s != 13) s++; \
18 }
19
20 #define GET_WORD(s, p) \
21 { \
22 while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) \
23 *(p++) = *(s++); \
24 *p = '\0'; \
25 }
26
27 #define SKIP_WORD(s) \
28 { \
29 while (*s && *s != ' ' && *s != '\t' && *s != 10 && *s != 13) s++; \
30 }
31
32 /*------------------------------------------------------------------------*/
33
34 #ifdef WIN32
35 #include <stdlib.h>
36 #define TOONZMAXPATHLEN _MAX_PATH
37 #else
38 #include <sys/param.h>
39 #define TOONZMAXPATHLEN MAXPATHLEN
40 #endif
41
42 /*------------------------------------------------------------------------*/
43
get_frame_number(char * s)44 int get_frame_number(char *s) {
45 int j, i = 0;
46 while (s[i] && (s[i] < '0' || s[i] > '9')) i++;
47 if (!s[i]) return 0;
48 j = i;
49 while (s[i] && (s[i] >= '0' && s[i] <= '9')) i++;
50 s[i] = '\0';
51
52 return (atoi(s + j));
53 }
54
55 //==============================================================================
56
compute_casm_range(const char * filename,int & start,int & end,bool & interlaced)57 int compute_casm_range(const char *filename, int &start, int &end,
58 bool &interlaced) {
59 FILE *fp;
60 bool first_flag = true;
61 int cnt, frame = 1;
62 char buffer[TOONZMAXPATHLEN], *s;
63
64 start = 0;
65 end = 0;
66 interlaced = false;
67
68 if (filename)
69 fp = fopen(filename, "r");
70 else
71 fp = fdopen(0, "r");
72
73 if (!fp) return 0;
74
75 cnt = 0;
76
77 while (fgets(buffer, TOONZMAXPATHLEN, fp)) {
78 s = buffer;
79 SKIP_BLANKS(s)
80 if (strncmp(s, "FRAME", 5) == 0) {
81 frame = get_frame_number(s);
82 if (first_flag) {
83 start = frame;
84 first_flag = false;
85 }
86 cnt++;
87 } else if (strncmp(s, "FIELD", 5) == 0)
88 interlaced = true;
89 }
90
91 if (!first_flag)
92 end = frame;
93 else {
94 start = 0;
95 end = 0;
96 }
97
98 if (fp != stdin) fclose(fp);
99
100 if (interlaced) {
101 start = ((start) + 1) / 2;
102 end = ((end) + 1) / 2;
103 }
104
105 return cnt;
106 }
107 }
108
109 //==============================================================================
110
CasmFileInfo(const TFilePath & fp)111 CasmFileInfo::CasmFileInfo(const TFilePath &fp) : m_fp(fp) {}
112
113 //------------------------------------------------------------------------------
114
getFrameRange(int & startFrame,int & endFrame,bool & interlaced)115 void CasmFileInfo::getFrameRange(int &startFrame, int &endFrame,
116 bool &interlaced) {
117 int rc = compute_casm_range(toString(m_fp.getWideString()).c_str(),
118 startFrame, endFrame, interlaced);
119 }
120