Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/Script.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Sun Aug 15 01:53:13 2010 UTC (13 years, 9 months ago) by okadu
File MIME type: text/x-c++src
File size: 13753 byte(s)


1 #include "stdafx.h"
2
3 /*
4 * コンストラクタ
5 */
6 CSynErr::CSynErr(
7 char *pos // エラー発生箇所
8 ){
9 m_Message = lang(SyntaxError);
10 m_ErrorPos = pos;
11 }
12
13 /*
14 * コンストラクタ
15 */
16 CSynErr::CSynErr(
17 char *pos, // エラー発生箇所
18 const char *format, // 書式
19 ... // 任意パラメタ
20 ){
21 char *buf = FlashIn("");
22 va_list vl;
23 va_start(vl, format);
24 vsprintf(buf, format, vl);
25 va_end(vl);
26 m_Message = buf;
27 m_ErrorPos = pos;
28 }
29
30 /*
31 * コンストラクタ
32 */
33 void CSynErr::Handle(
34 string head, // メッセージヘッダ
35 char *buf // スクリプトバッファ
36 ){
37 if(!buf || !m_ErrorPos || m_ErrorPos<buf){
38 ErrorDialog("%s\n%s", head.c_str(), m_Message.c_str());
39 return;
40 }
41 char *ptr = buf;
42 int line = 1;
43 bool cr = false;
44 while(*ptr && ptr<m_ErrorPos){
45 char *next = CharNext(ptr);
46 if(next-ptr>1){
47 cr = false;
48 }else if(*ptr==0x0d){
49 line++;
50 cr = true;
51 }else if(*ptr==0x0a){
52 if(!cr) line++;
53 cr = false;
54 }else{
55 cr = false;
56 }
57 ptr = next;
58 }
59 if(ptr<m_ErrorPos){
60 ErrorDialog("%s\n%s", head.c_str(), m_Message.c_str());
61 }else{
62 int i = 0;
63 char *tmp = ptr;
64 for(; *tmp && *tmp!=0x0d && *tmp!=0x0a && i<512; i++, tmp++);
65 *tmp = 0;
66 ErrorDialog("%s\nLine %d\n--------------------\n%s\n--------------------\n%s",
67 head.c_str(), line, ptr, m_Message.c_str());
68 }
69 }
70
71 ////////////////////////////////////////////////////////////////////////////////
72 ////////////////////////////////////////////////////////////////////////////////
73
74 /*
75 * アルファベット + アンダースコア
76 */
77 inline char *Nondigit(
78 char *str // 数式文字列
79 ){
80 if('A'<=*str && *str<='Z' || 'a'<=*str && *str<='z'
81 || *str=='_') return str+1;
82 return NULL;
83 }
84
85 /*
86 * 数字
87 */
88 inline char *Digit(
89 char *str // 数式文字列
90 ){
91 if('0'<=*str && *str<='9') return str+1;
92 return NULL;
93 }
94
95 /*
96 * 数字
97 */
98 inline char *Hexadecimal(
99 char *str // 数式文字列
100 ){
101 if('A'<=*str && *str<='F' || 'a'<=*str && *str<='f'
102 || '0'<=*str && *str<='9') return str+1;
103 return NULL;
104 }
105
106 /*
107 * 空白およびコメント
108 */
109 char *Space(
110 char *str // 対象文字列
111 ){
112 while(str && *str){
113 char *tmp, *eee;
114 if(tmp = Character(str, ' ')){
115 str = tmp;
116 }else if(tmp = Character(str, '\t')){
117 str = tmp;
118 }else if(tmp = Character(str, '\r')){
119 str = tmp;
120 }else if(tmp = Character(str, '\n')){
121 str = tmp;
122 }else if(tmp = String(str, " ")){
123 str = tmp;
124 }else if(tmp = String(str, "//")){
125 str = tmp;
126 while(*str){
127 if(tmp = Character(str, '\n')){
128 str = tmp;
129 break;
130 }
131 str = CharNext(str);
132 }
133 }else if(tmp = String(eee = str, "/*")){
134 char *cmtloc = str;
135 str = tmp;
136 while(true){
137 if(!*str) throw CSynErr(eee, lang(CommentEndNotFound));
138 if(tmp = String(str, "*/")){
139 str = tmp;
140 break;
141 }else{
142 str = CharNext(str);
143 }
144 }
145 }else{
146 break;
147 }
148 }
149 return str;
150 }
151
152 /*
153 * 定数値
154 */
155 char *ConstValue(
156 char *str, // 対象文字列
157 int *reti, // 読込先 (int)
158 float *retf // 読込先 (float)
159 ){
160 char *tmp;
161 bool minus = false;
162 if(tmp = Character(str, '-')){
163 str = tmp;
164 minus = true;
165 }
166 if(tmp = Digit(str)){
167 while(true){
168 char *tmp2;
169 if(tmp2 = Digit(tmp)){
170 tmp = tmp2;
171 }else if(tmp2 = Character(tmp, '.')){
172 tmp = tmp2;
173 goto UNDERDECIMAL;
174 }else{
175 char save = *tmp;
176 *tmp = 0;
177 int val;
178 sscanf(str, "%d", &val);
179 *reti = minus ? -val : val;
180 *retf = (float)*reti;
181 *tmp = save;
182 return Space(tmp);
183 }
184 }
185 }else if(tmp = Character(str, '.')){
186 UNDERDECIMAL:
187 char *tmp2;
188 if(tmp2 = Character(tmp, '#')){
189 tmp = tmp2;
190 while(true){
191 if((tmp2 = Digit(tmp)) || (tmp2 = Nondigit(tmp))){
192 tmp = tmp2;
193 }else{
194 *retf = 0.0f;
195 *reti = 0;
196 return Space(tmp);
197 }
198 }
199 }
200 while(true){
201 if(tmp2 = Digit(tmp)){
202 tmp = tmp2;
203 }else{
204 char save = *tmp;
205 *tmp = 0;
206 float val;
207 sscanf(str, "%f", &val);
208 *retf = minus ? -val : val;
209 *reti = (int)*retf;
210 *tmp = save;
211 return Space(tmp);
212 }
213 }
214 }
215 return NULL;
216 }
217
218 /*
219 * 整数値
220 */
221 char *ConstInteger(
222 char *str, // 対象文字列
223 int *ret // 読込先
224 ){
225 float dummy;
226 if(str = ConstValue(str, ret, &dummy)) return str;
227 return NULL;
228 }
229
230 /*
231 * 実数値
232 */
233 char *ConstFloat(
234 char *str, // 対象文字列
235 float *ret // 読込先
236 ){
237 int dummy;
238 if(str = ConstValue(str, &dummy, ret)) return str;
239 return NULL;
240 }
241
242 /*
243 * 色値
244 */
245 char *ColorValue(
246 char *str, // 対象文字列
247 D3DCOLOR *ret // 読込先
248 ){
249 char *tmp;
250 if(tmp = Character(str, '#')){
251 str = tmp;
252 while(true){
253 char *tmp2;
254 if(tmp2 = Hexadecimal(tmp)){
255 tmp = tmp2;
256 }else{
257 char save = *tmp;
258 *tmp = 0;
259 D3DCOLOR val;
260 sscanf(str, "%x", &val);
261 *ret = val;
262 *tmp = save;
263 return Space(tmp);
264 }
265 }
266 }
267 return NULL;
268 }
269
270 /*
271 * ポインタ
272 */
273 char *HexPointer(
274 char *str, // 対象文字列
275 void **ret // 読込先
276 ){
277 char *tmp;
278 if(tmp = Hexadecimal(str)){
279 while(true){
280 char *tmp2;
281 if(tmp2 = Hexadecimal(tmp)){
282 tmp = tmp2;
283 }else{
284 char save = *tmp;
285 *tmp = 0;
286 void *val;
287 sscanf(str, "%p", &val);
288 *ret = val;
289 *tmp = save;
290 return Space(tmp);
291 }
292 }
293 }
294 return NULL;
295 }
296
297 /*
298 * 2D ベクトル
299 */
300 char *Vector2D(
301 char *str, // 対象文字列
302 VEC2 *ret // 読込先
303 ){
304 if(!(str = Character2(str, '('))) return NULL;
305 if(!(str = ConstFloat(str, &ret->x))) return NULL;
306 if(!(str = Character2(str, ','))) return NULL;
307 if(!(str = ConstFloat(str, &ret->y))) return NULL;
308 if(!(str = Character2(str, ')'))) return NULL;
309 return str;
310 }
311
312 /*
313 * 3D ベクトル
314 */
315 char *Vector3D(
316 char *str, // 対象文字列
317 VEC3 *ret // 読込先
318 ){
319 if(!(str = Character2(str, '('))) return NULL;
320 if(!(str = ConstFloat(str, &ret->x))) return NULL;
321 if(!(str = Character2(str, ','))) return NULL;
322 if(!(str = ConstFloat(str, &ret->y))) return NULL;
323 if(!(str = Character2(str, ','))) return NULL;
324 if(!(str = ConstFloat(str, &ret->z))) return NULL;
325 if(!(str = Character2(str, ')'))) return NULL;
326 return str;
327 }
328
329 /*
330 * 識別子
331 */
332 char *Identifier(
333 char *str, // 対象文字列
334 string *ret // 読込先
335 ){
336 char *tmp;
337 if(!(tmp = Nondigit(str))) return NULL;
338 while(true){
339 char *tmp2;
340 if(tmp2 = Nondigit(tmp)){
341 tmp = tmp2;
342 }else if(tmp2 = Digit(tmp)){
343 tmp = tmp2;
344 }else{
345 char save = *tmp;
346 *tmp = 0;
347 *ret = str;
348 *tmp = save;
349 return Space(tmp);
350 }
351 }
352 return NULL;
353 }
354
355 /*
356 * リテラル文字列
357 */
358 char *StringLiteral(
359 char *str, // 対象文字列
360 string *ret // 読込先
361 ){
362 char *tmp, *eee;
363 if(tmp = Character(eee = str, '\"')){
364 str = tmp;
365 while(*tmp){
366 char *tmp2;
367 if((tmp2 = Character(tmp, '\r'))
368 || (tmp2 = Character(tmp, '\n'))){
369 throw CSynErr(eee, lang(StringLiteralExceedLineBreak));
370 }else if(tmp2 = String(tmp, "\\\"")){
371 tmp = tmp2;
372 }else if(tmp2 = String(tmp, "\\\r\n")){
373 tmp = tmp2;
374 }else if(tmp2 = Character(tmp, '\"')){
375 char save = *tmp;
376 *tmp = 0;
377 *ret = str;
378 *tmp = save;
379 return Space(tmp2);
380 }else{
381 tmp = CharNext(tmp);
382 }
383 }
384 }
385 return NULL;
386 }
387
388 /*
389 * yes / no
390 */
391 char *BoolYesNo(
392 char *str, // 対象文字列
393 bool *ret // 読込先
394 ){
395 string yesno;
396 if(!(str = Identifier(str, &yesno))) return NULL;
397 *ret = yesno=="yes" ? true : false;
398 return str;
399 }
400
401 /*
402 * 識別子 + 比較
403 */
404 char *Identifier2(
405 char *str, // 対象文字列
406 char *read // 識別子
407 ){
408 string tmp;
409 if(!(str = Identifier(str, &tmp))) return NULL;
410 return tmp==read ? str : NULL;
411 }
412
413 /*
414 * 代入文
415 */
416 char *Assignment(
417 char *str, // 対象文字列
418 char *read // 識別子
419 ){
420 if(!(str = Identifier2(str, read))) return NULL;
421 return Character2(str, '=');
422 }
423
424 /*
425 * 整数代入
426 */
427 char *AsgnInteger(
428 char *str, // 対象文字列
429 char *read, // 識別子
430 int *ret, // 読込先
431 int n, // 読込個数
432 bool fill // 不足自動補完
433 ){
434 if(!(str = Assignment(str, read))) return NULL;
435 if(!(str = ConstInteger(str, ret++))) return NULL;
436 while(--n>0){
437 char *tmp;
438 if(tmp = Character2(str, ';')){
439 if(!fill) return NULL;
440 while(n-->0){ *ret = *(ret-1); ret++; }
441 return tmp;
442 }
443 if(!(str = Character2(str, ','))) return NULL;
444 if(!(str = ConstInteger(str, ret++))) return NULL;
445 }
446 return Character2(str, ';');
447 }
448
449 /*
450 * 実数代入
451 */
452 char *AsgnFloat(
453 char *str, // 対象文字列
454 char *read, // 識別子
455 float *ret, // 読込先
456 int n, // 読込個数
457 bool fill // 不足自動補完
458 ){
459 if(!(str = Assignment(str, read))) return NULL;
460 if(!(str = ConstFloat(str, ret++))) return NULL;
461 while(--n>0){
462 char *tmp;
463 if(tmp = Character2(str, ';')){
464 if(!fill) return NULL;
465 while(n-->0){ *ret = *(ret-1); ret++; }
466 return tmp;
467 }
468 if(!(str = Character2(str, ','))) return NULL;
469 if(!(str = ConstFloat(str, ret++))) return NULL;
470 }
471 return Character2(str, ';');
472 }
473
474 /*
475 * 色値代入
476 */
477 char *AsgnColor(
478 char *str, // 対象文字列
479 char *read, // 識別子
480 D3DCOLOR *ret, // 読込先
481 int n, // 読込個数
482 bool fill // 不足自動補完
483 ){
484 if(!(str = Assignment(str, read))) return NULL;
485 if(!(str = ColorValue(str, ret++))) return NULL;
486 while(--n>0){
487 char *tmp;
488 if(tmp = Character2(str, ';')){
489 if(!fill) return NULL;
490 while(n-->0){ *ret = *(ret-1); ret++; }
491 return tmp;
492 }
493 if(!(str = Character2(str, ','))) return NULL;
494 if(!(str = ColorValue(str, ret++))) return NULL;
495 }
496 return Character2(str, ';');
497 }
498
499 /*
500 * 色値代入
501 */
502 char *AsgnPointer(
503 char *str, // 対象文字列
504 char *read, // 識別子
505 void **ret, // 読込先
506 int n, // 読込個数
507 bool fill // 不足自動補完
508 ){
509 if(!(str = Assignment(str, read))) return NULL;
510 if(!(str = HexPointer(str, ret++))) return NULL;
511 while(--n>0){
512 char *tmp;
513 if(tmp = Character2(str, ';')){
514 if(!fill) return NULL;
515 while(n-->0){ *ret = *(ret-1); ret++; }
516 return tmp;
517 }
518 if(!(str = Character2(str, ','))) return NULL;
519 if(!(str = HexPointer(str, ret++))) return NULL;
520 }
521 return Character2(str, ';');
522 }
523
524 /*
525 * 2D ベクトル代入
526 */
527 char *AsgnVector2D(
528 char *str, // 対象文字列
529 char *read, // 識別子
530 VEC2 *ret, // 読込先
531 int n, // 読込個数
532 bool fill // 不足自動補完
533 ){
534 if(!(str = Assignment(str, read))) return NULL;
535 if(!(str = Vector2D(str, ret++))) return NULL;
536 while(--n>0){
537 char *tmp;
538 if(tmp = Character2(str, ';')){
539 if(!fill) return NULL;
540 while(n-->0){ *ret = *(ret-1); ret++; }
541 return tmp;
542 }
543 if(!(str = Character2(str, ','))) return NULL;
544 if(!(str = Vector2D(str, ret++))) return NULL;
545 }
546 return Character2(str, ';');
547 }
548
549 /*
550 * 3D ベクトル代入
551 */
552 char *AsgnVector3D(
553 char *str, // 対象文字列
554 char *read, // 識別子
555 VEC3 *ret, // 読込先
556 int n, // 読込個数
557 bool fill // 不足自動補完
558 ){
559 if(!(str = Assignment(str, read))) return NULL;
560 if(!(str = Vector3D(str, ret++))) return NULL;
561 while(--n>0){
562 char *tmp;
563 if(tmp = Character2(str, ';')){
564 if(!fill) return NULL;
565 while(n-->0){ *ret = *(ret-1); ret++; }
566 return tmp;
567 }
568 if(!(str = Character2(str, ','))) return NULL;
569 if(!(str = Vector3D(str, ret++))) return NULL;
570 }
571 return Character2(str, ';');
572 }
573
574 /*
575 * 識別子代入
576 */
577 char *AsgnIdentifier(
578 char *str, // 対象文字列
579 char *read, // 識別子
580 string *ret, // 読込先
581 int n, // 読込個数
582 bool fill // 不足自動補完
583 ){
584 if(!(str = Assignment(str, read))) return NULL;
585 if(!(str = Identifier(str, ret++))) return NULL;
586 while(--n>0){
587 char *tmp;
588 if(tmp = Character2(str, ';')){
589 if(!fill) return NULL;
590 while(n-->0){ *ret = *(ret-1); ret++; }
591 return tmp;
592 }
593 if(!(str = Character2(str, ','))) return NULL;
594 if(!(str = Identifier(str, ret++))) return NULL;
595 }
596 return Character2(str, ';');
597 }
598
599 /*
600 * 文字列代入
601 */
602 char *AsgnString(
603 char *str, // 対象文字列
604 char *read, // 識別子
605 string *ret, // 読込先
606 int n, // 読込個数
607 bool fill // 不足自動補完
608 ){
609 if(!(str = Assignment(str, read))) return NULL;
610 if(!(str = StringLiteral(str, ret++))) return NULL;
611 while(--n>0){
612 char *tmp;
613 if(tmp = Character2(str, ';')){
614 if(!fill) return NULL;
615 while(n-->0){ *ret = *(ret-1); ret++; }
616 return tmp;
617 }
618 if(!(str = Character2(str, ','))) return NULL;
619 if(!(str = StringLiteral(str, ret++))) return NULL;
620 }
621 return Character2(str, ';');
622 }
623
624 /*
625 * yes / no 代入 (yes: 1, no: 0)
626 */
627 char *AsgnYesNo(
628 char *str, // 対象文字列
629 char *read, // 識別子
630 bool *ret, // 読込先
631 int n, // 読込個数
632 bool fill // 不足自動補完
633 ){
634 string yesno;
635 if(!(str = Assignment(str, read))) return NULL;
636 if(!(str = Identifier(str, &yesno))) return NULL;
637 *ret = yesno=="yes" ? true : false; ret++;
638 while(--n>0){
639 char *tmp;
640 if(tmp = Character2(str, ';')){
641 if(!fill) return NULL;
642 while(n-->0){ *ret = *(ret-1); ret++; }
643 return tmp;
644 }
645 if(!(str = Character2(str, ','))) return NULL;
646 if(!(str = Identifier(str, &yesno))) return NULL;
647 *ret = yesno=="yes" ? true : false; ret++;
648 }
649 return Character2(str, ';');
650 }
651
652 /*
653 * ブロック開始
654 */
655 char *BeginBlock(
656 char *str, // 対象文字列
657 char *read // 識別子
658 ){
659 if(!(str = Identifier2(str, read))) return NULL;
660 return Character2(str, '{');
661 }
662
663 /*
664 * 名前付きブロック開始
665 */
666 char *BeginNamedBlock(
667 char *str, // 対象文字列
668 char *read, // 識別子
669 string *name // 名前代入先
670 ){
671 if(!(str = Identifier2(str, read))) return NULL;
672 if(!(str = StringLiteral(str, name))) return NULL;
673 return Character2(str, '{');
674 }
675
676 /*
677 * ブロック終了
678 */
679 char *EndBlock(
680 char *str // 対象文字列
681 ){
682 return Character2(str, '}');
683 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26