annotate scn2k/scn2k_cmd.cc @ 66:d112357a0ec1

Fix a bug with savegames introduced with changeset c7bcc0ec2267. Warning: savegames created since c7bcc0ec2267 are probably corrupted, you may have to start the game over. If you chose not to do so, you should replace all occurrences of 'TextWindow' by 'TextImplWindow', and 'Text Window' by 'TextImpl Window' in your save files.
author Thibaut Girka <thib@sitedethib.com>
date Sat, 11 Dec 2010 18:36:20 +0100
parents 4416cfac86ae
children e4a12dd9a51b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
223b71206888 Initial import
thib
parents:
diff changeset
1 /*
223b71206888 Initial import
thib
parents:
diff changeset
2 * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno
223b71206888 Initial import
thib
parents:
diff changeset
3 * All rights reserved.
223b71206888 Initial import
thib
parents:
diff changeset
4 *
223b71206888 Initial import
thib
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
223b71206888 Initial import
thib
parents:
diff changeset
6 * modification, are permitted provided that the following conditions
223b71206888 Initial import
thib
parents:
diff changeset
7 * are met:
223b71206888 Initial import
thib
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
223b71206888 Initial import
thib
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
223b71206888 Initial import
thib
parents:
diff changeset
10 * 2. Redistributions in binary form must reproduce the above copyright
223b71206888 Initial import
thib
parents:
diff changeset
11 * notice, this list of conditions and the following disclaimer in the
223b71206888 Initial import
thib
parents:
diff changeset
12 * documentation and/or other materials provided with the distribution.
223b71206888 Initial import
thib
parents:
diff changeset
13 * 3. The name of the author may not be used to endorse or promote products
223b71206888 Initial import
thib
parents:
diff changeset
14 * derived from this software without specific prior written permission.
223b71206888 Initial import
thib
parents:
diff changeset
15 *
223b71206888 Initial import
thib
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
223b71206888 Initial import
thib
parents:
diff changeset
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
223b71206888 Initial import
thib
parents:
diff changeset
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
223b71206888 Initial import
thib
parents:
diff changeset
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
223b71206888 Initial import
thib
parents:
diff changeset
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
223b71206888 Initial import
thib
parents:
diff changeset
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
223b71206888 Initial import
thib
parents:
diff changeset
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
223b71206888 Initial import
thib
parents:
diff changeset
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
223b71206888 Initial import
thib
parents:
diff changeset
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
223b71206888 Initial import
thib
parents:
diff changeset
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
223b71206888 Initial import
thib
parents:
diff changeset
26 */
223b71206888 Initial import
thib
parents:
diff changeset
27
223b71206888 Initial import
thib
parents:
diff changeset
28
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
29 #include "scn2k.h"
0
223b71206888 Initial import
thib
parents:
diff changeset
30
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
31 #include <stdlib.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
32 #include <stdarg.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
33 #include <stdio.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
34 #include <string.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
35 #include <string>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
36 #include "system/file.h"
0
223b71206888 Initial import
thib
parents:
diff changeset
37
223b71206888 Initial import
thib
parents:
diff changeset
38 using namespace std;
223b71206888 Initial import
thib
parents:
diff changeset
39
223b71206888 Initial import
thib
parents:
diff changeset
40
223b71206888 Initial import
thib
parents:
diff changeset
41 // #define SCN_DUMP
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
42 /* 注意点: @@@ で表記 */
0
223b71206888 Initial import
thib
parents:
diff changeset
43
223b71206888 Initial import
thib
parents:
diff changeset
44
223b71206888 Initial import
thib
parents:
diff changeset
45
223b71206888 Initial import
thib
parents:
diff changeset
46 //bool debug_flag = true;
223b71206888 Initial import
thib
parents:
diff changeset
47 bool debug_flag = false;
223b71206888 Initial import
thib
parents:
diff changeset
48 void dprintf(const char* fmt, ...) {
223b71206888 Initial import
thib
parents:
diff changeset
49 if (debug_flag) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
50 va_list ap;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
51 va_start(ap, fmt);
0
223b71206888 Initial import
thib
parents:
diff changeset
52 vprintf(fmt, ap);
223b71206888 Initial import
thib
parents:
diff changeset
53 va_end(ap);
223b71206888 Initial import
thib
parents:
diff changeset
54 }
223b71206888 Initial import
thib
parents:
diff changeset
55 }
223b71206888 Initial import
thib
parents:
diff changeset
56
223b71206888 Initial import
thib
parents:
diff changeset
57
223b71206888 Initial import
thib
parents:
diff changeset
58 void eprintf(const char* fmt, ...) {
223b71206888 Initial import
thib
parents:
diff changeset
59 va_list ap; va_start(ap, fmt);
223b71206888 Initial import
thib
parents:
diff changeset
60 // vprintf(fmt, ap);
223b71206888 Initial import
thib
parents:
diff changeset
61 va_end(ap);
223b71206888 Initial import
thib
parents:
diff changeset
62 }
223b71206888 Initial import
thib
parents:
diff changeset
63
223b71206888 Initial import
thib
parents:
diff changeset
64 /**************************************************************
223b71206888 Initial import
thib
parents:
diff changeset
65 ** Flag
223b71206888 Initial import
thib
parents:
diff changeset
66 */
223b71206888 Initial import
thib
parents:
diff changeset
67
223b71206888 Initial import
thib
parents:
diff changeset
68 Flags::Flags(void) {
223b71206888 Initial import
thib
parents:
diff changeset
69 int i,j;
223b71206888 Initial import
thib
parents:
diff changeset
70 for (i=0; i<=TYPE_VARMAX; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
71 for (j=0; j<2000; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
72 var[i][j] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
73 }
223b71206888 Initial import
thib
parents:
diff changeset
74 }
223b71206888 Initial import
thib
parents:
diff changeset
75 sys = 0;
223b71206888 Initial import
thib
parents:
diff changeset
76 }
223b71206888 Initial import
thib
parents:
diff changeset
77
223b71206888 Initial import
thib
parents:
diff changeset
78 bool Flags::IsInt(int type) const {
223b71206888 Initial import
thib
parents:
diff changeset
79 int v = type % 26;
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 29
diff changeset
80 return (v >= 0 && v < 7) || v == 25;
0
223b71206888 Initial import
thib
parents:
diff changeset
81 }
223b71206888 Initial import
thib
parents:
diff changeset
82
223b71206888 Initial import
thib
parents:
diff changeset
83 int Flags::MaxIndex(int type) const {
223b71206888 Initial import
thib
parents:
diff changeset
84 switch (type / 26) {
223b71206888 Initial import
thib
parents:
diff changeset
85 case 1:
223b71206888 Initial import
thib
parents:
diff changeset
86 return 63999;
223b71206888 Initial import
thib
parents:
diff changeset
87 case 2:
223b71206888 Initial import
thib
parents:
diff changeset
88 return 31999;
223b71206888 Initial import
thib
parents:
diff changeset
89 case 3:
223b71206888 Initial import
thib
parents:
diff changeset
90 return 15999;
223b71206888 Initial import
thib
parents:
diff changeset
91 case 4:
223b71206888 Initial import
thib
parents:
diff changeset
92 return 7999;
223b71206888 Initial import
thib
parents:
diff changeset
93 default:
223b71206888 Initial import
thib
parents:
diff changeset
94 return 1999;
223b71206888 Initial import
thib
parents:
diff changeset
95 }
223b71206888 Initial import
thib
parents:
diff changeset
96 }
223b71206888 Initial import
thib
parents:
diff changeset
97
223b71206888 Initial import
thib
parents:
diff changeset
98 int Flags::operator()() const {
223b71206888 Initial import
thib
parents:
diff changeset
99 return sys; // rand() % 10000;
223b71206888 Initial import
thib
parents:
diff changeset
100 }
223b71206888 Initial import
thib
parents:
diff changeset
101
223b71206888 Initial import
thib
parents:
diff changeset
102 int Flags::operator() (VarInfo info) const {
223b71206888 Initial import
thib
parents:
diff changeset
103 return Get(info.type, info.number);
223b71206888 Initial import
thib
parents:
diff changeset
104 }
223b71206888 Initial import
thib
parents:
diff changeset
105
223b71206888 Initial import
thib
parents:
diff changeset
106 int Flags::Get(int type, int number) const {
223b71206888 Initial import
thib
parents:
diff changeset
107 int index = type % 26;
223b71206888 Initial import
thib
parents:
diff changeset
108 type /= 26;
223b71206888 Initial import
thib
parents:
diff changeset
109 if (index == 25) {
223b71206888 Initial import
thib
parents:
diff changeset
110 if (var[7][number] != 0) return var[7][number];
223b71206888 Initial import
thib
parents:
diff changeset
111 if (cgm_data.find(number) == cgm_data.end()) return 0;
223b71206888 Initial import
thib
parents:
diff changeset
112 else return 1;
223b71206888 Initial import
thib
parents:
diff changeset
113 }
223b71206888 Initial import
thib
parents:
diff changeset
114 if (index == 10) index = 8;
223b71206888 Initial import
thib
parents:
diff changeset
115 if (index == 11) index = 9;
223b71206888 Initial import
thib
parents:
diff changeset
116 if (index > TYPE_VARMAX || uint(type) > 4) return 0;
223b71206888 Initial import
thib
parents:
diff changeset
117 if (type == 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
118 // A[]..G[], Z[] を直に読む
0
223b71206888 Initial import
thib
parents:
diff changeset
119 if (uint(number) >= 2000) return 0;
223b71206888 Initial import
thib
parents:
diff changeset
120 return var[index][number];
223b71206888 Initial import
thib
parents:
diff changeset
121 } else {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
122 // Ab[]..G4b[], Z8b[] などを読む
0
223b71206888 Initial import
thib
parents:
diff changeset
123 int factor = 1 << (type - 1);
223b71206888 Initial import
thib
parents:
diff changeset
124 int eltsize = 32 / factor;
223b71206888 Initial import
thib
parents:
diff changeset
125 if (uint(number) >= (64000 / factor)) return 0;
223b71206888 Initial import
thib
parents:
diff changeset
126 return (var[index][number / eltsize] >> ((number % eltsize) * factor)) & ((1 << factor) - 1);
223b71206888 Initial import
thib
parents:
diff changeset
127 }
223b71206888 Initial import
thib
parents:
diff changeset
128 }
223b71206888 Initial import
thib
parents:
diff changeset
129
223b71206888 Initial import
thib
parents:
diff changeset
130 void Flags::Set(VarInfo info, int value) {
223b71206888 Initial import
thib
parents:
diff changeset
131 int type = info.type / 26;
223b71206888 Initial import
thib
parents:
diff changeset
132 int index = info.type % 26;
223b71206888 Initial import
thib
parents:
diff changeset
133 if (index == 25) {
223b71206888 Initial import
thib
parents:
diff changeset
134 if (uint(info.number) >= 2000) return;
223b71206888 Initial import
thib
parents:
diff changeset
135 if (value == 0)
223b71206888 Initial import
thib
parents:
diff changeset
136 cgm_data.erase(info.number);
223b71206888 Initial import
thib
parents:
diff changeset
137 else
223b71206888 Initial import
thib
parents:
diff changeset
138 cgm_data.insert(info.number);
223b71206888 Initial import
thib
parents:
diff changeset
139 index = 7;
223b71206888 Initial import
thib
parents:
diff changeset
140 }
223b71206888 Initial import
thib
parents:
diff changeset
141 if (index == 10) index = 8;
223b71206888 Initial import
thib
parents:
diff changeset
142 if (index == 11) index = 9;
223b71206888 Initial import
thib
parents:
diff changeset
143 if (index < 0 || index > TYPE_VARMAX) {
223b71206888 Initial import
thib
parents:
diff changeset
144 fprintf(stderr,"Error: invalid access to Var<%d>[%d]\n",info.type,info.number);
223b71206888 Initial import
thib
parents:
diff changeset
145 }
223b71206888 Initial import
thib
parents:
diff changeset
146 if (type == 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
147 // A[]..G[], Z[] を直に書く
0
223b71206888 Initial import
thib
parents:
diff changeset
148 if (uint(info.number) >= 2000) return;
223b71206888 Initial import
thib
parents:
diff changeset
149 var[index][info.number] = value;
223b71206888 Initial import
thib
parents:
diff changeset
150 } else {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
151 // Ab[]..G4b[], Z8b[] などを書く
0
223b71206888 Initial import
thib
parents:
diff changeset
152 int factor = 1 << (type - 1);
223b71206888 Initial import
thib
parents:
diff changeset
153 int eltsize = 32 / factor;
223b71206888 Initial import
thib
parents:
diff changeset
154 int eltmask = (1 << factor) - 1;
223b71206888 Initial import
thib
parents:
diff changeset
155 int shift = (info.number % eltsize) * factor;
223b71206888 Initial import
thib
parents:
diff changeset
156 if (uint(info.number) >= (64000 / factor)) return;
223b71206888 Initial import
thib
parents:
diff changeset
157 var[index][info.number / eltsize] =
223b71206888 Initial import
thib
parents:
diff changeset
158 (var[index][info.number / eltsize] & ~(eltmask << shift))
223b71206888 Initial import
thib
parents:
diff changeset
159 | (value & eltmask) << shift;
223b71206888 Initial import
thib
parents:
diff changeset
160 }
223b71206888 Initial import
thib
parents:
diff changeset
161 }
223b71206888 Initial import
thib
parents:
diff changeset
162
223b71206888 Initial import
thib
parents:
diff changeset
163 void Flags::SetSys(int value) {
223b71206888 Initial import
thib
parents:
diff changeset
164 sys = value;
223b71206888 Initial import
thib
parents:
diff changeset
165 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
166
0
223b71206888 Initial import
thib
parents:
diff changeset
167 void Flags::SetStr(VarInfo info, string val) {
223b71206888 Initial import
thib
parents:
diff changeset
168 switch(info.type) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
169 case TYPE_VARLOCSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
170 if (info.number >= 3) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
171 loc_str[info.number] = val;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
172 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
173 case TYPE_VARSYSSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
174 if (info.number >= 2000) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
175 sys_str[info.number] = val;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
176 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
177 case TYPE_VARSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
178 if (info.number >= 2000) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
179 str[info.number] = val;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
180 break;
0
223b71206888 Initial import
thib
parents:
diff changeset
181 }
223b71206888 Initial import
thib
parents:
diff changeset
182 return;
223b71206888 Initial import
thib
parents:
diff changeset
183 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
184
0
223b71206888 Initial import
thib
parents:
diff changeset
185 void Flags::Str(int type, unsigned int number, char* buf, int sz) const {
223b71206888 Initial import
thib
parents:
diff changeset
186 if (sz <= 0) return;
223b71206888 Initial import
thib
parents:
diff changeset
187 buf[0] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
188 const string* sptr;
223b71206888 Initial import
thib
parents:
diff changeset
189 switch(type) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
190 case TYPE_VARLOCSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
191 if (number >= 3) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
192 sptr = &loc_str[number];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
193 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
194 case TYPE_VARSYSSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
195 if (number >= 2000) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
196 sptr = &sys_str[number];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
197 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
198 case TYPE_VARSTR:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
199 if (number >= 2000) return;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
200 sptr = &str[number];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
201 break;
0
223b71206888 Initial import
thib
parents:
diff changeset
202 }
223b71206888 Initial import
thib
parents:
diff changeset
203
223b71206888 Initial import
thib
parents:
diff changeset
204 int len = sptr->length();
223b71206888 Initial import
thib
parents:
diff changeset
205 if (sz-1 > len) sz = len;
223b71206888 Initial import
thib
parents:
diff changeset
206 sptr->copy(buf, sz, 0);
223b71206888 Initial import
thib
parents:
diff changeset
207 buf[sz] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
208 return;
223b71206888 Initial import
thib
parents:
diff changeset
209 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
210
0
223b71206888 Initial import
thib
parents:
diff changeset
211 string Flags::Str(int type, unsigned int number) const {
223b71206888 Initial import
thib
parents:
diff changeset
212 switch(type) {
223b71206888 Initial import
thib
parents:
diff changeset
213 case TYPE_VARLOCSTR:
223b71206888 Initial import
thib
parents:
diff changeset
214 if (number >= 3) return "";
223b71206888 Initial import
thib
parents:
diff changeset
215 return loc_str[number];
223b71206888 Initial import
thib
parents:
diff changeset
216 case TYPE_VARSYSSTR:
223b71206888 Initial import
thib
parents:
diff changeset
217 if (number >= 2000) return "";
223b71206888 Initial import
thib
parents:
diff changeset
218 return sys_str[number];
223b71206888 Initial import
thib
parents:
diff changeset
219 case TYPE_VARSTR:
223b71206888 Initial import
thib
parents:
diff changeset
220 if (number >= 2000) return "";
223b71206888 Initial import
thib
parents:
diff changeset
221 return str[number];
223b71206888 Initial import
thib
parents:
diff changeset
222 }
223b71206888 Initial import
thib
parents:
diff changeset
223 return "";
223b71206888 Initial import
thib
parents:
diff changeset
224 }
223b71206888 Initial import
thib
parents:
diff changeset
225
63
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
226 void Flags::Load(const char* save) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
227 Load(save, false);
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
228 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
229
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
230 void Flags::LoadSys(const char* save) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
231 Load(save, true);
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
232 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
233
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
234 void Flags::Load(const char* save, bool sys) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
235 int i, j;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
236 int start, end;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
237 std::string *var_str;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
238 char string_field[] = "V<?>[%04d]=";
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
239
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
240 start = (sys) ? (TYPE_NONSYSVARMAX + 1) : 0;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
241 end = (sys) ? (TYPE_NONSYSVARMAX + 2) : TYPE_NONSYSVARMAX;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
242
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
243 var_str = (sys) ? sys_str : str;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
244 string_field[2] = (sys) ? 'M' : 'C';
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
245
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
246 for (i=start; i <= end; i++) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
247 for (j=0; j < 2000; j++) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
248 var[i][j] = 0;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
249 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
250 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
251 for (j=0; j<2000; j++) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
252 var_str[j] = "";
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
253 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
254 sys = 0;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
255
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
256 save = strstr(save, "\n[Flags]\n");
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
257
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
258 if (save) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
259 save += strlen("\n[Flags]\n");
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
260 do {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
261 if (save[0] == '[') break; // next section
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
262 if (strncmp(save, string_field, 2) == 0) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
263 if (strncmp(save, string_field, 5) == 0) { // string
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
264 char buf[1024];
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
265 int n;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
266 if (sscanf(save, string_field, &n) == 1) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
267 const char* s = strchr(save, '=');
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
268 s++;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
269 const char* send = strchr(s, '\n');
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
270 int slen = send - s;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
271 strncpy(buf, s, slen);
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
272 buf[slen] = 0;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
273 if (n >= 0 && n < 2000)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
274 var_str[n] = buf;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
275 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
276 } else if (save[2] >= '0' && save[2] <= '9') {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
277 int c, n, v;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
278 if (sscanf(save, "V<%d>[%04d]=%d\n",&c,&n,&v) == 3) {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
279 if (n >= 0 && n < 2000)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
280 {
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
281 if (!sys && c >= 0 && c <= TYPE_NONSYSVARMAX)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
282 var[c][n] = v;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
283 else if (sys && c == TYPE_NONSYSVARMAX + 1)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
284 var[TYPE_NONSYSVARMAX + 1][n] = v;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
285 else if (sys && c == 25)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
286 var[7][n] = v;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
287 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
288 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
289 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
290 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
291 save = strchr(save, '\n');
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
292 if (save)
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
293 save++;
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
294 } while (save);
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
295 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
296 }
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
297
0
223b71206888 Initial import
thib
parents:
diff changeset
298 void Flags::Save(string& save) {
223b71206888 Initial import
thib
parents:
diff changeset
299 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
300 save = "\n[Flags]\n";
63
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
301 int i, j;
0
223b71206888 Initial import
thib
parents:
diff changeset
302 for (i=0; i<=TYPE_NONSYSVARMAX; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
303 for (j=0; j<2000; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
304 if (var[i][j] != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
305 sprintf(buf, "V<%d>[%04d]=%d\n",i,j,var[i][j]);
223b71206888 Initial import
thib
parents:
diff changeset
306 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
307 }
223b71206888 Initial import
thib
parents:
diff changeset
308 }
223b71206888 Initial import
thib
parents:
diff changeset
309 }
223b71206888 Initial import
thib
parents:
diff changeset
310 for (j=0; j<2000; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
311 if (str[j].length() != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
312 sprintf(buf, "V<C>[%04d]=%s\n", j, str[j].c_str());
223b71206888 Initial import
thib
parents:
diff changeset
313 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
314 }
223b71206888 Initial import
thib
parents:
diff changeset
315 }
223b71206888 Initial import
thib
parents:
diff changeset
316 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
317
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
318 void Flags::SaveSys(string& save) { //FIXME: see how to factorize with Save
0
223b71206888 Initial import
thib
parents:
diff changeset
319 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
320 int j;
223b71206888 Initial import
thib
parents:
diff changeset
321 save = "\n[Flags]\n";
63
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
322 for (j=0; j<2000; j++) {
0
223b71206888 Initial import
thib
parents:
diff changeset
323 if (var[6][j] != 0) {
63
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
324 sprintf(buf, "V<6>[%04d]=%d\n", j, var[6][j]);
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
325 save += buf;
0
223b71206888 Initial import
thib
parents:
diff changeset
326 }
63
4b9ffe15a87d Refactor Load/LoadSys
Thibaut GIRKA <thib@sitedethib.com>
parents: 62
diff changeset
327 }
0
223b71206888 Initial import
thib
parents:
diff changeset
328 for (j=0; j<2000; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
329 if (var[7][j] != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
330 sprintf(buf, "V<25>[%04d]=%d\n",j,var[7][j]);
223b71206888 Initial import
thib
parents:
diff changeset
331 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
332 }
223b71206888 Initial import
thib
parents:
diff changeset
333 }
223b71206888 Initial import
thib
parents:
diff changeset
334 for (j=0; j<2000; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
335 if (sys_str[j].length() != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
336 sprintf(buf, "V<M>[%04d]=%s\n", j, sys_str[j].c_str());
223b71206888 Initial import
thib
parents:
diff changeset
337 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
338 }
223b71206888 Initial import
thib
parents:
diff changeset
339 }
223b71206888 Initial import
thib
parents:
diff changeset
340 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
341
0
223b71206888 Initial import
thib
parents:
diff changeset
342 bool Flags::Exec(Cmd& cmd) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
343 if (cmd.cmd_type == CMD_FLAGS) { // 代入演算
0
223b71206888 Initial import
thib
parents:
diff changeset
344 if (cmd.args.size() != 2) return false;
223b71206888 Initial import
thib
parents:
diff changeset
345 Set(cmd.args[0], cmd.args[1].value);
223b71206888 Initial import
thib
parents:
diff changeset
346 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
347 return true;
223b71206888 Initial import
thib
parents:
diff changeset
348 }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
349 if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0a) { // 文字列演算
0
223b71206888 Initial import
thib
parents:
diff changeset
350 VarInfo arg1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
351 switch(cmd.cmd3) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
352 case 0:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
353 if (cmd.cmd4 == 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
354 SetStr(arg1, cmd.Str(cmd.args[1]));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
355 } else if (cmd.cmd4 == 1) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
356 string s = cmd.Str(cmd.args[1]);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
357 const char* sc = s.c_str();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
358 int len = cmd.args[2].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
359 int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
360 for (i=0; i < sc[i] && len != 0; i++, len--) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
361 if (sc[i]<0 && sc[i+1]!=0) i++;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
362 }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
363 s.erase(i); // 全角で len 文字まで切り詰める
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
364 SetStr(arg1, s);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
365 // fprintf(stderr,"Set[%d,%d]<-%s\n",arg1.type,arg1.number,s.c_str());
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
366 } else break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
367 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
368 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
369 case 1:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
370 if (cmd.cmd4 == 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
371 SetStr(arg1, "");
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
372 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
373 } else if (cmd.cmd4 == 1) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
374 // 領域指定で文字列クリア
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
375 VarInfo v1 = cmd.args[0];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
376 VarInfo v2 = cmd.args[1];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
377 eprintf("memclear(str). Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
378 if (v1.type != v2.type || (v1.type != TYPE_VARSTR && v1.type != TYPE_VARSYSSTR && v1.type != TYPE_VARLOCSTR)) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
379 eprintf(" error: bad args\n");
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
380 } else {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
381 if (v1.number < 0) v1.number = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
382 if (v2.number > 2000) v2.number = 2000;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
383 for (; v1.number <= v2.number; v1.number++) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
384 SetStr(v1, "");
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
385 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
386 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
387 cmd.clear();
0
223b71206888 Initial import
thib
parents:
diff changeset
388 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
389 case 2:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
390 SetStr(arg1, Str(arg1.type,arg1.number) + cmd.Str(cmd.args[1]));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
391 // fprintf(stderr,"Append[%d,%d]<-%s(%d:%d)\n",arg1.type,arg1.number,Str(arg1.type,arg1.number).c_str(),cmd.args[1].type,cmd.args[1].number);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
392 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
393 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
394 case 3:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
395 SetSys(strlen(cmd.Str(cmd.args[0])));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
396 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
397 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
398 case 4:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
399 { int v = strcmp(cmd.Str(cmd.args[0]), cmd.Str(cmd.args[1]));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
400 // string s1=cmd.Str(cmd.args[0]);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
401 // string s2=cmd.Str(cmd.args[1]);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
402 // fprintf(stderr,"Cmp %s(%d:%d):%s(%d:%d):%d\n",s1.c_str(),cmd.args[0].type,cmd.args[0].number,s2.c_str(),cmd.args[1].type,cmd.args[1].number,v);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
403 if (v < 0) SetSys(-1);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
404 else if (v > 0) SetSys(1);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
405 else SetSys(0);
0
223b71206888 Initial import
thib
parents:
diff changeset
406 cmd.clear();
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
407 break; }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
408 case 5: // substring, index from left
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
409 case 6: // substring, index from right
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
410 // 全角対応らしい
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
411 //FIXME: Make sure it works properly
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
412 { int offset = cmd.args[2].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
413 int len = strlen(cmd.Str(cmd.args[1]));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
414 string str = cmd.Str(cmd.args[1]);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
415 const char* s = str.c_str();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
416 if (cmd.cmd3 == 6) offset = len - offset;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
417 if (offset < 0) offset = 0;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
418 // 先頭 N 文字を読み飛ばす
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
419 int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
420 int offset_top = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
421 for (i=0; i<offset && s[offset_top] != 0; i++) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
422 if (s[offset_top] < 0 && s[offset_top+1] != 0) offset_top += 2;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
423 else offset_top += 1;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
424 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
425 if (s[offset_top] == 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
426 SetStr(arg1, "");
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
427 } else if (cmd.cmd4 == 0) { // 長さ制限なし
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
428 SetStr(arg1, string(s, offset_top, len-offset_top));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
429 } else { // cmd.cmd4 == 1
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
430 int slen = cmd.args[3].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
431 int offset_end = offset_top;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
432 for (i=0; i<slen && s[offset_end] != 0; i++) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
433 if (s[offset_end] < 0 && s[offset_end]+1 != 0) offset_end += 2;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
434 else offset_end += 1;
0
223b71206888 Initial import
thib
parents:
diff changeset
435 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
436 string result(s, offset_top, offset_end-offset_top);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
437 SetStr(arg1, result);
0
223b71206888 Initial import
thib
parents:
diff changeset
438 }
223b71206888 Initial import
thib
parents:
diff changeset
439 cmd.clear();
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
440 break; }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
441 case 7: {// strlen w/ kanji
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
442 const char* s = cmd.Str(cmd.args[0]); int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
443 for (i=0; *s != 0; i++) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
444 if (*s < 0 && s[1] != 0) s += 2;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
445 else s++;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
446 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
447 SetSys(i);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
448 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
449 break; }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
450 case 8: // 文字列を切って短くする
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
451 if (cmd.args[1].value <= 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
452 SetStr(arg1, "");
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
453 } else if (cmd.args[1].value < strlen(cmd.Str(cmd.args[1]))) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
454 Str(arg1.type,arg1.number).erase(cmd.args[1].value);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
455 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
456 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
457 break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
458 case 0x0e: // 漢字モードでitoa
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
459 {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
460 int arg1 = cmd.args[0].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
461 string result;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
462 char wc[3]; wc[2]=0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
463 char buf[20];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
464 if (cmd.cmd4 == 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
465 sprintf(buf, "%d", arg1);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
466 } else { // cmd.cmd4 == 1
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
467 char fmt[20];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
468 sprintf(fmt, "%%%dd", cmd.args[2].value);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
469 sprintf(buf, fmt, arg1);
0
223b71206888 Initial import
thib
parents:
diff changeset
470 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
471 int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
472 for (i=0; buf[i] != 0; i++) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
473 if (buf[i] == ' ') {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
474 wc[0] = 0x81; // ' ' in SHIFT_JIS
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
475 wc[1] = 0x40;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
476 } else if (buf[i] == '-') {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
477 wc[0] = 0x81; // '-' in SHIFT_JIS
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
478 wc[1] = 0x7c;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
479 } else if (isdigit(buf[i])) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
480 wc[0] = 0x82; // number in SHIFT_JIS
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
481 wc[1] = buf[i] - '0' + 0x4f;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
482 } else {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
483 continue;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
484 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
485 result += wc;
0
223b71206888 Initial import
thib
parents:
diff changeset
486 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
487 SetStr(cmd.args[1], result);
0
223b71206888 Initial import
thib
parents:
diff changeset
488 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
489 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
490 break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
491 case 0x0f: case 0x11: // itoa (0x11 の方は zero padding するっぽい)
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
492 if (cmd.cmd4 == 0) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
493 int arg1 = cmd.args[0].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
494 char buf[1024]; sprintf(buf, "%d", arg1);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
495 SetStr(cmd.args[1], buf);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
496 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
497 } else if (cmd.cmd4 == 1) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
498 // 漢字(SJIS) : 82 [4f+N]
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
499 // やはり漢字じゃない?
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
500 int arg1 = cmd.args[0].value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
501 char buf[1024]; char fmt[1024];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
502 if (cmd.cmd3 == 0x0f) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
503 sprintf(fmt, "%%%dd",cmd.args[2].value); /* 空白でパディング */
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
504 } else {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
505 sprintf(fmt, "%%0%dd",cmd.args[2].value);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
506 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
507 sprintf(buf, fmt, arg1);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
508 SetStr(cmd.args[1], buf);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
509 cmd.clear();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
510 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
511 break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
512 case 0x64: // 文字列の表示 : 引数をテキストウィンドウに表示
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
513 if (cmd.cmd4 == 1) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
514 char buf[256];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
515 snprintf(buf, 255, "%d", Get(cmd.args[0].type, cmd.args[0].number));
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
516 cmd.args[0].type = TYPE_STR;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
517 cmd.args[0].value = cmd.AddStr(buf);
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
518 cmd.cmd4 = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
519 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
520 cmd.cmd_type = CMD_TEXT;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
521 break;
0
223b71206888 Initial import
thib
parents:
diff changeset
522 }
223b71206888 Initial import
thib
parents:
diff changeset
523 }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
524 if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0b) { // 数値変数演算
0
223b71206888 Initial import
thib
parents:
diff changeset
525 if (cmd.cmd3 == 0 && cmd.cmd4 == 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
526 /* 複数の変数をセット */
0
223b71206888 Initial import
thib
parents:
diff changeset
527 VarInfo v1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
528 eprintf("set multiple-var Var[%d]<%d> <- ",v1.type, v1.number);
223b71206888 Initial import
thib
parents:
diff changeset
529 int i;
223b71206888 Initial import
thib
parents:
diff changeset
530 if (cmd.args.size() < cmd.argc) {
223b71206888 Initial import
thib
parents:
diff changeset
531 eprintf(" error: argsize changed %d -> %d\n",cmd.argc, cmd.args.size());
223b71206888 Initial import
thib
parents:
diff changeset
532 cmd.argc = cmd.args.size();
223b71206888 Initial import
thib
parents:
diff changeset
533 }
223b71206888 Initial import
thib
parents:
diff changeset
534 for (i=0; i<cmd.argc; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
535 eprintf("%d, ",cmd.args[i+1].value);
223b71206888 Initial import
thib
parents:
diff changeset
536 Set(v1, cmd.args[i+1].value);
223b71206888 Initial import
thib
parents:
diff changeset
537 v1.number++;
223b71206888 Initial import
thib
parents:
diff changeset
538 }
223b71206888 Initial import
thib
parents:
diff changeset
539 eprintf("\n");
223b71206888 Initial import
thib
parents:
diff changeset
540 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
541 } else if (cmd.cmd3 == 1 && cmd.cmd4 == 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
542 /* 領域指定で変数をクリア */
0
223b71206888 Initial import
thib
parents:
diff changeset
543 VarInfo v1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
544 VarInfo v2 = cmd.args[1];
223b71206888 Initial import
thib
parents:
diff changeset
545 eprintf("memclear. Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
223b71206888 Initial import
thib
parents:
diff changeset
546 if (v1.type != v2.type || !IsInt(v1.type)) eprintf(" error: bad args\n");
223b71206888 Initial import
thib
parents:
diff changeset
547 else {
223b71206888 Initial import
thib
parents:
diff changeset
548 if (v1.number < 0) v1.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
549 if (v2.number > MaxIndex(v2.type)) v2.number = MaxIndex(v2.type);
223b71206888 Initial import
thib
parents:
diff changeset
550 for (; v1.number <= v2.number; v1.number++)
223b71206888 Initial import
thib
parents:
diff changeset
551 Set(v1, 0);
223b71206888 Initial import
thib
parents:
diff changeset
552 }
223b71206888 Initial import
thib
parents:
diff changeset
553 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
554 } else if (cmd.cmd3 == 1 && cmd.cmd4 == 1) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
555 /* 領域指定で変数をセット */
0
223b71206888 Initial import
thib
parents:
diff changeset
556 VarInfo v1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
557 VarInfo v2 = cmd.args[1];
223b71206888 Initial import
thib
parents:
diff changeset
558 int value = cmd.args[2].value;
223b71206888 Initial import
thib
parents:
diff changeset
559 eprintf("memset. Var[%d]<%d> - Var[%d]<%d> <- %d\n",v1.type, v1.number, v2.type, v2.number, value);
223b71206888 Initial import
thib
parents:
diff changeset
560 if (v1.type != v2.type || !IsInt(v1.type)) eprintf(" error: bad args\n");
223b71206888 Initial import
thib
parents:
diff changeset
561 else {
223b71206888 Initial import
thib
parents:
diff changeset
562 if (v1.number < 0) v1.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
563 if (v2.number > MaxIndex(v2.type)) v2.number = MaxIndex(v2.type);
223b71206888 Initial import
thib
parents:
diff changeset
564 for (; v1.number <= v2.number; v1.number++)
223b71206888 Initial import
thib
parents:
diff changeset
565 Set(v1, value);
223b71206888 Initial import
thib
parents:
diff changeset
566 }
223b71206888 Initial import
thib
parents:
diff changeset
567 cmd.clear();
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
568 } else if (cmd.cmd3 == 4 && cmd.cmd4 == 1) { // 領域クリア(sysfunc.txt)
0
223b71206888 Initial import
thib
parents:
diff changeset
569 VarInfo v1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
570 int step = cmd.args[1].value;
223b71206888 Initial import
thib
parents:
diff changeset
571 int deal = cmd.args[2].value;
223b71206888 Initial import
thib
parents:
diff changeset
572 int val = cmd.args[3].value;
223b71206888 Initial import
thib
parents:
diff changeset
573 eprintf("memclear. Var[%d]<%d> step %d deal %d <- val %d\n",v1.type, v1.number, step, deal, val);
223b71206888 Initial import
thib
parents:
diff changeset
574 int i; for (i=0; i<deal; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
575 Set(v1, val);
223b71206888 Initial import
thib
parents:
diff changeset
576 v1.number += step;
223b71206888 Initial import
thib
parents:
diff changeset
577 }
223b71206888 Initial import
thib
parents:
diff changeset
578 cmd.clear();
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
579 } else if (cmd.cmd3 == 0x64 && cmd.cmd4 == 0) { //領域で数値を合計する
0
223b71206888 Initial import
thib
parents:
diff changeset
580 VarInfo v1 = cmd.args[0];
223b71206888 Initial import
thib
parents:
diff changeset
581 VarInfo v2 = cmd.args[1];
223b71206888 Initial import
thib
parents:
diff changeset
582 eprintf("sum var. Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
223b71206888 Initial import
thib
parents:
diff changeset
583 int sum = 0;
223b71206888 Initial import
thib
parents:
diff changeset
584 if (v1.type != v2.type || !IsInt(v1.type)) eprintf(" error: bad args\n");
223b71206888 Initial import
thib
parents:
diff changeset
585 else {
223b71206888 Initial import
thib
parents:
diff changeset
586 if (v1.number < 0) v1.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
587 if (v2.number > MaxIndex(v2.type)) v2.number = MaxIndex(v2.type);
223b71206888 Initial import
thib
parents:
diff changeset
588 for (; v1.number <= v2.number; v1.number++)
223b71206888 Initial import
thib
parents:
diff changeset
589 sum += (*this)(v1);
223b71206888 Initial import
thib
parents:
diff changeset
590 }
223b71206888 Initial import
thib
parents:
diff changeset
591 eprintf(" ret %d\n",sum);
223b71206888 Initial import
thib
parents:
diff changeset
592 cmd.SetSysvar(sum);
223b71206888 Initial import
thib
parents:
diff changeset
593 }
223b71206888 Initial import
thib
parents:
diff changeset
594 }
223b71206888 Initial import
thib
parents:
diff changeset
595 return false;
223b71206888 Initial import
thib
parents:
diff changeset
596 }
223b71206888 Initial import
thib
parents:
diff changeset
597
223b71206888 Initial import
thib
parents:
diff changeset
598 /*********************************************************************
54
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
599 ** SimpleCmd
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
600 */
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
601
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
602 SimpleCmd::SimpleCmd(int a, int b, int c)
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
603 {
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
604 cmd1 = a;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
605 cmd2 = b;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
606 cmd3 = c;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
607 }
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
608
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
609 SimpleCmd::SimpleCmd(void)
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
610 {
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
611 cmd1 = cmd2 = cmd3 = 0;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
612 }
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
613
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
614 bool SimpleCmd::operator<(const SimpleCmd& cmd) const
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
615 {
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
616 if (cmd1 < cmd.cmd1) return true;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
617 else if (cmd1 > cmd.cmd1) return false;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
618
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
619 if (cmd2 < cmd.cmd2) return true;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
620 else if (cmd2 > cmd.cmd2) return false;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
621
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
622 if (cmd3 < cmd.cmd3) return true;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
623 else return false;
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
624 }
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
625
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
626 bool SimpleCmd::operator==(const SimpleCmd& cmd) const
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
627 {
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
628 return (cmd1 == cmd.cmd1 && cmd2 == cmd.cmd2 && cmd3 == cmd.cmd3);
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
629 }
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
630
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
631
d7cde171a1de * scn2k_grp.cc now handles commands in a cleanier way \o/
thib
parents: 52
diff changeset
632 /*********************************************************************
0
223b71206888 Initial import
thib
parents:
diff changeset
633 ** Cmd
223b71206888 Initial import
thib
parents:
diff changeset
634 */
223b71206888 Initial import
thib
parents:
diff changeset
635
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
636 /* 数値 num := 0x24 0xff <int num> */
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
637 /* 変数 var := 0x24 <uchar type> 0x5b <exp> 0x5d */
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
638 /* 項 token := num | var | 0x28 <exp> 0x29 | <plus|minus> token */
0
223b71206888 Initial import
thib
parents:
diff changeset
639
223b71206888 Initial import
thib
parents:
diff changeset
640 int Cmd::GetLeftToken(const char*& d, VarInfo& info) {
223b71206888 Initial import
thib
parents:
diff changeset
641 bool var_flag = true;
223b71206888 Initial import
thib
parents:
diff changeset
642 int minus_flag = 0;
223b71206888 Initial import
thib
parents:
diff changeset
643 int value = 0;
223b71206888 Initial import
thib
parents:
diff changeset
644 if (d[0] == 0x5c && (d[1] == 1 || d[1] == 0) ) {
223b71206888 Initial import
thib
parents:
diff changeset
645 if (d[1] == 1) {dprintf("minus-"); minus_flag ^= 1;}
223b71206888 Initial import
thib
parents:
diff changeset
646 else dprintf("plus-");
223b71206888 Initial import
thib
parents:
diff changeset
647 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
648 var_flag = false;
223b71206888 Initial import
thib
parents:
diff changeset
649 }
223b71206888 Initial import
thib
parents:
diff changeset
650 if (d[0] == 0x24 && ((unsigned const char*)d)[1] == 0xff) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
651 // if ( (d[0] == 0x30 || d[0] == 0x31) && d[1] == 0x24 && ((unsigned const char*)d)[2] == 0xff) /* @@@ not supported; selection 内で、0x30|0x31 が付随することがある */
0
223b71206888 Initial import
thib
parents:
diff changeset
652 // numerical atom
223b71206888 Initial import
thib
parents:
diff changeset
653 d += 6;
223b71206888 Initial import
thib
parents:
diff changeset
654 value = read_little_endian_int(d-4);
223b71206888 Initial import
thib
parents:
diff changeset
655 dprintf("%d",value);
223b71206888 Initial import
thib
parents:
diff changeset
656 var_flag = false;
223b71206888 Initial import
thib
parents:
diff changeset
657 } else if (d[0] == 0x24 && *(unsigned char*)(d+1) == 0xc8) {
223b71206888 Initial import
thib
parents:
diff changeset
658 dprintf("V<sys>");
223b71206888 Initial import
thib
parents:
diff changeset
659 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
660 info.type = TYPE_SYS; info.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
661 value = info.value = flags();
223b71206888 Initial import
thib
parents:
diff changeset
662 } else if (d[0] == 0x24 && d[2] == 0x5b) {
223b71206888 Initial import
thib
parents:
diff changeset
663 // 0x24,<type>,0x5b,<expr>,0x5d-terminated term
223b71206888 Initial import
thib
parents:
diff changeset
664 info.type = *(unsigned char*)(d+1);
223b71206888 Initial import
thib
parents:
diff changeset
665 d += 3;
223b71206888 Initial import
thib
parents:
diff changeset
666 dprintf("V<%d>[",info.type);
223b71206888 Initial import
thib
parents:
diff changeset
667 info.number = GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
668 dprintf("]");
223b71206888 Initial import
thib
parents:
diff changeset
669 if (*d == 0x5d) d++;
223b71206888 Initial import
thib
parents:
diff changeset
670 else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
671 if (info.type == TYPE_VARSTR || info.type == TYPE_VARSYSSTR || info.type == TYPE_VARLOCSTR) {
223b71206888 Initial import
thib
parents:
diff changeset
672 value = 0;
223b71206888 Initial import
thib
parents:
diff changeset
673 info.value = StrVar(info.type, info.number);
223b71206888 Initial import
thib
parents:
diff changeset
674 } else {
223b71206888 Initial import
thib
parents:
diff changeset
675 value = info.value = flags(info);
223b71206888 Initial import
thib
parents:
diff changeset
676 }
223b71206888 Initial import
thib
parents:
diff changeset
677 dprintf("(=%d)",value);
223b71206888 Initial import
thib
parents:
diff changeset
678 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
679
223b71206888 Initial import
thib
parents:
diff changeset
680 if (minus_flag) value = -value;
223b71206888 Initial import
thib
parents:
diff changeset
681 if (!var_flag) {
223b71206888 Initial import
thib
parents:
diff changeset
682 info.type = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
683 info.value = value;
223b71206888 Initial import
thib
parents:
diff changeset
684 }
223b71206888 Initial import
thib
parents:
diff changeset
685 return value;
223b71206888 Initial import
thib
parents:
diff changeset
686 }
223b71206888 Initial import
thib
parents:
diff changeset
687
47
5f548e5957a8 * get rid of the "deprecated conversion from string constant to ‘char*’" warnings
thib
parents: 44
diff changeset
688 static const char* op_str[70] = {
0
223b71206888 Initial import
thib
parents:
diff changeset
689 // 0 1 2 3 4 5 6 7 8 9
223b71206888 Initial import
thib
parents:
diff changeset
690 "+", "-", "*", "/", "%", "&", "|", "^", "<<", ">>", // +00
223b71206888 Initial import
thib
parents:
diff changeset
691 "err.","err.","err.","err.","err.","err.","err.","err.","err.","err.", // +10
223b71206888 Initial import
thib
parents:
diff changeset
692 "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=", // +20
223b71206888 Initial import
thib
parents:
diff changeset
693 "=", "err.","err.","err.","err.","err.","err.","err.","err.","err.", // +30
223b71206888 Initial import
thib
parents:
diff changeset
694 "==", "!=", "<=", "<", ">=", ">", "err.","err.","err.","err.", // +40
223b71206888 Initial import
thib
parents:
diff changeset
695 "err.","err.","err.","err.","err.","err.","err.","err.","err.","err.", // +50
223b71206888 Initial import
thib
parents:
diff changeset
696 "&&", "||", "err.","err.","err.","err.","err.","err.","err.","err.", // +60
223b71206888 Initial import
thib
parents:
diff changeset
697 };
223b71206888 Initial import
thib
parents:
diff changeset
698
223b71206888 Initial import
thib
parents:
diff changeset
699 static int op_pri_tbl[12] = {
223b71206888 Initial import
thib
parents:
diff changeset
700 // + - * / % & | ^ << >>
223b71206888 Initial import
thib
parents:
diff changeset
701 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10};
223b71206888 Initial import
thib
parents:
diff changeset
702
223b71206888 Initial import
thib
parents:
diff changeset
703 inline int op_pri(int op) {
223b71206888 Initial import
thib
parents:
diff changeset
704 if (op > 11) return 10;
223b71206888 Initial import
thib
parents:
diff changeset
705 return op_pri_tbl[op];
223b71206888 Initial import
thib
parents:
diff changeset
706 }
223b71206888 Initial import
thib
parents:
diff changeset
707 inline int op_pri_cond(int op) {
223b71206888 Initial import
thib
parents:
diff changeset
708 if (op <= 11) return op_pri_tbl[op];
223b71206888 Initial import
thib
parents:
diff changeset
709 else if (op < 50) return 7;
223b71206888 Initial import
thib
parents:
diff changeset
710 else if (op == 60) return 8;
223b71206888 Initial import
thib
parents:
diff changeset
711 else if (op == 61) return 8;
223b71206888 Initial import
thib
parents:
diff changeset
712 else return 10;
223b71206888 Initial import
thib
parents:
diff changeset
713 }
223b71206888 Initial import
thib
parents:
diff changeset
714
223b71206888 Initial import
thib
parents:
diff changeset
715
223b71206888 Initial import
thib
parents:
diff changeset
716 inline int eval(int v1, int op, int v2) {
223b71206888 Initial import
thib
parents:
diff changeset
717 switch(op) {
223b71206888 Initial import
thib
parents:
diff changeset
718 case 0: return v1+v2;
223b71206888 Initial import
thib
parents:
diff changeset
719 case 1: return v1-v2;
223b71206888 Initial import
thib
parents:
diff changeset
720 case 2: return v1*v2;
223b71206888 Initial import
thib
parents:
diff changeset
721 case 3: return v2!=0 ? v1/v2 : v1;
223b71206888 Initial import
thib
parents:
diff changeset
722 case 4: return v2!=0 ? v1%v2 : v1;
223b71206888 Initial import
thib
parents:
diff changeset
723 case 5: return v1&v2;
223b71206888 Initial import
thib
parents:
diff changeset
724 case 6: return v1|v2;
223b71206888 Initial import
thib
parents:
diff changeset
725 case 7: return v1^v2;
223b71206888 Initial import
thib
parents:
diff changeset
726 case 8: return v1<<v2;
223b71206888 Initial import
thib
parents:
diff changeset
727 case 9: return v1>>v2;
223b71206888 Initial import
thib
parents:
diff changeset
728 case 40: return v1 == v2;
223b71206888 Initial import
thib
parents:
diff changeset
729 case 41: return v1 != v2;
223b71206888 Initial import
thib
parents:
diff changeset
730 case 42: return v1 <= v2;
223b71206888 Initial import
thib
parents:
diff changeset
731 case 43: return v1 < v2;
223b71206888 Initial import
thib
parents:
diff changeset
732 case 44: return v1 >= v2;
223b71206888 Initial import
thib
parents:
diff changeset
733 case 45: return v1 > v2;
223b71206888 Initial import
thib
parents:
diff changeset
734 case 60: return v1 && v2;
223b71206888 Initial import
thib
parents:
diff changeset
735 case 61: return v1 || v2;
223b71206888 Initial import
thib
parents:
diff changeset
736 }
223b71206888 Initial import
thib
parents:
diff changeset
737 return v2;
223b71206888 Initial import
thib
parents:
diff changeset
738 }
223b71206888 Initial import
thib
parents:
diff changeset
739
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
740 Cmd::Cmd(const Flags& f, int _sys_ver) : flags(f), system_version(_sys_ver) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
741 cmd_type = CMD_NOP;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
742 argc = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
743 errorflag = false;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
744 cmdstr[0] = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
745 strend = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
746 pos = -1;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
747 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
748
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
749 /* 演算子 op := 0x5c <uchar op> */
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
750 /* 数式 exp: [op] <token> [op <token> [...]] */
0
223b71206888 Initial import
thib
parents:
diff changeset
751 int Cmd::GetExpression(const char*& d, VarInfo* info_ptr) {
223b71206888 Initial import
thib
parents:
diff changeset
752 #define STACK_DEPTH 1024
223b71206888 Initial import
thib
parents:
diff changeset
753 #define OP_LB 11
223b71206888 Initial import
thib
parents:
diff changeset
754 char op_stack[STACK_DEPTH];
223b71206888 Initial import
thib
parents:
diff changeset
755 int val_stack[STACK_DEPTH];
223b71206888 Initial import
thib
parents:
diff changeset
756 int stack_count = 0;
223b71206888 Initial import
thib
parents:
diff changeset
757
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
758 // 第一項の読み込み
0
223b71206888 Initial import
thib
parents:
diff changeset
759 while(*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
760 d++;
223b71206888 Initial import
thib
parents:
diff changeset
761 dprintf("(");
223b71206888 Initial import
thib
parents:
diff changeset
762 op_stack[stack_count++] = OP_LB;
223b71206888 Initial import
thib
parents:
diff changeset
763 }
223b71206888 Initial import
thib
parents:
diff changeset
764 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
765 int value = GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
766
223b71206888 Initial import
thib
parents:
diff changeset
767 while(*d == 0x29 && stack_count > 0 && op_stack[stack_count-1] == OP_LB) {
223b71206888 Initial import
thib
parents:
diff changeset
768 d++;
223b71206888 Initial import
thib
parents:
diff changeset
769 dprintf(")");
223b71206888 Initial import
thib
parents:
diff changeset
770 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
771 }
223b71206888 Initial import
thib
parents:
diff changeset
772
223b71206888 Initial import
thib
parents:
diff changeset
773 if (*d != 0x5c && stack_count == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
774 if (info_ptr) *info_ptr = info;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
775 return value; // 単純なleft-termはここで終了。有効なinfo_ptrを帰す(可能性がある)
0
223b71206888 Initial import
thib
parents:
diff changeset
776 }
223b71206888 Initial import
thib
parents:
diff changeset
777
223b71206888 Initial import
thib
parents:
diff changeset
778 while(*d == 0x5c) {
223b71206888 Initial import
thib
parents:
diff changeset
779 int op_type = *(unsigned char*)(d+1);
223b71206888 Initial import
thib
parents:
diff changeset
780 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
781 if (op_type < 70) dprintf("%s",op_str[op_type]);
223b71206888 Initial import
thib
parents:
diff changeset
782 else dprintf("err.");
223b71206888 Initial import
thib
parents:
diff changeset
783 if (op_type >= 10) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
784 int cur_pri = op_pri(op_type);
223b71206888 Initial import
thib
parents:
diff changeset
785 while(stack_count != 0 && op_pri(op_stack[stack_count-1]) <= cur_pri) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
786 // 優先順位の高い、先行する演算を行う
0
223b71206888 Initial import
thib
parents:
diff changeset
787 value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
223b71206888 Initial import
thib
parents:
diff changeset
788 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
789 }
223b71206888 Initial import
thib
parents:
diff changeset
790 val_stack[stack_count] = value;
223b71206888 Initial import
thib
parents:
diff changeset
791 op_stack[stack_count++] = op_type;
223b71206888 Initial import
thib
parents:
diff changeset
792 while(*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
793 d++;
223b71206888 Initial import
thib
parents:
diff changeset
794 dprintf("(");
223b71206888 Initial import
thib
parents:
diff changeset
795 op_stack[stack_count++] = OP_LB;
223b71206888 Initial import
thib
parents:
diff changeset
796 }
223b71206888 Initial import
thib
parents:
diff changeset
797 if (stack_count >= STACK_DEPTH) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
798 value = GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
799
223b71206888 Initial import
thib
parents:
diff changeset
800 while (*d != 0x5c && stack_count > 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
801 // 未実行の演算を終わらせる
0
223b71206888 Initial import
thib
parents:
diff changeset
802 if (op_stack[stack_count-1] != OP_LB) {
223b71206888 Initial import
thib
parents:
diff changeset
803 value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
223b71206888 Initial import
thib
parents:
diff changeset
804 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
805 } else if (*d == 0x29) { /* op_stack == OP_LB */
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
806 // bracket 終端があれば、閉じておく
0
223b71206888 Initial import
thib
parents:
diff changeset
807 d++;
223b71206888 Initial import
thib
parents:
diff changeset
808 dprintf(")");
223b71206888 Initial import
thib
parents:
diff changeset
809 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
810 } else break; // error
223b71206888 Initial import
thib
parents:
diff changeset
811 }
223b71206888 Initial import
thib
parents:
diff changeset
812 }
223b71206888 Initial import
thib
parents:
diff changeset
813 if (stack_count) SetError(); // unbalanced bracket
223b71206888 Initial import
thib
parents:
diff changeset
814 dprintf("(=%d)",value);
223b71206888 Initial import
thib
parents:
diff changeset
815 if (info_ptr) {
223b71206888 Initial import
thib
parents:
diff changeset
816 info_ptr->type = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
817 info_ptr->value = value;
223b71206888 Initial import
thib
parents:
diff changeset
818 }
223b71206888 Initial import
thib
parents:
diff changeset
819 return value;
223b71206888 Initial import
thib
parents:
diff changeset
820 }
223b71206888 Initial import
thib
parents:
diff changeset
821
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
822 // 条件分岐専用に、条件演算と算術演算の混合を検知できる専用ルーチン(本来はGetExpressionで差し支えない)
0
223b71206888 Initial import
thib
parents:
diff changeset
823 int Cmd::GetExpressionCond(const char*& d) {
223b71206888 Initial import
thib
parents:
diff changeset
824 char op_stack[STACK_DEPTH];
223b71206888 Initial import
thib
parents:
diff changeset
825 int val_stack[STACK_DEPTH];
223b71206888 Initial import
thib
parents:
diff changeset
826 int valattr_stack[STACK_DEPTH];
223b71206888 Initial import
thib
parents:
diff changeset
827 #define ATTR_VAL 0
223b71206888 Initial import
thib
parents:
diff changeset
828 #define ATTR_FLAG 1
223b71206888 Initial import
thib
parents:
diff changeset
829 int stack_count = 0;
223b71206888 Initial import
thib
parents:
diff changeset
830
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
831 // 第一項の読み込み
0
223b71206888 Initial import
thib
parents:
diff changeset
832 while(*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
833 d++;
223b71206888 Initial import
thib
parents:
diff changeset
834 dprintf("(");
223b71206888 Initial import
thib
parents:
diff changeset
835 op_stack[stack_count++] = OP_LB;
223b71206888 Initial import
thib
parents:
diff changeset
836 }
223b71206888 Initial import
thib
parents:
diff changeset
837 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
838 int value = GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
839 while(*d == 0x29 && stack_count > 0 && op_stack[stack_count-1] == OP_LB) {
223b71206888 Initial import
thib
parents:
diff changeset
840 d++;
223b71206888 Initial import
thib
parents:
diff changeset
841 dprintf(")");
223b71206888 Initial import
thib
parents:
diff changeset
842 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
843 }
223b71206888 Initial import
thib
parents:
diff changeset
844 bool valattr = ATTR_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
845
223b71206888 Initial import
thib
parents:
diff changeset
846 while(*d == 0x5c) {
223b71206888 Initial import
thib
parents:
diff changeset
847 int op_type = *(unsigned char*)(d+1);
223b71206888 Initial import
thib
parents:
diff changeset
848 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
849 if (op_type < 70) dprintf("%s",op_str[op_type]);
223b71206888 Initial import
thib
parents:
diff changeset
850 else dprintf("err.");
223b71206888 Initial import
thib
parents:
diff changeset
851 int cur_pri = op_pri_cond(op_type);
223b71206888 Initial import
thib
parents:
diff changeset
852 while(stack_count != 0 && op_pri_cond(op_stack[stack_count-1]) <= cur_pri) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
853 // 優先順位の高い、先行する演算を行う
0
223b71206888 Initial import
thib
parents:
diff changeset
854 if (op_stack[stack_count-1] >= 60) {
223b71206888 Initial import
thib
parents:
diff changeset
855 if (valattr_stack[stack_count-1] != ATTR_FLAG || valattr != ATTR_FLAG) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
856 } else {
223b71206888 Initial import
thib
parents:
diff changeset
857 if (valattr_stack[stack_count-1] != ATTR_VAL || valattr != ATTR_VAL) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
858 }
223b71206888 Initial import
thib
parents:
diff changeset
859 value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
223b71206888 Initial import
thib
parents:
diff changeset
860 if (op_stack[stack_count-1] >= 40) valattr = ATTR_FLAG;
223b71206888 Initial import
thib
parents:
diff changeset
861 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
862 }
223b71206888 Initial import
thib
parents:
diff changeset
863 val_stack[stack_count] = value;
223b71206888 Initial import
thib
parents:
diff changeset
864 valattr_stack[stack_count] = valattr;
223b71206888 Initial import
thib
parents:
diff changeset
865 op_stack[stack_count++] = op_type;
223b71206888 Initial import
thib
parents:
diff changeset
866 while(*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
867 d++;
223b71206888 Initial import
thib
parents:
diff changeset
868 dprintf("(");
223b71206888 Initial import
thib
parents:
diff changeset
869 op_stack[stack_count++] = OP_LB;
223b71206888 Initial import
thib
parents:
diff changeset
870 }
223b71206888 Initial import
thib
parents:
diff changeset
871 if (stack_count >= STACK_DEPTH) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
872 value = GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
873 valattr = ATTR_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
874
223b71206888 Initial import
thib
parents:
diff changeset
875 while (*d != 0x5c && stack_count > 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
876 // 未実行の演算を終わらせる
0
223b71206888 Initial import
thib
parents:
diff changeset
877 if (op_stack[stack_count-1] != OP_LB) {
223b71206888 Initial import
thib
parents:
diff changeset
878 if (op_stack[stack_count-1] >= 60) {
223b71206888 Initial import
thib
parents:
diff changeset
879 if (valattr_stack[stack_count-1] != ATTR_FLAG || valattr != ATTR_FLAG) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
880 } else {
223b71206888 Initial import
thib
parents:
diff changeset
881 if (valattr_stack[stack_count-1] != ATTR_VAL || valattr != ATTR_VAL) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
882 }
223b71206888 Initial import
thib
parents:
diff changeset
883 value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
223b71206888 Initial import
thib
parents:
diff changeset
884 if (op_stack[stack_count-1] >= 40) valattr = ATTR_FLAG;
223b71206888 Initial import
thib
parents:
diff changeset
885 stack_count--;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
886 // bracket 終端があれば、閉じておく
0
223b71206888 Initial import
thib
parents:
diff changeset
887 } else if (*d == 0x29) { /* op_stack == OP_LB */
223b71206888 Initial import
thib
parents:
diff changeset
888 d++;
223b71206888 Initial import
thib
parents:
diff changeset
889 dprintf(")");
223b71206888 Initial import
thib
parents:
diff changeset
890 stack_count--;
223b71206888 Initial import
thib
parents:
diff changeset
891 } else break; // error
223b71206888 Initial import
thib
parents:
diff changeset
892 }
223b71206888 Initial import
thib
parents:
diff changeset
893 }
223b71206888 Initial import
thib
parents:
diff changeset
894 if (stack_count) SetError(); // unbalanced bracket
223b71206888 Initial import
thib
parents:
diff changeset
895 if (value) dprintf("(=true)");
223b71206888 Initial import
thib
parents:
diff changeset
896 else dprintf("(=false)");
223b71206888 Initial import
thib
parents:
diff changeset
897 return value;
223b71206888 Initial import
thib
parents:
diff changeset
898 }
223b71206888 Initial import
thib
parents:
diff changeset
899
223b71206888 Initial import
thib
parents:
diff changeset
900
223b71206888 Initial import
thib
parents:
diff changeset
901 /*
223b71206888 Initial import
thib
parents:
diff changeset
902 str =
223b71206888 Initial import
thib
parents:
diff changeset
903 arg =
223b71206888 Initial import
thib
parents:
diff changeset
904 args = 0x28 <exp> [[0x2c] <exp> [[0x2c] <exp> [...] ]]
223b71206888 Initial import
thib
parents:
diff changeset
905 */
223b71206888 Initial import
thib
parents:
diff changeset
906
223b71206888 Initial import
thib
parents:
diff changeset
907 int Cmd::GetArgs(const char*& d) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
908 if (*d != 0x28) return 0; /* 引数なし */
0
223b71206888 Initial import
thib
parents:
diff changeset
909 d++;
223b71206888 Initial import
thib
parents:
diff changeset
910 dprintf("args:");
223b71206888 Initial import
thib
parents:
diff changeset
911 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
912 int i; for (i=0; i<100 ; i++) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
913 /* number, variable, string の種別なく値を得る */
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
914 if (*d == 0x61) { // よくわからない(智代アフター)
29
d229cce98f50 * no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents: 21
diff changeset
915 dprintf("@%d",d[1]);
0
223b71206888 Initial import
thib
parents:
diff changeset
916 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
917 if (*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
918 dprintf("{");
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
919 GetArgs(d); // (A,B,C)節が含まれることがある
0
223b71206888 Initial import
thib
parents:
diff changeset
920 dprintf("}");
223b71206888 Initial import
thib
parents:
diff changeset
921 } else {
223b71206888 Initial import
thib
parents:
diff changeset
922 dprintf("{}");
223b71206888 Initial import
thib
parents:
diff changeset
923 }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
924 } else if (d[0] == 0x0a || d[0] == 0x40) { // よくわからない (Little Busters!)
0
223b71206888 Initial import
thib
parents:
diff changeset
925 int var;
223b71206888 Initial import
thib
parents:
diff changeset
926 if (system_version == 0) { var = read_little_endian_int(d+1); d += 5;}
223b71206888 Initial import
thib
parents:
diff changeset
927 else { var = read_little_endian_short(d+1); d += 3;}
223b71206888 Initial import
thib
parents:
diff changeset
928 dprintf("line %d; ",var);
223b71206888 Initial import
thib
parents:
diff changeset
929 } else if (*d == 0x24 || (*d == 0x5c && (d[1] == 1 || d[1] == 0)) || *d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
930 GetExpression(d, &var);
223b71206888 Initial import
thib
parents:
diff changeset
931 args.push_back(var);
223b71206888 Initial import
thib
parents:
diff changeset
932 } else if (StrType(d)) {
223b71206888 Initial import
thib
parents:
diff changeset
933 var.type = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
934 var.value = GetString(d);
223b71206888 Initial import
thib
parents:
diff changeset
935 args.push_back(var);
223b71206888 Initial import
thib
parents:
diff changeset
936 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
937 if (*d == 0x29) break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
938 if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
0
223b71206888 Initial import
thib
parents:
diff changeset
939 dprintf(",");
223b71206888 Initial import
thib
parents:
diff changeset
940 }
223b71206888 Initial import
thib
parents:
diff changeset
941 if (*d == 0x29) d++;
223b71206888 Initial import
thib
parents:
diff changeset
942 else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
943 return i;
223b71206888 Initial import
thib
parents:
diff changeset
944 }
223b71206888 Initial import
thib
parents:
diff changeset
945
223b71206888 Initial import
thib
parents:
diff changeset
946 int Cmd::GetArgsSpecial(int normal_args,const char*& d) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
947 if (*d != 0x28) return 0; /* 引数なし */
0
223b71206888 Initial import
thib
parents:
diff changeset
948 d++;
223b71206888 Initial import
thib
parents:
diff changeset
949 dprintf("args:");
223b71206888 Initial import
thib
parents:
diff changeset
950 int i; for (i=0; i<normal_args; i++) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
951 /* number, variable, string の種別なく値を得る */
0
223b71206888 Initial import
thib
parents:
diff changeset
952 if (*d == 0x24 || (*d == 0x5c && (d[1] == 1 || d[1] == 0)) || *d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
953 GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
954 } else if (StrType(d)) {
223b71206888 Initial import
thib
parents:
diff changeset
955 GetString(d);
223b71206888 Initial import
thib
parents:
diff changeset
956 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
957 if (*d == 0x29) break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
958 if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
0
223b71206888 Initial import
thib
parents:
diff changeset
959 dprintf(",");
223b71206888 Initial import
thib
parents:
diff changeset
960 }
223b71206888 Initial import
thib
parents:
diff changeset
961 for (i=0; i<argc ; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
962 if (*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
963 /*
223b71206888 Initial import
thib
parents:
diff changeset
964 ** cmd 01-22:0c1c, 01-22:0835
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
965 ** Princess Bride のカードが落ちるアニメの場面
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
966 ** なお、_PBCARDANM* の画像はこのコマンドでのみ使われているので、特殊処理として無視することも可能
0
223b71206888 Initial import
thib
parents:
diff changeset
967 **
223b71206888 Initial import
thib
parents:
diff changeset
968 ** cmd 01-04:0276, 026c, 0270
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
969 ** 複数の enum が args の数だけ続く処理。特殊処理として分離する
0
223b71206888 Initial import
thib
parents:
diff changeset
970 */
223b71206888 Initial import
thib
parents:
diff changeset
971 dprintf("enum.<");
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
972 /* (...) は列挙型 or 構造体の可能性がある */
0
223b71206888 Initial import
thib
parents:
diff changeset
973 const char* d_orig = d;
223b71206888 Initial import
thib
parents:
diff changeset
974 int pt = args.size(); args.push_back(VarInfo(0));
223b71206888 Initial import
thib
parents:
diff changeset
975 int count = GetArgs(d);
223b71206888 Initial import
thib
parents:
diff changeset
976 args[pt] = VarInfo(count);
223b71206888 Initial import
thib
parents:
diff changeset
977 dprintf(">");
223b71206888 Initial import
thib
parents:
diff changeset
978 } else if (*d == 0x61 && (d[1] >= 0x00 && d[1] <= 0x04) && d[2] == 0x28 ) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
979 /* 使われるコマンドは 01-21:004b, 01-28:0064 のいずれか(R,C,PB,LO)
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
980 ** それらのコマンドは
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
981 ** arg1: 画像ファイル名
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
982 ** arg2 : Sel 番号
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
983 ** らしく、arg3 以降が 0x61 <00-04> (a,b,c,...) となる(ダンプ上は enum と表記される)
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
984 ** () 内の引数はさまざまで、a のみ(画像ファイル名)、
0
223b71206888 Initial import
thib
parents:
diff changeset
985 ** a,b b=SEL?
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
986 ** a,b,c (b,c)=座標?
0
223b71206888 Initial import
thib
parents:
diff changeset
987 ** a,(b,c,d,e,f,g) b-g = src / dest?
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
988 ** らしい
0
223b71206888 Initial import
thib
parents:
diff changeset
989 */
223b71206888 Initial import
thib
parents:
diff changeset
990 dprintf("kasane. #%d <",d[1]);
223b71206888 Initial import
thib
parents:
diff changeset
991 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
992 int pt = args.size(); args.push_back(VarInfo(0));
223b71206888 Initial import
thib
parents:
diff changeset
993 int count = GetArgs(d);
223b71206888 Initial import
thib
parents:
diff changeset
994 args[pt] = VarInfo(count);
223b71206888 Initial import
thib
parents:
diff changeset
995 dprintf(">");
223b71206888 Initial import
thib
parents:
diff changeset
996 } else if (*d == 0x24 || (*d == 0x5c && (d[1] == 1 || d[1] == 0))) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
997 /* cmd 01-15:0028 ; 始めに 0x24 節があり、続いて 0x28 節になる */
0
223b71206888 Initial import
thib
parents:
diff changeset
998 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
999 GetExpression(d, &var);
223b71206888 Initial import
thib
parents:
diff changeset
1000 args.push_back(var);
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1001 i--; // この引数はargc の数には入らない
0
223b71206888 Initial import
thib
parents:
diff changeset
1002 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1003 if (d[0] == 0x0a || d[0] == 0x40) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1004 /* cmd 01-15:0028 ; 0x28 節の後に毎回 0x0a 節が来る */
0
223b71206888 Initial import
thib
parents:
diff changeset
1005 int var;
223b71206888 Initial import
thib
parents:
diff changeset
1006 if (system_version == 0) { var = read_little_endian_int(d+1); d += 5;}
223b71206888 Initial import
thib
parents:
diff changeset
1007 else { var = read_little_endian_short(d+1); d += 3;}
223b71206888 Initial import
thib
parents:
diff changeset
1008 dprintf("line %d; ",var);
223b71206888 Initial import
thib
parents:
diff changeset
1009 }
223b71206888 Initial import
thib
parents:
diff changeset
1010 if (*d == 0x29) break;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1011 if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
0
223b71206888 Initial import
thib
parents:
diff changeset
1012 dprintf(",");
223b71206888 Initial import
thib
parents:
diff changeset
1013 }
223b71206888 Initial import
thib
parents:
diff changeset
1014 if (*d == 0x29) d++;
223b71206888 Initial import
thib
parents:
diff changeset
1015 else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1016 return 0;
223b71206888 Initial import
thib
parents:
diff changeset
1017 }
223b71206888 Initial import
thib
parents:
diff changeset
1018
223b71206888 Initial import
thib
parents:
diff changeset
1019 /* switch
223b71206888 Initial import
thib
parents:
diff changeset
1020 <exp>
223b71206888 Initial import
thib
parents:
diff changeset
1021 0x7b
223b71206888 Initial import
thib
parents:
diff changeset
1022 <exp> <int>
223b71206888 Initial import
thib
parents:
diff changeset
1023 ...
223b71206888 Initial import
thib
parents:
diff changeset
1024 0x7d
223b71206888 Initial import
thib
parents:
diff changeset
1025 */
223b71206888 Initial import
thib
parents:
diff changeset
1026
223b71206888 Initial import
thib
parents:
diff changeset
1027 int Cmd::GetSwitch(const char*& d) {
223b71206888 Initial import
thib
parents:
diff changeset
1028 if (*d != 0x28) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1029 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1030 dprintf("switch. ");
223b71206888 Initial import
thib
parents:
diff changeset
1031 int var = GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
1032 if (*d != 0x29) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1033 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1034 dprintf("->\n");
223b71206888 Initial import
thib
parents:
diff changeset
1035 if (*d == 0x7b) {
223b71206888 Initial import
thib
parents:
diff changeset
1036 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1037 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1038
223b71206888 Initial import
thib
parents:
diff changeset
1039 int default_jmp = -1; int jmpto = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1040 int i; for (i=0; i<argc; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1041 dprintf("\t");
223b71206888 Initial import
thib
parents:
diff changeset
1042 if (*d++ != 0x28) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1043 if (*d != 0x29) {
223b71206888 Initial import
thib
parents:
diff changeset
1044 int item = GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
1045 if (*d++ != 0x29) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1046 int jmp = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1047 if (var == item) {
223b71206888 Initial import
thib
parents:
diff changeset
1048 dprintf("(selected)");
223b71206888 Initial import
thib
parents:
diff changeset
1049 jmpto = jmp;
223b71206888 Initial import
thib
parents:
diff changeset
1050 }
223b71206888 Initial import
thib
parents:
diff changeset
1051 dprintf(" -> %d\n", jmp);
223b71206888 Initial import
thib
parents:
diff changeset
1052 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1053 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1054 default_jmp = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1055 }
223b71206888 Initial import
thib
parents:
diff changeset
1056 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1057 }
223b71206888 Initial import
thib
parents:
diff changeset
1058 if (default_jmp != -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1059 dprintf("default -> %d\n",default_jmp);
223b71206888 Initial import
thib
parents:
diff changeset
1060 if (jmpto == -1) jmpto = default_jmp;
223b71206888 Initial import
thib
parents:
diff changeset
1061 }
223b71206888 Initial import
thib
parents:
diff changeset
1062 if (*d == 0x7d) {
223b71206888 Initial import
thib
parents:
diff changeset
1063 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1064 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1065 return jmpto;
223b71206888 Initial import
thib
parents:
diff changeset
1066 }
223b71206888 Initial import
thib
parents:
diff changeset
1067 /* simple switch
223b71206888 Initial import
thib
parents:
diff changeset
1068 <exp>
223b71206888 Initial import
thib
parents:
diff changeset
1069 0x7b
223b71206888 Initial import
thib
parents:
diff changeset
1070 <int>
223b71206888 Initial import
thib
parents:
diff changeset
1071 ...
223b71206888 Initial import
thib
parents:
diff changeset
1072 0x7d
223b71206888 Initial import
thib
parents:
diff changeset
1073 */
223b71206888 Initial import
thib
parents:
diff changeset
1074 int Cmd::GetSimpleSwitch(const char*& d) {
223b71206888 Initial import
thib
parents:
diff changeset
1075 if (*d != 0x28) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1076 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1077 dprintf("simple switch. ");
223b71206888 Initial import
thib
parents:
diff changeset
1078 int var = GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
1079 if (*d != 0x29) {SetError(); return -1;}
223b71206888 Initial import
thib
parents:
diff changeset
1080 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1081 dprintf(" ->\n");
223b71206888 Initial import
thib
parents:
diff changeset
1082 int jumpto = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1083 if (*d == 0x7b) {
223b71206888 Initial import
thib
parents:
diff changeset
1084 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1085 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1086 int i; for (i=0; i<argc; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1087 int j = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1088 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1089 dprintf("\t%d -> %d\n", i+1, j);
223b71206888 Initial import
thib
parents:
diff changeset
1090 if (var == i) jumpto = j;
223b71206888 Initial import
thib
parents:
diff changeset
1091 }
223b71206888 Initial import
thib
parents:
diff changeset
1092 if (*d == 0x7d) {
223b71206888 Initial import
thib
parents:
diff changeset
1093 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1094 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1095 return jumpto;
223b71206888 Initial import
thib
parents:
diff changeset
1096 }
223b71206888 Initial import
thib
parents:
diff changeset
1097
223b71206888 Initial import
thib
parents:
diff changeset
1098 /*
223b71206888 Initial import
thib
parents:
diff changeset
1099 selection
223b71206888 Initial import
thib
parents:
diff changeset
1100 ? <exp>
223b71206888 Initial import
thib
parents:
diff changeset
1101 0x7b
223b71206888 Initial import
thib
parents:
diff changeset
1102 <0x0a|0x40> <ushort | uint>
223b71206888 Initial import
thib
parents:
diff changeset
1103 */
223b71206888 Initial import
thib
parents:
diff changeset
1104 void Cmd::GetSelection(const char*& d) {
223b71206888 Initial import
thib
parents:
diff changeset
1105 dprintf("selection. ");
223b71206888 Initial import
thib
parents:
diff changeset
1106 if (*d == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
1107 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1108 GetExpression(d);
223b71206888 Initial import
thib
parents:
diff changeset
1109 if (*d != 0x29) { SetError(); return;}
223b71206888 Initial import
thib
parents:
diff changeset
1110 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1111 }
223b71206888 Initial import
thib
parents:
diff changeset
1112 if (*d == 0x7b) {
223b71206888 Initial import
thib
parents:
diff changeset
1113 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1114 dprintf("{\n\t");
223b71206888 Initial import
thib
parents:
diff changeset
1115 } else SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1116 int arg_count = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1117 string text = "";
223b71206888 Initial import
thib
parents:
diff changeset
1118 int cond_result = false;
223b71206888 Initial import
thib
parents:
diff changeset
1119 int sel_no = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1120 while(*d != 0x7d) {
223b71206888 Initial import
thib
parents:
diff changeset
1121 if (d[0] == 0x0a || d[0] == 0x40) {
223b71206888 Initial import
thib
parents:
diff changeset
1122 int var;
223b71206888 Initial import
thib
parents:
diff changeset
1123 if (system_version == 0) { var = read_little_endian_int(d+1); d += 5;}
223b71206888 Initial import
thib
parents:
diff changeset
1124 else { var = read_little_endian_short(d+1); d += 3;}
223b71206888 Initial import
thib
parents:
diff changeset
1125 dprintf("Line %d; ",var);
223b71206888 Initial import
thib
parents:
diff changeset
1126 if (text.length() != 0) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1127 if (cond_result) ; // 条件節が true なら表示しない
0
223b71206888 Initial import
thib
parents:
diff changeset
1128 else {
223b71206888 Initial import
thib
parents:
diff changeset
1129 const char* str = text.c_str();
223b71206888 Initial import
thib
parents:
diff changeset
1130 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
1131 var.type = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
1132 var.value = CopyString(str);
223b71206888 Initial import
thib
parents:
diff changeset
1133 args.push_back(var);
223b71206888 Initial import
thib
parents:
diff changeset
1134 var.type = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
1135 var.value = sel_no;
223b71206888 Initial import
thib
parents:
diff changeset
1136 args.push_back(var);
223b71206888 Initial import
thib
parents:
diff changeset
1137 }
223b71206888 Initial import
thib
parents:
diff changeset
1138 sel_no++;
223b71206888 Initial import
thib
parents:
diff changeset
1139 }
223b71206888 Initial import
thib
parents:
diff changeset
1140 text = "";
223b71206888 Initial import
thib
parents:
diff changeset
1141 cond_result = false;
223b71206888 Initial import
thib
parents:
diff changeset
1142 } else if (d[0] == 0x2c) {
223b71206888 Initial import
thib
parents:
diff changeset
1143 dprintf(":comma:");
223b71206888 Initial import
thib
parents:
diff changeset
1144 } else if (d[0] == 0x28) {
223b71206888 Initial import
thib
parents:
diff changeset
1145 dprintf(":cond:");
223b71206888 Initial import
thib
parents:
diff changeset
1146 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1147 while(d[0] != 0x29) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1148 int result = GetExpressionCond(d); // PRINT- 節でないばあい、条件表示。次は文字節、またはPRINT節のはず
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1149 if (*d == 0x32) { // 0x32 なら、現在の条件節を表示しない
0
223b71206888 Initial import
thib
parents:
diff changeset
1150 d++; dprintf("##");
223b71206888 Initial import
thib
parents:
diff changeset
1151 cond_result = result;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1152 } else if (*d == 0x31) { // 0x31 なら、現在の条件節を表示する
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1153 // Little Busters! : この条件で正しいかは未検証
0
223b71206888 Initial import
thib
parents:
diff changeset
1154 d++; dprintf("***");
223b71206888 Initial import
thib
parents:
diff changeset
1155 cond_result = !result;
223b71206888 Initial import
thib
parents:
diff changeset
1156 }
223b71206888 Initial import
thib
parents:
diff changeset
1157 dprintf(":");
223b71206888 Initial import
thib
parents:
diff changeset
1158 }
223b71206888 Initial import
thib
parents:
diff changeset
1159 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1160 } else if (StrType(d)) {
223b71206888 Initial import
thib
parents:
diff changeset
1161 int strpt = GetString(d);
223b71206888 Initial import
thib
parents:
diff changeset
1162 text += strheap + strpt;
223b71206888 Initial import
thib
parents:
diff changeset
1163 arg_count++;
223b71206888 Initial import
thib
parents:
diff changeset
1164 dprintf("\n\t");
223b71206888 Initial import
thib
parents:
diff changeset
1165 } else if (*d == 0x23 && strncmp(d,"###PRINT",8) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1166 d += 8;
223b71206888 Initial import
thib
parents:
diff changeset
1167 if (d[0] != 0x28) SetError();
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1168 else { // 文字変数の内容の表示
0
223b71206888 Initial import
thib
parents:
diff changeset
1169 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1170 dprintf("Print.");
223b71206888 Initial import
thib
parents:
diff changeset
1171 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
1172 GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
1173 if (d[0] != 0x29 || info.type == -1) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1174 d++;
21
d1bb7b365816 Fixed dynamic strings in selections (Fuko Pranks for instance)
thib
parents: 13
diff changeset
1175 dprintf(";");/*
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1176 // 数値を全角文字に変換して登録
0
223b71206888 Initial import
thib
parents:
diff changeset
1177 char str[10], str2[20]; // itoa
223b71206888 Initial import
thib
parents:
diff changeset
1178 sprintf(str, "%d", info.value);
223b71206888 Initial import
thib
parents:
diff changeset
1179 int i; for (i=0; str[i] != 0; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1180 str2[i*2] = 0xa3;
223b71206888 Initial import
thib
parents:
diff changeset
1181 str2[i*2+1] = 0xb0 + str[i]-'0';
223b71206888 Initial import
thib
parents:
diff changeset
1182 }
21
d1bb7b365816 Fixed dynamic strings in selections (Fuko Pranks for instance)
thib
parents: 13
diff changeset
1183 str2[i*2] = 0;*/
d1bb7b365816 Fixed dynamic strings in selections (Fuko Pranks for instance)
thib
parents: 13
diff changeset
1184 text += strheap + info.value;
0
223b71206888 Initial import
thib
parents:
diff changeset
1185 }
223b71206888 Initial import
thib
parents:
diff changeset
1186 } else { SetError(); break;}
223b71206888 Initial import
thib
parents:
diff changeset
1187 }
223b71206888 Initial import
thib
parents:
diff changeset
1188 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1189 /* @@@ */
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1190 /* 一致しない場合があるのでコメントアウト */
0
223b71206888 Initial import
thib
parents:
diff changeset
1191 // if (arg_count != argc) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1192 dprintf("\n}\n");
223b71206888 Initial import
thib
parents:
diff changeset
1193 }
223b71206888 Initial import
thib
parents:
diff changeset
1194
223b71206888 Initial import
thib
parents:
diff changeset
1195 void Cmd::GetCmd(Flags& flags_orig, const char*& d ) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1196 if (d == NULL) { SetError(); return;}
0
223b71206888 Initial import
thib
parents:
diff changeset
1197 if (cmd_type != CMD_NOP) return;
223b71206888 Initial import
thib
parents:
diff changeset
1198
223b71206888 Initial import
thib
parents:
diff changeset
1199 cmdstr[0] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1200 rawdata = d;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1201 if (*d == 0x23) { /* コマンド */
0
223b71206888 Initial import
thib
parents:
diff changeset
1202 cmd_type = CMD_OTHER;
223b71206888 Initial import
thib
parents:
diff changeset
1203 cmd1 = *(unsigned const char*)(d+1);
223b71206888 Initial import
thib
parents:
diff changeset
1204 cmd2 = *(unsigned const char*)(d+2);
223b71206888 Initial import
thib
parents:
diff changeset
1205 cmd3 = read_little_endian_short(d+3);
223b71206888 Initial import
thib
parents:
diff changeset
1206 argc = read_little_endian_short(d+5);
223b71206888 Initial import
thib
parents:
diff changeset
1207 cmd4 = *(unsigned const char*)(d+7);
223b71206888 Initial import
thib
parents:
diff changeset
1208 d += 8;
223b71206888 Initial import
thib
parents:
diff changeset
1209 /* verbose */
223b71206888 Initial import
thib
parents:
diff changeset
1210 // dprintf(" 0x23 - cmd %02x-%02x:%04x:%02x[%2d] \n",cmd1,cmd2,cmd3,cmd4,argc);
29
d229cce98f50 * no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents: 21
diff changeset
1211 sprintf(cmdstr, "%02x-%02x:%04x:%02x : %s",cmd1,cmd2,cmd3,cmd4, CmdDescr(cmd1,cmd2,cmd3,cmd4));
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1212 /* 引数を得る */
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1213 /* 特殊引数のもの */
0
223b71206888 Initial import
thib
parents:
diff changeset
1214 int is_special = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1215 if (cmd1 == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1216 if (cmd2 == 1) {
223b71206888 Initial import
thib
parents:
diff changeset
1217 int jump_arg = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1218 if (cmd3 == 0 || cmd3 == 5) {
223b71206888 Initial import
thib
parents:
diff changeset
1219 /* gosub / goto */
223b71206888 Initial import
thib
parents:
diff changeset
1220 jump_arg =read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1221 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1222 if (cmd3 == 0)
223b71206888 Initial import
thib
parents:
diff changeset
1223 dprintf("\tjmp -> %d\n", jump_arg);
223b71206888 Initial import
thib
parents:
diff changeset
1224 else /* cmd3 == 5 */
223b71206888 Initial import
thib
parents:
diff changeset
1225 dprintf("\tcall -> %d\n", jump_arg);
223b71206888 Initial import
thib
parents:
diff changeset
1226 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1227 } else if (cmd3 == 1 || cmd3 == 2) {
223b71206888 Initial import
thib
parents:
diff changeset
1228 /* conditional jump (if / unless) */
223b71206888 Initial import
thib
parents:
diff changeset
1229 if (*d++ != 0x28) { SetError(); return;}
223b71206888 Initial import
thib
parents:
diff changeset
1230 dprintf("\t");
223b71206888 Initial import
thib
parents:
diff changeset
1231 int cond = GetExpressionCond(d);
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1232 if (cmd3 == 1) cond = !cond; // 逆になる
0
223b71206888 Initial import
thib
parents:
diff changeset
1233 if (*d++ != 0x29) { SetError(); return; }
223b71206888 Initial import
thib
parents:
diff changeset
1234 int jumpto = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1235 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1236 dprintf("-> %d\n", jumpto);
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1237 if (! cond) jump_arg = jumpto; /* condition が満たされない場合、ジャンプ */
0
223b71206888 Initial import
thib
parents:
diff changeset
1238 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1239 } else if (cmd3 == 4) {
223b71206888 Initial import
thib
parents:
diff changeset
1240 /* switch to */
223b71206888 Initial import
thib
parents:
diff changeset
1241 jump_arg = GetSwitch(d);
223b71206888 Initial import
thib
parents:
diff changeset
1242 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1243 } else if (cmd3 == 8 || cmd3 == 3) {
223b71206888 Initial import
thib
parents:
diff changeset
1244 /* switch to */
223b71206888 Initial import
thib
parents:
diff changeset
1245 jump_arg = GetSimpleSwitch(d);
223b71206888 Initial import
thib
parents:
diff changeset
1246 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1247 } else if (cmd3 == 16) { // call with parameters
223b71206888 Initial import
thib
parents:
diff changeset
1248 GetArgs(d);
223b71206888 Initial import
thib
parents:
diff changeset
1249 jump_arg = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1250 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1251 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1252 } else goto retry;
223b71206888 Initial import
thib
parents:
diff changeset
1253 if (jump_arg == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1254 cmd_type = CMD_NOP;
223b71206888 Initial import
thib
parents:
diff changeset
1255 }
223b71206888 Initial import
thib
parents:
diff changeset
1256 else {
223b71206888 Initial import
thib
parents:
diff changeset
1257 cmd_type = CMD_JMP;
223b71206888 Initial import
thib
parents:
diff changeset
1258 args.push_back(VarInfo(jump_arg));
223b71206888 Initial import
thib
parents:
diff changeset
1259 }
223b71206888 Initial import
thib
parents:
diff changeset
1260 } else if (cmd2 == 2 && (cmd3 == 0 || cmd3 == 1 || cmd3 == 2 || cmd3 == 3 || cmd3 == 0x0d) ) {
223b71206888 Initial import
thib
parents:
diff changeset
1261 /* selection */
223b71206888 Initial import
thib
parents:
diff changeset
1262 GetSelection(d);
223b71206888 Initial import
thib
parents:
diff changeset
1263 is_special = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1264 }
223b71206888 Initial import
thib
parents:
diff changeset
1265 }
223b71206888 Initial import
thib
parents:
diff changeset
1266 retry:
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1267 /* 一般引数のもの */
0
223b71206888 Initial import
thib
parents:
diff changeset
1268 if (!is_special) {
29
d229cce98f50 * no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents: 21
diff changeset
1269 dprintf(" 0x23 - cmd %02x-%02x:%04x:%02x[%2d] : %s\n",cmd1,cmd2,cmd3,cmd4,argc,CmdDescr(cmd1,cmd2,cmd3,cmd4));
0
223b71206888 Initial import
thib
parents:
diff changeset
1270 dprintf("\t");
223b71206888 Initial import
thib
parents:
diff changeset
1271 if (cmd1 == 1 && cmd2 == 0x22 && (cmd3 == 0xc1c || cmd3 == 0x835)) GetArgsSpecial(3, d);
223b71206888 Initial import
thib
parents:
diff changeset
1272 else if (cmd1 == 1 && cmd2 == 0x0b && cmd3 == 0x65) GetArgsSpecial(0, d);
223b71206888 Initial import
thib
parents:
diff changeset
1273 else if (cmd1 == 1 && cmd2 == 0x15 && cmd3 == 0x28) GetArgsSpecial(0, d);
223b71206888 Initial import
thib
parents:
diff changeset
1274 else if (cmd1 == 1 && cmd2 == 4 && (cmd3 == 0x26c || cmd3 == 0x26d || cmd3 == 0x270 || cmd3 == 0x276)) GetArgsSpecial(0, d);
223b71206888 Initial import
thib
parents:
diff changeset
1275 else if (cmd1 == 1 && cmd2 == 4 && cmd3 == 0x586) GetArgsSpecial(1, d);
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 29
diff changeset
1276 else if (cmd1 == 1 && ((cmd2 == 0x21 && cmd3 == 0x4b) || (cmd2 == 0x28 && cmd3 == 0x64))) GetArgsSpecial(2,d);
0
223b71206888 Initial import
thib
parents:
diff changeset
1277 else GetArgs(d);
223b71206888 Initial import
thib
parents:
diff changeset
1278 dprintf("\n");
223b71206888 Initial import
thib
parents:
diff changeset
1279
223b71206888 Initial import
thib
parents:
diff changeset
1280 }
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1281 } else if (*d == 0x24) { /* 代入演算 */
0
223b71206888 Initial import
thib
parents:
diff changeset
1282 if (d[1] == 0x12 || d[2] != 0x5b) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1283 dprintf("expr: ");
223b71206888 Initial import
thib
parents:
diff changeset
1284 sprintf(cmdstr, "expr");
223b71206888 Initial import
thib
parents:
diff changeset
1285
223b71206888 Initial import
thib
parents:
diff changeset
1286 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
1287 int value = GetLeftToken(d, info);
223b71206888 Initial import
thib
parents:
diff changeset
1288 if (d[0] != 0x5c) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1289 int type = d[1];
223b71206888 Initial import
thib
parents:
diff changeset
1290 if (type < 20 || type > 30) SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1291 else dprintf("%s",op_str[type]);
223b71206888 Initial import
thib
parents:
diff changeset
1292 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
1293 int value2 = GetExpression(d);
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1294 // 代入情報を埋め込む
0
223b71206888 Initial import
thib
parents:
diff changeset
1295 if (type != 30) value2 = eval(value, type-20, value2);
223b71206888 Initial import
thib
parents:
diff changeset
1296 cmd_type = CMD_FLAGS;
223b71206888 Initial import
thib
parents:
diff changeset
1297 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1298 args.push_back(value2);
223b71206888 Initial import
thib
parents:
diff changeset
1299 dprintf("\n");
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1300 } else if (StrType(d)) { /* 文字出力 */
0
223b71206888 Initial import
thib
parents:
diff changeset
1301 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
1302 info.type = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
1303 info.value = GetString(d);
223b71206888 Initial import
thib
parents:
diff changeset
1304 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1305 cmd_type = CMD_TEXT;
223b71206888 Initial import
thib
parents:
diff changeset
1306 dprintf("\n");
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1307 } else if (*d == 0x0a || *d == 0x40 || *d == 0x21) { /* デバッグ用データと既読フラグ */
0
223b71206888 Initial import
thib
parents:
diff changeset
1308 cmd_type = CMD_NOP;
223b71206888 Initial import
thib
parents:
diff changeset
1309 if (*d == 0x0a) {
223b71206888 Initial import
thib
parents:
diff changeset
1310 dprintf("line ");
223b71206888 Initial import
thib
parents:
diff changeset
1311 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1312 int l;
223b71206888 Initial import
thib
parents:
diff changeset
1313 if (system_version == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1314 l = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1315 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1316 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1317 l = read_little_endian_short(d);
223b71206888 Initial import
thib
parents:
diff changeset
1318 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
1319 }
223b71206888 Initial import
thib
parents:
diff changeset
1320 dprintf("%d\n", l);
223b71206888 Initial import
thib
parents:
diff changeset
1321 } else { /* 0x40, 0x21 */
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1322 // 既読マーカーらしい。エントリーポイントとセーブポイントも使われる。
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1323 // RealLive 1.2.5から、0x40はセーブポイント、0x21はエントリーポイント。
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1324 // 1.2.5以前、どちらも0x40が使われる。
0
223b71206888 Initial import
thib
parents:
diff changeset
1325 int kidoku_index;
223b71206888 Initial import
thib
parents:
diff changeset
1326 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1327 if (system_version == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1328 kidoku_index = read_little_endian_int(d);
223b71206888 Initial import
thib
parents:
diff changeset
1329 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1330 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1331 kidoku_index = read_little_endian_short(d);
223b71206888 Initial import
thib
parents:
diff changeset
1332 d += 2;
223b71206888 Initial import
thib
parents:
diff changeset
1333 }
223b71206888 Initial import
thib
parents:
diff changeset
1334 dprintf("kidoku marker %d\n", kidoku_index);
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1335 // text_readflagは、このkidoku_indexを使ったら良いかな。
0
223b71206888 Initial import
thib
parents:
diff changeset
1336 }
223b71206888 Initial import
thib
parents:
diff changeset
1337 } else if (*d == 0x2c) { /* ??? */
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1338 dprintf("commd;0x2c\n"); // conditional jump の行き先によくあるらしい(常に、かはわからない)
0
223b71206888 Initial import
thib
parents:
diff changeset
1339 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1340 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1341 SetError();
223b71206888 Initial import
thib
parents:
diff changeset
1342 }
223b71206888 Initial import
thib
parents:
diff changeset
1343 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1344
0
223b71206888 Initial import
thib
parents:
diff changeset
1345 void Cmd::clear(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1346 cmd_type = CMD_NOP;
223b71206888 Initial import
thib
parents:
diff changeset
1347 ResetString();
223b71206888 Initial import
thib
parents:
diff changeset
1348 args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1349 errorflag = false;
223b71206888 Initial import
thib
parents:
diff changeset
1350 pos = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1351 }
223b71206888 Initial import
thib
parents:
diff changeset
1352
223b71206888 Initial import
thib
parents:
diff changeset
1353 char Cmd::strtype[256] = {
223b71206888 Initial import
thib
parents:
diff changeset
1354 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +00 */
223b71206888 Initial import
thib
parents:
diff changeset
1355 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +10 */ // 0123456789ABCDEF
223b71206888 Initial import
thib
parents:
diff changeset
1356 1,0,3,0, 0,0,0,1, 0,0,0,0, 0,1,1,0, /* +20 */ // !"#$%&'()*+,-./
223b71206888 Initial import
thib
parents:
diff changeset
1357 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,1, /* +30 */ // 0123456789:;<=>?
223b71206888 Initial import
thib
parents:
diff changeset
1358 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, /* +40 */ // @ABCDEFGHIJKLMNO
223b71206888 Initial import
thib
parents:
diff changeset
1359 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,1, /* +50 */ // PQRSTUVWXYZ[\]^_
223b71206888 Initial import
thib
parents:
diff changeset
1360 0,0,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, /* +60 */ // `abcdefghijklmno
223b71206888 Initial import
thib
parents:
diff changeset
1361 1,1,1,1, 1,1,1,1, 1,1,1,1, 0,0,0,0, /* +70 */ // pqrstuvwxyz{|}~
223b71206888 Initial import
thib
parents:
diff changeset
1362 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, /* +80 */
223b71206888 Initial import
thib
parents:
diff changeset
1363 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, /* +90 */
223b71206888 Initial import
thib
parents:
diff changeset
1364 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +A0 */
223b71206888 Initial import
thib
parents:
diff changeset
1365 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +B0 */
223b71206888 Initial import
thib
parents:
diff changeset
1366 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +C0 */
223b71206888 Initial import
thib
parents:
diff changeset
1367 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* +D0 */
223b71206888 Initial import
thib
parents:
diff changeset
1368 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, /* +E0 */
223b71206888 Initial import
thib
parents:
diff changeset
1369 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,0,0 /* +F0 */
223b71206888 Initial import
thib
parents:
diff changeset
1370 };
223b71206888 Initial import
thib
parents:
diff changeset
1371
223b71206888 Initial import
thib
parents:
diff changeset
1372 int Cmd::GetString(const char*& d) {
223b71206888 Initial import
thib
parents:
diff changeset
1373 int retnum = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1374 bool quote_flag = false;
223b71206888 Initial import
thib
parents:
diff changeset
1375 int stype;
223b71206888 Initial import
thib
parents:
diff changeset
1376 retnum = strend;
223b71206888 Initial import
thib
parents:
diff changeset
1377 while(1) {
223b71206888 Initial import
thib
parents:
diff changeset
1378 if (*d == '\\') {
223b71206888 Initial import
thib
parents:
diff changeset
1379 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1380 strheap[strend++] = *d++;
223b71206888 Initial import
thib
parents:
diff changeset
1381 } else if (*d == '"') {
223b71206888 Initial import
thib
parents:
diff changeset
1382 if (quote_flag) quote_flag = false;
223b71206888 Initial import
thib
parents:
diff changeset
1383 else quote_flag = true;
223b71206888 Initial import
thib
parents:
diff changeset
1384 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1385 } else if (quote_flag) {
223b71206888 Initial import
thib
parents:
diff changeset
1386 strheap[strend++] = *d++;
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 29
diff changeset
1387 } else if ((stype = StrType(d))) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1388 strheap[strend++] = *d++;
223b71206888 Initial import
thib
parents:
diff changeset
1389 if (stype == 2) strheap[strend++] = *d++;
223b71206888 Initial import
thib
parents:
diff changeset
1390 } else break;
223b71206888 Initial import
thib
parents:
diff changeset
1391 }
223b71206888 Initial import
thib
parents:
diff changeset
1392 strheap[strend++] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1393 dprintf("\"%s\"", strheap + retnum);
223b71206888 Initial import
thib
parents:
diff changeset
1394 if (strend >= STRHEAP_SIZE) {
223b71206888 Initial import
thib
parents:
diff changeset
1395 dprintf("Error: string heap overflow\n");
223b71206888 Initial import
thib
parents:
diff changeset
1396 }
223b71206888 Initial import
thib
parents:
diff changeset
1397 return retnum;
223b71206888 Initial import
thib
parents:
diff changeset
1398 }
223b71206888 Initial import
thib
parents:
diff changeset
1399
223b71206888 Initial import
thib
parents:
diff changeset
1400 int Cmd::CopyString(const char* d) {
223b71206888 Initial import
thib
parents:
diff changeset
1401 int retnum = strend;
223b71206888 Initial import
thib
parents:
diff changeset
1402 int len = strlen(d);
223b71206888 Initial import
thib
parents:
diff changeset
1403 memcpy(strheap+strend, d, len+1);
223b71206888 Initial import
thib
parents:
diff changeset
1404 strend += len+1;
223b71206888 Initial import
thib
parents:
diff changeset
1405 d += len+1;
223b71206888 Initial import
thib
parents:
diff changeset
1406 return retnum;
223b71206888 Initial import
thib
parents:
diff changeset
1407 }
223b71206888 Initial import
thib
parents:
diff changeset
1408
223b71206888 Initial import
thib
parents:
diff changeset
1409 int Cmd::StrVar(int type, int var_num) {
223b71206888 Initial import
thib
parents:
diff changeset
1410 int retnum = strend;
223b71206888 Initial import
thib
parents:
diff changeset
1411 flags.Str(type, var_num, strheap+strend, STRHEAP_SIZE-strend);
223b71206888 Initial import
thib
parents:
diff changeset
1412 strend += strlen(strheap+strend)+1;
223b71206888 Initial import
thib
parents:
diff changeset
1413 return retnum;
223b71206888 Initial import
thib
parents:
diff changeset
1414 }
223b71206888 Initial import
thib
parents:
diff changeset
1415
223b71206888 Initial import
thib
parents:
diff changeset
1416 void Cmd::SetSysvar(int n, int val) {
223b71206888 Initial import
thib
parents:
diff changeset
1417 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
1418 if (cmd_type != CMD_SYSVAR) {
223b71206888 Initial import
thib
parents:
diff changeset
1419 args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1420 }
223b71206888 Initial import
thib
parents:
diff changeset
1421 cmd_type = CMD_SYSVAR;
223b71206888 Initial import
thib
parents:
diff changeset
1422
223b71206888 Initial import
thib
parents:
diff changeset
1423 info.type = TYPE_SYS;
223b71206888 Initial import
thib
parents:
diff changeset
1424 info.number = n;
223b71206888 Initial import
thib
parents:
diff changeset
1425 info.value = val;
223b71206888 Initial import
thib
parents:
diff changeset
1426 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1427 }
223b71206888 Initial import
thib
parents:
diff changeset
1428 void Cmd::SetFlagvar(VarInfo info, int val) {
223b71206888 Initial import
thib
parents:
diff changeset
1429 if (cmd_type != CMD_SYSVAR) {
223b71206888 Initial import
thib
parents:
diff changeset
1430 args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1431 }
223b71206888 Initial import
thib
parents:
diff changeset
1432 cmd_type = CMD_SYSVAR;
223b71206888 Initial import
thib
parents:
diff changeset
1433
223b71206888 Initial import
thib
parents:
diff changeset
1434 info.value = val;
223b71206888 Initial import
thib
parents:
diff changeset
1435 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1436 }
223b71206888 Initial import
thib
parents:
diff changeset
1437
223b71206888 Initial import
thib
parents:
diff changeset
1438 void Cmd::SetStrvar(VarInfo info, const string& s) {
223b71206888 Initial import
thib
parents:
diff changeset
1439 if (cmd_type != CMD_SYSVAR) {
223b71206888 Initial import
thib
parents:
diff changeset
1440 args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1441 }
223b71206888 Initial import
thib
parents:
diff changeset
1442
223b71206888 Initial import
thib
parents:
diff changeset
1443 cmd_type = CMD_SYSVAR;
223b71206888 Initial import
thib
parents:
diff changeset
1444 const char* ss = s.c_str();
223b71206888 Initial import
thib
parents:
diff changeset
1445 info.value = CopyString(ss);
223b71206888 Initial import
thib
parents:
diff changeset
1446 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1447 }
223b71206888 Initial import
thib
parents:
diff changeset
1448
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1449
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1450 const char* Cmd::Str(const VarInfo& info) const {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1451 if (info.type != TYPE_STR && info.type != TYPE_VARSTR && info.type != TYPE_VARLOCSTR && info.type != TYPE_VARSYSSTR)
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1452 return "";
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1453 int pt = info.value;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1454 if (pt < 0 || pt >= STRHEAP_SIZE) return "";
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1455 return strheap + pt;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1456 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1457
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1458 int Cmd::AddStr(char* s) {
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1459 // 1-0a-0064 はこういうものが必要らしい
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1460 int start = strend;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1461 while (*s) strheap[strend++] = *s++;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1462 strheap[strend++] = 0;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1463 return start;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1464 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1465
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1466
0
223b71206888 Initial import
thib
parents:
diff changeset
1467 void Cmd::read(const CmdSimplified& from) {
223b71206888 Initial import
thib
parents:
diff changeset
1468 errorflag = false;
223b71206888 Initial import
thib
parents:
diff changeset
1469 ResetString();
223b71206888 Initial import
thib
parents:
diff changeset
1470
223b71206888 Initial import
thib
parents:
diff changeset
1471 cmd_type = Cmdtype(from.type);
223b71206888 Initial import
thib
parents:
diff changeset
1472 cmd1 = from.cmd1;
223b71206888 Initial import
thib
parents:
diff changeset
1473 cmd2 = from.cmd2;
223b71206888 Initial import
thib
parents:
diff changeset
1474 cmd3 = from.cmd3;
223b71206888 Initial import
thib
parents:
diff changeset
1475 cmd4 = from.cmd4;
223b71206888 Initial import
thib
parents:
diff changeset
1476 argc = from.argc;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1477 /* args の読み込み */
0
223b71206888 Initial import
thib
parents:
diff changeset
1478 args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1479 char* d = from.args;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1480 if (d == NULL) return;
0
223b71206888 Initial import
thib
parents:
diff changeset
1481 while(*d != TYPE_END) {
223b71206888 Initial import
thib
parents:
diff changeset
1482 VarInfo info;
223b71206888 Initial import
thib
parents:
diff changeset
1483 switch(*d) {
223b71206888 Initial import
thib
parents:
diff changeset
1484 case TYPE_VAL:
223b71206888 Initial import
thib
parents:
diff changeset
1485 info.type = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
1486 info.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1487 info.value = read_little_endian_int(d+1);
223b71206888 Initial import
thib
parents:
diff changeset
1488 d += 5;
223b71206888 Initial import
thib
parents:
diff changeset
1489 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1490 break;
223b71206888 Initial import
thib
parents:
diff changeset
1491 case TYPE_STR:
223b71206888 Initial import
thib
parents:
diff changeset
1492 info.type = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
1493 info.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1494 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1495 info.value = CopyString( d);
223b71206888 Initial import
thib
parents:
diff changeset
1496 d += strlen(d)+1;
223b71206888 Initial import
thib
parents:
diff changeset
1497 args.push_back(info);
223b71206888 Initial import
thib
parents:
diff changeset
1498 break;
223b71206888 Initial import
thib
parents:
diff changeset
1499 default:
223b71206888 Initial import
thib
parents:
diff changeset
1500 fprintf(stderr,"Cmd::read: Invalid Load Data\n");
223b71206888 Initial import
thib
parents:
diff changeset
1501 *d = TYPE_END;
223b71206888 Initial import
thib
parents:
diff changeset
1502 }
223b71206888 Initial import
thib
parents:
diff changeset
1503 }
223b71206888 Initial import
thib
parents:
diff changeset
1504 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1505
0
223b71206888 Initial import
thib
parents:
diff changeset
1506 void Cmd::write(CmdSimplified& to, char*& buffer) const {
223b71206888 Initial import
thib
parents:
diff changeset
1507 /*
223b71206888 Initial import
thib
parents:
diff changeset
1508 if (cmd_type != CMD_OTHER) {
223b71206888 Initial import
thib
parents:
diff changeset
1509 fprintf(stderr,"Cmd::write: Invalid Cmd during Saving Data\n");
223b71206888 Initial import
thib
parents:
diff changeset
1510 to.cmd1 = 0; to.cmd2 = 0; to.cmd3 = 0; to.cmd4 = 0; to.argc = 0; to.args = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1511 return;
223b71206888 Initial import
thib
parents:
diff changeset
1512 }
223b71206888 Initial import
thib
parents:
diff changeset
1513 */
223b71206888 Initial import
thib
parents:
diff changeset
1514 to.type = cmd_type;
223b71206888 Initial import
thib
parents:
diff changeset
1515 to.cmd1 = cmd1;
223b71206888 Initial import
thib
parents:
diff changeset
1516 to.cmd2 = cmd2;
223b71206888 Initial import
thib
parents:
diff changeset
1517 to.cmd3 = cmd3;
223b71206888 Initial import
thib
parents:
diff changeset
1518 to.cmd4 = cmd4;
223b71206888 Initial import
thib
parents:
diff changeset
1519 to.argc = argc;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1520 /* args の書き込み */
0
223b71206888 Initial import
thib
parents:
diff changeset
1521 if (args.empty()) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1522 to.args = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1523 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1524 to.args = buffer;
223b71206888 Initial import
thib
parents:
diff changeset
1525 char* d = to.args;
223b71206888 Initial import
thib
parents:
diff changeset
1526 vector<VarInfo>::const_iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
1527 for (it = args.begin(); it != args.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
1528 int type = it->type;
223b71206888 Initial import
thib
parents:
diff changeset
1529 if ( (type >= 0 && type < 7) || type == TYPE_VAL || type == char(TYPE_SYS)) { // digits
223b71206888 Initial import
thib
parents:
diff changeset
1530 *d++ = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
1531 write_little_endian_int(d, it->value);
223b71206888 Initial import
thib
parents:
diff changeset
1532 d += 4;
223b71206888 Initial import
thib
parents:
diff changeset
1533 } else if (type == TYPE_VARSTR || type == TYPE_VARSYSSTR || type == TYPE_VARLOCSTR || type == TYPE_STR) { // string
223b71206888 Initial import
thib
parents:
diff changeset
1534 *d++ = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
1535 const char* s = Str(*it);
223b71206888 Initial import
thib
parents:
diff changeset
1536 int len = strlen(s);
223b71206888 Initial import
thib
parents:
diff changeset
1537 memcpy(d, s, len+1);
223b71206888 Initial import
thib
parents:
diff changeset
1538 d += len+1;
223b71206888 Initial import
thib
parents:
diff changeset
1539 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1540 fprintf(stderr,"Cmd::write: Invalid Cmd args during Saving Data\n");
223b71206888 Initial import
thib
parents:
diff changeset
1541 }
223b71206888 Initial import
thib
parents:
diff changeset
1542 }
223b71206888 Initial import
thib
parents:
diff changeset
1543 *d++ = TYPE_END;
223b71206888 Initial import
thib
parents:
diff changeset
1544 buffer = d;
223b71206888 Initial import
thib
parents:
diff changeset
1545 }
223b71206888 Initial import
thib
parents:
diff changeset
1546 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1547
0
223b71206888 Initial import
thib
parents:
diff changeset
1548 void CmdSimplified::copy(const CmdSimplified& from, char*& args_buffer) {
223b71206888 Initial import
thib
parents:
diff changeset
1549 *this = from;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1550 if (args == NULL) return;
0
223b71206888 Initial import
thib
parents:
diff changeset
1551 char* args_old = from.args;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1552 /* args のコピー */
0
223b71206888 Initial import
thib
parents:
diff changeset
1553 while(*args_old != TYPE_END) {
223b71206888 Initial import
thib
parents:
diff changeset
1554 if (*args_old == TYPE_VAL) {
223b71206888 Initial import
thib
parents:
diff changeset
1555 args_old += 5;
223b71206888 Initial import
thib
parents:
diff changeset
1556 } else { /* TYPE_STR */
223b71206888 Initial import
thib
parents:
diff changeset
1557 args_old += strlen(args_old)+1;
223b71206888 Initial import
thib
parents:
diff changeset
1558 }
223b71206888 Initial import
thib
parents:
diff changeset
1559 }
223b71206888 Initial import
thib
parents:
diff changeset
1560 args_old++;
223b71206888 Initial import
thib
parents:
diff changeset
1561 int args_len = args_old - from.args;
223b71206888 Initial import
thib
parents:
diff changeset
1562 memmove(args_buffer, from.args, args_len);
223b71206888 Initial import
thib
parents:
diff changeset
1563 args = args_buffer;
223b71206888 Initial import
thib
parents:
diff changeset
1564 args_buffer += args_len;
223b71206888 Initial import
thib
parents:
diff changeset
1565 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1566
0
223b71206888 Initial import
thib
parents:
diff changeset
1567 void CmdSimplified::Save(string& saveret) {
223b71206888 Initial import
thib
parents:
diff changeset
1568 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
1569 sprintf(buf, "%02x-%02x:%04x:%02x(%02d),", cmd1, cmd2, cmd3, cmd4, argc);
223b71206888 Initial import
thib
parents:
diff changeset
1570 saveret += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1571
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1572 /* args のコピー */
0
223b71206888 Initial import
thib
parents:
diff changeset
1573 char* d = args;
223b71206888 Initial import
thib
parents:
diff changeset
1574 while(d && *d != TYPE_END) {
223b71206888 Initial import
thib
parents:
diff changeset
1575 if (*d == TYPE_VAL) {
223b71206888 Initial import
thib
parents:
diff changeset
1576 d++;
223b71206888 Initial import
thib
parents:
diff changeset
1577 sprintf(buf, "%d,", read_little_endian_int(d));
223b71206888 Initial import
thib
parents:
diff changeset
1578 d += 4;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1579 } else { /* TYPE_STR と仮定 */
0
223b71206888 Initial import
thib
parents:
diff changeset
1580 d++;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1581 if (strlen(d) > 1000) d[1000] = 0; // ありえない・・・
0
223b71206888 Initial import
thib
parents:
diff changeset
1582 int i; int cnt = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1583 buf[cnt++] = '"';
223b71206888 Initial import
thib
parents:
diff changeset
1584 for (i=0; d[i] != 0; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1585 if (d[i] == '"') buf[cnt++] = '"';
223b71206888 Initial import
thib
parents:
diff changeset
1586 buf[cnt++] = d[i];
223b71206888 Initial import
thib
parents:
diff changeset
1587 }
223b71206888 Initial import
thib
parents:
diff changeset
1588 buf[cnt++]='"';
223b71206888 Initial import
thib
parents:
diff changeset
1589 buf[cnt++] = ',';
223b71206888 Initial import
thib
parents:
diff changeset
1590 buf[cnt++] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1591 d += strlen(d)+1;
223b71206888 Initial import
thib
parents:
diff changeset
1592 }
223b71206888 Initial import
thib
parents:
diff changeset
1593 saveret += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1594 }
223b71206888 Initial import
thib
parents:
diff changeset
1595 saveret += 'E';
223b71206888 Initial import
thib
parents:
diff changeset
1596 }
223b71206888 Initial import
thib
parents:
diff changeset
1597
223b71206888 Initial import
thib
parents:
diff changeset
1598 void CmdSimplified::Load(const char* save, char*& args_buffer) {
223b71206888 Initial import
thib
parents:
diff changeset
1599 args = args_buffer;
223b71206888 Initial import
thib
parents:
diff changeset
1600
223b71206888 Initial import
thib
parents:
diff changeset
1601 type = CMD_OTHER;
223b71206888 Initial import
thib
parents:
diff changeset
1602 sscanf(save, "%02x-%02x:%04x:%02x(%02d),", &cmd1, &cmd2, &cmd3, &cmd4, &argc);
223b71206888 Initial import
thib
parents:
diff changeset
1603 save = strchr(save, ',');
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1604 if (save == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1605 *args_buffer++ = TYPE_END;
223b71206888 Initial import
thib
parents:
diff changeset
1606 return;
223b71206888 Initial import
thib
parents:
diff changeset
1607 }
223b71206888 Initial import
thib
parents:
diff changeset
1608 save++;
223b71206888 Initial import
thib
parents:
diff changeset
1609 while(*save != 'E' && *save != '\n' && *save != '\0') {
223b71206888 Initial import
thib
parents:
diff changeset
1610 if (isdigit(*save)) {
223b71206888 Initial import
thib
parents:
diff changeset
1611 int v;
223b71206888 Initial import
thib
parents:
diff changeset
1612 sscanf(save,"%d,",&v);
223b71206888 Initial import
thib
parents:
diff changeset
1613 *args_buffer++ = TYPE_VAL;
223b71206888 Initial import
thib
parents:
diff changeset
1614 write_little_endian_int(args_buffer, v);
223b71206888 Initial import
thib
parents:
diff changeset
1615 args_buffer+= 4;
223b71206888 Initial import
thib
parents:
diff changeset
1616 save = strchr(save, ',');
223b71206888 Initial import
thib
parents:
diff changeset
1617 if (save) save++;
223b71206888 Initial import
thib
parents:
diff changeset
1618 } else { // *save == '"'
223b71206888 Initial import
thib
parents:
diff changeset
1619 save++;
223b71206888 Initial import
thib
parents:
diff changeset
1620 *args_buffer++ = TYPE_STR;
223b71206888 Initial import
thib
parents:
diff changeset
1621 while(1) {
223b71206888 Initial import
thib
parents:
diff changeset
1622 if (*save == 0) break;
223b71206888 Initial import
thib
parents:
diff changeset
1623 if (*save == '"') {
223b71206888 Initial import
thib
parents:
diff changeset
1624 if (save[1] != '"') break;
223b71206888 Initial import
thib
parents:
diff changeset
1625 save++;
223b71206888 Initial import
thib
parents:
diff changeset
1626 }
223b71206888 Initial import
thib
parents:
diff changeset
1627 *args_buffer++ = *save++;
223b71206888 Initial import
thib
parents:
diff changeset
1628 }
223b71206888 Initial import
thib
parents:
diff changeset
1629 save += 2;
223b71206888 Initial import
thib
parents:
diff changeset
1630 *args_buffer++ = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1631 }
223b71206888 Initial import
thib
parents:
diff changeset
1632 }
223b71206888 Initial import
thib
parents:
diff changeset
1633 *args_buffer++ = TYPE_END;
223b71206888 Initial import
thib
parents:
diff changeset
1634 }
223b71206888 Initial import
thib
parents:
diff changeset
1635
223b71206888 Initial import
thib
parents:
diff changeset
1636 #ifdef SCN_DUMP
223b71206888 Initial import
thib
parents:
diff changeset
1637 void usage(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1638 fprintf(stderr,"usage : scn2kdump [inputfile] [outputfile]\n");
223b71206888 Initial import
thib
parents:
diff changeset
1639 fprintf(stderr," inputfile: seen.txt(default)\n");
223b71206888 Initial import
thib
parents:
diff changeset
1640 fprintf(stderr," outputfile: seen.txt_out(default)\n");
223b71206888 Initial import
thib
parents:
diff changeset
1641 exit(-1);
223b71206888 Initial import
thib
parents:
diff changeset
1642 }
223b71206888 Initial import
thib
parents:
diff changeset
1643 int main(int argc, char** argv) {
223b71206888 Initial import
thib
parents:
diff changeset
1644 /* determine file names */
223b71206888 Initial import
thib
parents:
diff changeset
1645 bool verbose = false;
223b71206888 Initial import
thib
parents:
diff changeset
1646 char* inname = "seen.txt";
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1647 char* outname = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1648 if (argc > 2 && strcmp(argv[1],"-v") == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1649 int i; for (i=1; i<argc; i++) argv[i] = argv[i+1];
223b71206888 Initial import
thib
parents:
diff changeset
1650 argc--;
223b71206888 Initial import
thib
parents:
diff changeset
1651 verbose = true;
223b71206888 Initial import
thib
parents:
diff changeset
1652 }
223b71206888 Initial import
thib
parents:
diff changeset
1653 switch(argc) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1654 case 1: break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1655 case 2:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1656 inname = argv[1];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1657 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1658 case 3:
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1659 inname = argv[1];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1660 outname = argv[2];
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1661 break;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1662 default: usage();
0
223b71206888 Initial import
thib
parents:
diff changeset
1663 }
223b71206888 Initial import
thib
parents:
diff changeset
1664 /* open output file */
223b71206888 Initial import
thib
parents:
diff changeset
1665 FILE* outstream = stdout;
223b71206888 Initial import
thib
parents:
diff changeset
1666 /* create archive instance */
223b71206888 Initial import
thib
parents:
diff changeset
1667 SCN2kFILE archive(inname);
223b71206888 Initial import
thib
parents:
diff changeset
1668 archive.Init();
223b71206888 Initial import
thib
parents:
diff changeset
1669 if (archive.Deal() == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1670 fprintf(stderr,"Cannot open / Invalid archive file %s\n",inname);
223b71206888 Initial import
thib
parents:
diff changeset
1671 usage();
223b71206888 Initial import
thib
parents:
diff changeset
1672 }
223b71206888 Initial import
thib
parents:
diff changeset
1673 /* dump files */
223b71206888 Initial import
thib
parents:
diff changeset
1674 archive.InitList();
223b71206888 Initial import
thib
parents:
diff changeset
1675 char* fname;
223b71206888 Initial import
thib
parents:
diff changeset
1676 fprintf(stderr,"Dump start\n");
223b71206888 Initial import
thib
parents:
diff changeset
1677 int system_version = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1678 while( (fname = archive.ListItem()) != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1679 ARCINFO* info = archive.Find(fname,"");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 47
diff changeset
1680 if (info == NULL) continue;
0
223b71206888 Initial import
thib
parents:
diff changeset
1681 char* data = info->CopyRead();
223b71206888 Initial import
thib
parents:
diff changeset
1682 char* d = data;
223b71206888 Initial import
thib
parents:
diff changeset
1683 char* dend = d + info->Size();
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1684 /* version 確認 */
0
223b71206888 Initial import
thib
parents:
diff changeset
1685 if (read_little_endian_int(d) == 0x1cc) {
223b71206888 Initial import
thib
parents:
diff changeset
1686 system_version = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1687 } else if (read_little_endian_int(d) == 0x1d0) {
223b71206888 Initial import
thib
parents:
diff changeset
1688 system_version = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1689 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1690 continue;
223b71206888 Initial import
thib
parents:
diff changeset
1691 }
223b71206888 Initial import
thib
parents:
diff changeset
1692 if (read_little_endian_int(d+4) == 0x1adb2) ; // little busters!
223b71206888 Initial import
thib
parents:
diff changeset
1693 else if (read_little_endian_int(d+4) != 0x2712) continue;
223b71206888 Initial import
thib
parents:
diff changeset
1694 int header_size;
223b71206888 Initial import
thib
parents:
diff changeset
1695 if (system_version == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1696 header_size = 0x1cc + read_little_endian_int(d+0x20) * 4;
223b71206888 Initial import
thib
parents:
diff changeset
1697 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1698 header_size = read_little_endian_int(d+0x20);
223b71206888 Initial import
thib
parents:
diff changeset
1699 }
223b71206888 Initial import
thib
parents:
diff changeset
1700 d += header_size;
223b71206888 Initial import
thib
parents:
diff changeset
1701
223b71206888 Initial import
thib
parents:
diff changeset
1702 const char* dcur = d;
223b71206888 Initial import
thib
parents:
diff changeset
1703 const char* dstart = d;
223b71206888 Initial import
thib
parents:
diff changeset
1704 fprintf(stderr,"Dumping %s\n",fname);
223b71206888 Initial import
thib
parents:
diff changeset
1705 Flags flags;
65
4416cfac86ae Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents: 63
diff changeset
1706 /* 最初から最後までコマンド取得 -> 出力を繰り返す */
0
223b71206888 Initial import
thib
parents:
diff changeset
1707 while(dcur<dend) {
223b71206888 Initial import
thib
parents:
diff changeset
1708 const char* dprev = dcur;
223b71206888 Initial import
thib
parents:
diff changeset
1709 Cmd cmd(flags, system_version); cmd.ClearError();
223b71206888 Initial import
thib
parents:
diff changeset
1710
223b71206888 Initial import
thib
parents:
diff changeset
1711 /* end? */
223b71206888 Initial import
thib
parents:
diff changeset
1712 if (*dcur == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1713 /* 0xff x 32byte + 0x00 : end sign */
223b71206888 Initial import
thib
parents:
diff changeset
1714 int i; for (i=0; i<0x20; i++)
223b71206888 Initial import
thib
parents:
diff changeset
1715 if (dcur[i] != -1) break;
223b71206888 Initial import
thib
parents:
diff changeset
1716 if (i == 0x20 && dcur[i] == 0) break;
223b71206888 Initial import
thib
parents:
diff changeset
1717 }
223b71206888 Initial import
thib
parents:
diff changeset
1718 dprintf("%d : ",dcur-dstart);
223b71206888 Initial import
thib
parents:
diff changeset
1719 cmd.GetCmd(flags, dcur);
223b71206888 Initial import
thib
parents:
diff changeset
1720 if (cmd.IsError()) {
223b71206888 Initial import
thib
parents:
diff changeset
1721 fprintf(outstream, "Error at %6d\n",dprev-dstart);
223b71206888 Initial import
thib
parents:
diff changeset
1722 while(dcur < dend) {
223b71206888 Initial import
thib
parents:
diff changeset
1723 if (*dcur == 0x29 && dcur[1] == 0x0a) {dcur++;break;}
223b71206888 Initial import
thib
parents:
diff changeset
1724 dcur++;
223b71206888 Initial import
thib
parents:
diff changeset
1725 }
223b71206888 Initial import
thib
parents:
diff changeset
1726 dprev -= 2*16;
223b71206888 Initial import
thib
parents:
diff changeset
1727 int ilen = (dcur-dprev+15)/16;
223b71206888 Initial import
thib
parents:
diff changeset
1728 int i; for (i=0; i<ilen; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1729 fprintf(outstream, "%6d: ",dprev-dstart);
223b71206888 Initial import
thib
parents:
diff changeset
1730 int j; for (j=0; j<16; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
1731 if (dprev >= dend) break;
223b71206888 Initial import
thib
parents:
diff changeset
1732 if (dprev < data) continue;
223b71206888 Initial import
thib
parents:
diff changeset
1733 fprintf(outstream, "%02x ",*(unsigned char*)(dprev));
223b71206888 Initial import
thib
parents:
diff changeset
1734 dprev++;
223b71206888 Initial import
thib
parents:
diff changeset
1735 }
223b71206888 Initial import
thib
parents:
diff changeset
1736 fprintf(outstream, "\n");
223b71206888 Initial import
thib
parents:
diff changeset
1737 }
223b71206888 Initial import
thib
parents:
diff changeset
1738 }
223b71206888 Initial import
thib
parents:
diff changeset
1739 }
223b71206888 Initial import
thib
parents:
diff changeset
1740 delete info;
223b71206888 Initial import
thib
parents:
diff changeset
1741 }
223b71206888 Initial import
thib
parents:
diff changeset
1742 return 0;
223b71206888 Initial import
thib
parents:
diff changeset
1743 }
223b71206888 Initial import
thib
parents:
diff changeset
1744 #endif
223b71206888 Initial import
thib
parents:
diff changeset
1745