| 355 | | protected function replaceMacro(str:String, startIndex:int, id:String, val:String):String { |
| 356 | | var letter:int = startIndex; |
| 357 | | var top:int = 1; |
| 358 | | loop : while(letter < str.length) { |
| 359 | | var c:String = str.charAt(letter++); |
| 360 | | switch(c) { |
| 361 | | case '$': |
| 362 | | // defining macro? |
| 363 | | if (top) { |
| 364 | | var last:int = str.indexOf(";", letter); |
| 365 | | if (last > letter) { |
| 366 | | var macro:String = str.substring(letter, last); |
| 367 | | var token:Array = macro.split("="); |
| 368 | | if (token.length >= 2 && |
| 369 | | token[0].length >= 1) { |
| 370 | | var ids:Array = token[0].match("[a-zA-Z_][a-zA-Z_0-9#\+\(\)]*"); |
| 371 | | // same macro -> replace |
| 372 | | if ((ids != null) && ids[0] == id) { |
| 373 | | val = token[1]; |
| 374 | | str = remove(str, --letter, last); |
| 375 | | } |
| 376 | | // other macro -> skip identifier |
| 377 | | else { |
| 378 | | letter += token[0].length; |
| 379 | | } |
| 380 | | } |
| 381 | | } |
| 382 | | } |
| 383 | | // replace |
| 384 | | if (str.substr(letter, id.length) == id) { |
| 385 | | str = str.substring(0, letter-1) + val + str.substring(letter + id.length); |
| 386 | | letter += id.length; |
| 387 | | } |
| 388 | | top = 0; |
| 389 | | break; |
| 390 | | case ';': |
| 391 | | top = 1; |
| 392 | | break; |
| 393 | | default: |
| 394 | | if (!StringUtil.isWhitespace(c) && c != ' ') top = 0; |
| 395 | | break; |
| | 355 | protected function getIndex(idArr:Array, id:String):int { |
| | 356 | for(var i:int = 0; i < idArr.length; i++) |
| | 357 | if (((String)(idArr[i])) == id) return i; |
| | 358 | return -1; |
| | 359 | } |
| | 360 | |
| | 361 | protected function insertLenOrder(idArr:Array, valArr:Array, id:String, val:String):void { |
| | 362 | var len:int = id.length; |
| | 363 | var i:int; |
| | 364 | for(i = 0; i < idArr.length; i++) { |
| | 365 | if (len >= ((String)(idArr[i])).length) break; |
| | 366 | } |
| | 367 | idArr.splice(i, 0, id); |
| | 368 | valArr.splice(i, 0, val); |
| | 369 | } |
| | 370 | |
| | 371 | protected function replaceMacro(idArr:Array, valArr:Array):void { |
| | 372 | var i:int; |
| | 373 | for(i = 0; i < idArr.length; i++) { |
| | 374 | var id:String = idArr[i]; |
| | 375 | if (m_string.substr(m_letter, id.length) == idArr[i]) { |
| | 376 | //trace("["+m_string.substr(m_letter, id.length)+"]"); |
| | 377 | m_string = m_string.substring(0, m_letter-1) + valArr[i] + m_string.substring(m_letter + id.length); |
| | 378 | m_letter += id.length; |
| | 379 | break; |
| | 380 | } |
| | 381 | } |
| | 382 | } |
| | 383 | |
| | 384 | protected function macroInMacro(str:String, idArr:Array, valArr:Array):String { |
| | 385 | for(var i:int = 0; i < idArr.length; i++) { |
| | 386 | var id:String = "$"+idArr[i]; |
| | 387 | //trace("id:"+id); |
| | 388 | var idx:int = str.indexOf(id); |
| | 389 | while(idx >= 0) { |
| | 390 | str = str.substring(0, idx-1) + valArr[i] + str.substring(idx + id.length); |
| | 391 | idx = str.indexOf(id, idx); |
| 399 | | } |
| 400 | | |
| 401 | | protected function quickSort(idArr:Array, valArr:Array, begin:int, end:int):void { |
| 402 | | if (begin >= end) return; |
| 403 | | var i:int, j:int; |
| 404 | | var tmp:String; |
| 405 | | var pivot:int = ((String)(idArr[(int)((begin + end) / 2)])).length; |
| 406 | | i = begin; |
| 407 | | j = end; |
| 408 | | while(1) { |
| 409 | | while(((String)(idArr[i])).length < pivot) ++i; |
| 410 | | while(((String)(idArr[j])).length > pivot) --j; |
| 411 | | if (i >= j) break; |
| 412 | | tmp = idArr[i]; |
| 413 | | idArr[i] = idArr[j]; |
| 414 | | idArr[j] = tmp; |
| 415 | | tmp = valArr[i]; |
| 416 | | valArr[i] = valArr[j]; |
| 417 | | valArr[j] = tmp; |
| 418 | | i++; |
| 419 | | j--; |
| 420 | | } |
| 421 | | if (begin < i - 1) quickSort(idArr, valArr, begin, i - 1); |
| 422 | | if (j + 1 < end) quickSort(idArr, valArr, j + 1, end); |
| 423 | | } |
| 424 | | |
| 425 | | protected function lengthSort(idArr:Array, valArr:Array):void { |
| 426 | | quickSort(idArr, valArr, 0, idArr.length-1); |
| 458 | | var f:int = 0; |
| 459 | | for(i = 0; i < idArr.length; i++) { |
| 460 | | if (idArr[i] == id[0]) { f = 1; break; } |
| | 427 | m_string = remove(m_string, --m_letter, last); |
| | 428 | var idx:int = getIndex(idArr, id[0]); |
| | 429 | // first definition |
| | 430 | if (idx < 0) { |
| | 431 | token[1] = macroInMacro(token[1], idArr, valArr); |
| | 432 | //trace("define $"+id[i]+"="+token[1]); |
| | 433 | insertLenOrder(idArr, valArr, id[i], token[1]); |
| 481 | | } |
| 482 | | lengthSort(idArr, valArr); |
| 483 | | for(i = idArr.length-1; i >= 0; i--) { |
| 484 | | //trace("macro["+idArr[i]+"]"+valArr[i]); |
| 485 | | for(var j:int = 0; j < valArr.length; j++) { |
| 486 | | if (i != j) valArr[j] = replaceMacro(valArr[j], 0, idArr[i], valArr[i]); |
| 487 | | } |
| 488 | | m_string = replaceMacro(m_string, 0, idArr[i], valArr[i]); |