source: trunk/orbital/CommandParser.h @ 1327

Last change on this file since 1327 was 1327, checked in by touky, 9 years ago

Added CommandParser parent class to Mesh to prepare other Parser implementation.

File size: 2.6 KB
Line 
1#if !defined __COMMANDPARSER_H__
2#define __COMMANDPARSER_H__
3
4class CommandParser
5{
6public:
7    CommandParser()
8    {}
9
10    virtual void SwitchCommand(char const *&command) { }
11    bool CheckCommand(char const *keyword, char const *&command)
12        {
13                return (!strncmp(command, keyword, strlen(keyword))
14            && (command[strlen(keyword)] < 'a' || command[strlen(keyword)] > 'z') \
15            && (command += strlen(keyword)));
16        }
17
18        void SendCommand(char const *command)
19    {
20        for (char const *p = command; p && *p; )
21        {
22                        SwitchCommand(p);
23
24            /* Skip all remaining letters */
25            while (*p && *p >= 'a' && *p <= 'z')
26                p++;
27            /* ... and skip everything until next letter */
28            while (*p && (*p < 'a' || *p > 'z'))
29                p++;
30        }
31    }
32
33    static char const *GetArg(char const *p, float &f)
34    {
35        float sign = 1.0f;
36        f = 0.0f;
37        /* 1) Skip commas until the first valid character, 2) read all
38         * the minus signs, 3) read all the digits, 4) skip all the dots,
39         * if any, 5) read all the remaining digits, if any. */
40        for ( ; *p == ','; p++)
41            ;
42        for ( ; *p == '-'; p++)
43            sign = -sign;
44        for ( ; *p >= '0' && *p <= '9'; p++)
45            f = f * 10.f + (*p - '0');
46        for ( ; *p == '.'; p++)
47            ;
48        for (float div = 10.f; *p >= '0' && *p <= '9'; div *= 10.f)
49            f += (*p++ - '0') / div;
50        f *= sign;
51        return p;
52    }
53
54    static char const *GetArg(char const *p, float &f1, float &f2)
55    {
56        return GetArg(GetArg(p, f1), f2);
57    }
58
59    static char const *GetArg(char const *p, float &f1, float &f2, float &f3)
60    {
61        return GetArg(GetArg(p, f1, f2), f3);
62    }
63
64    static char const *GetArg(char const *p, float &f1, float &f2,
65                                             float &f3, float &f4)
66    {
67        return GetArg(GetArg(p, f1, f2, f3), f4);
68    }
69
70    static char const *GetArg(char const *p, float &f1, float &f2, float &f3,
71                                             float &f4, float &f5)
72    {
73        return GetArg(GetArg(p, f1, f2, f3, f4), f5);
74    }
75
76    static char const *GetArg(char const *p, vec3 &v)
77    {
78        return GetArg(p, v.x, v.y, v.z);
79    }
80
81    static char const *GetArg(char const *p, vec3 &v, float &f)
82    {
83        return GetArg(p, v.x, v.y, v.z, f);
84    }
85
86    static char const *GetArg(char const *p, vec4 &v)
87    {
88        return GetArg(p, v.x, v.y, v.z, v.w);
89    }
90
91    virtual void Flush()
92    {
93    }
94
95private:
96};
97
98#endif /* __COMMANDPARSER_H__ */
99
Note: See TracBrowser for help on using the repository browser.