commands.cxx

Wed, 02 Jan 2013 23:57:46 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Wed, 02 Jan 2013 23:57:46 +0200
changeset 70
fc257920ac00
parent 69
29a3e669d648
permissions
-rw-r--r--

test

6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 /*
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 * botc source code
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012 Santeri `Dusk` Piippo
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 * All rights reserved.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 *
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 *
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright notice,
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 * this list of conditions and the following disclaimer.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 * this list of conditions and the following disclaimer in the documentation
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 * and/or other materials provided with the distribution.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 * 3. Neither the name of the developer nor the names of its contributors may
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 * be used to endorse or promote products derived from this software without
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16 * specific prior written permission.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 * 4. Redistributions in any form must be accompanied by information on how to
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18 * obtain complete source code for the software and any accompanying
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 * software that uses the software. The source code must either be included
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 * in the distribution or be available for no more than the cost of
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 * distribution plus a nominal fee, and must be freely redistributable
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 * under reasonable conditions. For an executable file, complete source
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 * code means the source code for all modules it contains. It does not
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24 * include source code for modules or files that typically accompany the
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 * major components of the operating system on which the executable file
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 * runs.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 *
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 * POSSIBILITY OF SUCH DAMAGE.
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 */
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 #define __COMMANDS_CXX__
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 #include <stdlib.h>
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 #include <stdio.h>
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
44 #include <string.h>
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 #include "common.h"
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 #include "scriptreader.h"
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 #include "str.h"
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 #include "commands.h"
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
50 // ============================================================================
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
51 // Reads command definitions from commands.def and stores them to memory.
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 void ReadCommands () {
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 12
diff changeset
53 ScriptReader* r = new ScriptReader ("commands.def");
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 g_CommDef = NULL;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 CommandDef* curdef = g_CommDef;
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
56 unsigned int numCommDefs = 0;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57
19
66993500719f Commands w/ arguments are now written correctly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 17
diff changeset
58 while (r->PeekNext().len()) {
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 CommandDef* comm = new CommandDef;
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
60 comm->next = NULL;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
61
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
62 // Number
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
63 r->MustNumber ();
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
64 comm->number = r->token;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
65
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
66 r->MustNext (":");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
67
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
68 // Name
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
69 r->MustNext ();
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
70 comm->name = r->token;
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
71 if (IsKeyword (comm->name))
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
72 r->ParserError ("command name `%s` conflicts with keyword", comm->name.chars());
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
73
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
74 r->MustNext (":");
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
76 // Return value
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
77 r->MustNext ();
68
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
78 comm->returnvalue = GetTypeByName (r->token);
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
79 if (comm->returnvalue == -1)
54
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 38
diff changeset
80 r->ParserError ("bad return value type `%s` for command %s", r->token.chars(), comm->name.chars());
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
81
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
82 r->MustNext (":");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
83
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
84 // Num args
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
85 r->MustNumber ();
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
86 comm->numargs = r->token;
7
118d3d5db64f Improved error handling; added parser warnings
Teemu Piippo <crimsondusk64@gmail.com>
parents: 6
diff changeset
87
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
88 r->MustNext (":");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
89
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
90 // Max args
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
91 r->MustNumber ();
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
92 comm->maxargs = r->token;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
93
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
94 if (comm->maxargs > MAX_MAXARGS)
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
95 r->ParserError ("maxargs (%d) greater than %d!", comm->maxargs, MAX_MAXARGS);
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
96
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
97 // Argument types
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
98 int curarg = 0;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
99 while (curarg < comm->maxargs) {
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
100 r->MustNext (":");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
101 r->MustNext ();
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102
68
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
103 type_e type = GetTypeByName (r->token);
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
104 if (type == -1)
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
105 r->ParserError ("bad argument %d type `%s`", curarg, r->token.chars());
68
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
106 if (type == TYPE_VOID)
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
107 r->ParserError ("void is not a valid argument type!");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
108 comm->argtypes[curarg] = type;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
109
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
110 r->MustNext ("(");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
111 r->MustNext ();
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
112
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
113 // - 1 because of terminating null character
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
114 if (r->token.len() > MAX_ARGNAMELEN - 1)
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
115 r->ParserWarning ("argument name is too long (%d, max is %d)",
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
116 r->token.len(), MAX_ARGNAMELEN - 1);
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
117
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
118 strncpy (comm->argnames[curarg], r->token.chars(), MAX_ARGNAMELEN);
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
119 comm->argnames[curarg][MAX_ARGNAMELEN-1] = 0;
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
120
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
121 // If this is an optional parameter, we need the default value.
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
122 if (curarg >= comm->numargs) {
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
123 r->MustNext ("=");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
124 switch (type) {
68
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
125 case TYPE_INT:
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
126 case TYPE_BOOL:
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
127 r->MustNumber();
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
128 break;
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
129 case TYPE_STRING:
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
130 r->MustString();
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
131 break;
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
132 case TYPE_UNKNOWN:
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
133 case TYPE_VOID:
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
134 break;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 }
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
137 comm->defvals[curarg] = r->token;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 }
10
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
139
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
140 r->MustNext (")");
2c0f76090372 Restructured the command def parser, added parameter lists to definition file.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 8
diff changeset
141 curarg++;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 }
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144 if (!g_CommDef)
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 g_CommDef = comm;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 if (!curdef) {
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 curdef = comm;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149 } else {
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 curdef->next = comm;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151 curdef = comm;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152 }
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 numCommDefs++;
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 }
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
156 if (!numCommDefs)
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
157 r->ParserError ("no commands defined!\n");
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
158
33
fd35f6cb5f28 Added a preprocessor with proper #include support. Macro support via #define is planned too. God, was it a B-I-T-C-H to get working right, though..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 28
diff changeset
159 r->CloseFile ();
28
fb46d3d40064 Added comment support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
160 delete r;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161 printf ("%d command definitions read.\n", numCommDefs);
8
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
162 }
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
163
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
164 // ============================================================================
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
165 // Finds a command by name
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
166 CommandDef* FindCommand (str fname) {
17
b4fcc69e426a Events and commands are now treated properly case-insensitively.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 16
diff changeset
167 CommandDef* comm;
b4fcc69e426a Events and commands are now treated properly case-insensitively.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 16
diff changeset
168 ITERATE_COMMANDS (comm) {
b4fcc69e426a Events and commands are now treated properly case-insensitively.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 16
diff changeset
169 if (!fname.icompare (comm->name))
b4fcc69e426a Events and commands are now treated properly case-insensitively.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 16
diff changeset
170 return comm;
8
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
171 }
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
172
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
173 return NULL;
21
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
174 }
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
175
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
176 // ============================================================================
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
177 // Returns the prototype of the command
21
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
178 str GetCommandPrototype (CommandDef* comm) {
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
179 str text;
65
ec04357f5bb9 Don't try to read expressions as statements. That yields nothing useful and inevidently bombs out anyway.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
180 text += GetTypeName (comm->returnvalue);
21
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
181 text += ' ';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
182 text += comm->name;
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
183 text += '(';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
184
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
185 bool hasOptionalArguments = false;
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
186 for (int i = 0; i < comm->maxargs; i++) {
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
187 if (i == comm->numargs) {
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
188 hasOptionalArguments = true;
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
189 text += '[';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
190 }
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
191
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
192 if (i)
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
193 text += ", ";
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
194
65
ec04357f5bb9 Don't try to read expressions as statements. That yields nothing useful and inevidently bombs out anyway.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
195 text += GetTypeName (comm->argtypes[i]);
21
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
196 text += ' ';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
197 text += comm->argnames[i];
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
198
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
199 if (i >= comm->numargs) {
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
200 text += '=';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
201
68
588cc27e84bb Added constants, these are defined with const, take their value immediately and are replaced out with their value when used. The strlen operator can be used to get a string constant's length.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 67
diff changeset
202 bool isString = comm->argtypes[i] == TYPE_STRING;
21
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
203 if (isString) text += '"';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
204
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
205 char defvalstring[8];
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
206 sprintf (defvalstring, "%d", comm->defvals[i]);
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
207 text += defvalstring;
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
208
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
209 if (isString) text += '"';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
210 }
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
211 }
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
212
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
213 if (hasOptionalArguments)
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
214 text += ']';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
215 text += ')';
ae602e667879 Added -l command line parameter, if given, botc will list all available commands and exit.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
216 return text;
6
0005527cad62 Command definitions are now read into memory.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217 }

mercurial