| | 522 | */ |
| | 523 | |
| | 524 | // 09/04/03 arche [ADD] begin |
| | 525 | protected function replaceMacro(macroTable:Array):void { |
| | 526 | for each(var macro:Object in macroTable){ |
| | 527 | if(m_string.substr(m_letter, macro.id.length) == macro.id){ |
| | 528 | var start:int = m_letter, last:int = m_letter + macro.id.length, code:String = macro.code; |
| | 529 | m_letter += macro.id.length; |
| | 530 | var c:String = getCharNext(); |
| | 531 | while(StringUtil.isWhitespace(c) || c == ' '){ |
| | 532 | c = getCharNext(); |
| | 533 | } |
| | 534 | var args:Array = new Array(); |
| | 535 | if(c == "{"){ |
| | 536 | c = getCharNext(); |
| | 537 | while(c != "}" && c != ""){ |
| | 538 | if(c == "$"){ |
| | 539 | replaceMacro(macroTable); |
| | 540 | } |
| | 541 | c = getCharNext(); |
| | 542 | } |
| | 543 | last = m_letter; |
| | 544 | args = m_string.substring(start + macro.id.length + 1, last - 1).split(","); |
| | 545 | } |
| | 546 | // 引数への置換 |
| | 547 | for(var i:int = 0; i < code.length; i++){ |
| | 548 | for(var j:int = 0; j < args.length; j++){ |
| | 549 | if(j >= macro.args.length){ |
| | 550 | break; |
| | 551 | } |
| | 552 | if(code.substr(i, macro.args[j].id.length + 1) == ("%" + macro.args[j].id)){ |
| | 553 | code = code.substring(0, i) + code.substring(i).replace("%" + macro.args[j].id, args[macro.args[j].index]); |
| | 554 | i += args[macro.args[j].index].length - 1; |
| | 555 | break; |
| | 556 | } |
| | 557 | } |
| | 558 | } |
| | 559 | m_string = m_string.substring(0, start - 1) + code + m_string.substring(last); |
| | 560 | m_letter = start - 1; |
| | 561 | //trace(m_string.substring(m_letter)); |
| | 562 | break; |
| | 563 | } |
| | 564 | } |
| | 565 | } |
| | 566 | // 09/04/03 arche [ADD] end |
| 566 | | case '$': |
| 567 | | // macro definition? |
| 568 | | if (top) { |
| 569 | | last = m_string.indexOf(";", m_letter); |
| 570 | | if (last > m_letter) { |
| 571 | | var macro:String = m_string.substring(m_letter, last); |
| 572 | | var token:Array = macro.split("="); |
| 573 | | if (token.length >= 2 && |
| 574 | | token[0].length >= 1) { |
| 575 | | var id:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); |
| 576 | | //trace("token:"+token[0]+"/"+id); |
| 577 | | if (id != null) { |
| 578 | | //trace("macro:$"+id[0]+"="+token[1]); |
| 579 | | if (id[0].length > 0) { |
| 580 | | m_string = remove(m_string, --m_letter, last); |
| 581 | | var idx:int = getIndex(idArr, id[0]); |
| 582 | | // first definition |
| 583 | | if (idx < 0) { |
| 584 | | token[1] = macroInMacro(token[1], idArr, valArr, id[0]); |
| 585 | | //trace("define $"+id[i]+"="+token[1]); |
| 586 | | insertLenOrder(idArr, valArr, id[0], token[1]); |
| 587 | | } |
| 588 | | // macro redefinition |
| 589 | | else { |
| 590 | | token[1] = macroInMacro(token[1], idArr, valArr, id[0]); |
| 591 | | //trace("redefine $"+id[i]+"="+token[1]); |
| 592 | | valArr[idx] = token[1]; |
| 593 | | } |
| | 605 | case '$': |
| | 606 | if(top){ |
| | 607 | var last:int = m_string.indexOf(";", m_letter); |
| | 608 | if(last > m_letter){ |
| | 609 | var nameEnd:int = m_string.indexOf("=", m_letter); |
| | 610 | if(nameEnd > m_letter && nameEnd < last){ |
| | 611 | var start:int = m_letter; |
| | 612 | var argspos:int = m_string.indexOf("{"); |
| | 613 | if(argspos < 0 || argspos >= nameEnd){ |
| | 614 | argspos = nameEnd; |
| 595 | | } |
| | 616 | var regexResult:Array = m_string.substring(start, argspos).match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); |
| | 617 | if(regexResult != null){ |
| | 618 | var id:String = regexResult[0]; |
| | 619 | if(id.length > 0){ |
| | 620 | var args:Array = new Array(); |
| | 621 | if(argspos < nameEnd){ |
| | 622 | var argstr:String = m_string.substring(argspos + 1, m_string.indexOf("}", argspos)); |
| | 623 | args = argstr.split(","); |
| | 624 | for(i = 0; i < args.length; i++){ |
| | 625 | var argid:Array = args[i].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); |
| | 626 | args[i] = { id: (argid != null ? argid[0] : ""), index: i }; |
| | 627 | } |
| | 628 | args.sort(function (a:Object, b:Object):int { |
| | 629 | if(a.id.length > b.id.length) return -1; |
| | 630 | if(a.id.length == b.id.length) return 0; |
| | 631 | return 1; |
| | 632 | }); |
| | 633 | } |
| | 634 | m_letter = nameEnd + 1; |
| | 635 | c = getCharNext(); |
| | 636 | while(m_letter < last){ |
| | 637 | if(c == "$"){ |
| | 638 | if(m_string.substr(m_letter, id.length) == id){ |
| | 639 | m_letter--; |
| | 640 | m_string = remove(m_string, m_letter, m_letter + id.length); |
| | 641 | warning(MWarning.RECURSIVE_MACRO, id); |
| | 642 | }else{ |
| | 643 | replaceMacro(macroTable); |
| | 644 | } |
| | 645 | last = m_string.indexOf(";", m_letter); |
| | 646 | } |
| | 647 | c = getCharNext(); |
| | 648 | } |
| | 649 | var pos:int = 0; |
| | 650 | for(; pos < macroTable.length; pos++){ |
| | 651 | if(macroTable[pos].id.length < id.length){ |
| | 652 | break; |
| | 653 | } |
| | 654 | } |
| | 655 | macroTable.splice(pos, 0, { id: id, code: m_string.substring(nameEnd + 1, last), args: args }); |
| | 656 | m_string = remove(m_string, start - 1, last); |
| | 657 | m_letter = start - 1; |
| | 658 | } |
| | 659 | } |
| | 660 | }else{ |
| | 661 | // macro use |
| | 662 | replaceMacro(macroTable); |
| | 663 | top = false; |
| | 664 | } |
| | 665 | }else{ |
| | 666 | // macro use |
| | 667 | replaceMacro(macroTable); |
| | 668 | top = false; |