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