source: trunk/orbital/CommandParser.h @ 1423

Last change on this file since 1423 was 1423, checked in by sam, 9 years ago

orbital: fix copyright statements.

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