1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_rsc.hxx" 30 /****************** I N C L U D E S **************************************/ 31 32 // Programmuebergreifende Includes. 33 #include <rscdef.hxx> 34 35 /****************** C o d e **********************************************/ 36 /****************** R s c I d ********************************************/ 37 sal_Bool RscId::bNames = sal_True; 38 39 /************************************************************************* 40 |* 41 |* static RscId::SetNames 42 |* static RscId::SetNoNames 43 |* 44 |* Beschreibung 45 |* Ersterstellung MM 26.06.91 46 |* Letzte Aenderung MM 26.06.91 47 |* 48 *************************************************************************/ 49 void RscId::SetNames( sal_Bool bSet ) { bNames = bSet; } 50 sal_Bool RscId::IsSetNames() { return bNames; } 51 52 /************************************************************************* 53 |* 54 |* RscId::GetNumber 55 |* 56 |* Beschreibung 57 |* Ersterstellung MM 17.05.91 58 |* Letzte Aenderung MM 17.05.91 59 |* 60 *************************************************************************/ 61 sal_Int32 RscId::GetNumber() const{ 62 sal_Int32 lVal; 63 aExp.Evaluate( &lVal ); 64 return lVal; 65 } 66 67 /************************************************************************* 68 |* 69 |* RscId::Create() 70 |* 71 |* Beschreibung 72 |* Ersterstellung MM 01.11.91 73 |* Letzte Aenderung MM 01.11.91 74 |* 75 *************************************************************************/ 76 void RscId::Create( const RscExpType & rExpType ) 77 { 78 aExp = rExpType; 79 if( aExp.IsDefinition() ) 80 aExp.aExp.pDef->IncRef(); 81 else if( aExp.IsExpression() ){ 82 sal_Int32 lValue; 83 84 aExp.Evaluate( &lValue ); 85 aExp.SetLong( lValue ); 86 } 87 } 88 89 /************************************************************************* 90 |* 91 |* RscId::Destroy() 92 |* 93 |* Beschreibung 94 |* Ersterstellung MM 01.11.91 95 |* Letzte Aenderung MM 01.11.91 96 |* 97 *************************************************************************/ 98 void RscId::Destroy(){ 99 if( aExp.IsDefinition() ) 100 aExp.aExp.pDef->DecRef(); 101 aExp.cType = RSCEXP_NOTHING; 102 } 103 104 /************************************************************************* 105 |* 106 |* RscId::RscId() 107 |* 108 |* Beschreibung 109 |* Ersterstellung MM 01.11.91 110 |* Letzte Aenderung MM 01.11.91 111 |* 112 *************************************************************************/ 113 RscId::RscId( const RscId& rRscId ){ 114 aExp = rRscId.aExp; 115 if( aExp.IsDefinition() ) 116 aExp.aExp.pDef->IncRef(); 117 } 118 119 /************************************************************************* 120 |* 121 |* RscId::RscId() 122 |* 123 |* Beschreibung 124 |* Ersterstellung MM 01.11.91 125 |* Letzte Aenderung MM 25.11.91 126 |* 127 *************************************************************************/ 128 RscId::RscId( RscDefine * pDef ){ 129 RscExpType aExpType; 130 131 aExpType.aExp.pDef = pDef; 132 aExpType.cType = RSCEXP_DEF; 133 Create( aExpType ); 134 } 135 136 /************************************************************************* 137 |* 138 |* RscId:: = 139 |* 140 |* Beschreibung 141 |* Ersterstellung MM 01.11.91 142 |* Letzte Aenderung MM 01.11.91 143 |* 144 *************************************************************************/ 145 RscId& RscId::operator = ( const RscId& rRscId ){ 146 if( rRscId.aExp.IsDefinition() ) 147 rRscId.aExp.aExp.pDef->IncRef(); 148 Destroy(); 149 aExp = rRscId.aExp; 150 return *this; 151 } 152 153 /************************************************************************* 154 |* 155 |* RscId::operator == 156 |* 157 |* Beschreibung 158 |* Ersterstellung MM 16.05.91 159 |* Letzte Aenderung MM 16.05.91 160 |* 161 *************************************************************************/ 162 sal_Bool RscId::operator == ( const RscId& rRscId ) const 163 { 164 return( GetNumber() == rRscId.GetNumber() ); 165 } 166 167 /************************************************************************* 168 |* 169 |* RscId::operator < 170 |* 171 |* Beschreibung 172 |* Ersterstellung MM 16.05.91 173 |* Letzte Aenderung MM 16.05.91 174 |* 175 *************************************************************************/ 176 sal_Bool RscId::operator < ( const RscId& rRscId ) const 177 { 178 return( GetNumber() < rRscId.GetNumber() ); 179 } 180 181 /************************************************************************* 182 |* 183 |* RscId::operator > 184 |* 185 |* Beschreibung 186 |* Ersterstellung MM 16.05.91 187 |* Letzte Aenderung MM 16.05.91 188 |* 189 *************************************************************************/ 190 sal_Bool RscId::operator > ( const RscId& rRscId ) const 191 { 192 return( GetNumber() > rRscId.GetNumber() ); 193 } 194 195 /************************************************************************* 196 |* 197 |* RscId::sal_Int32() 198 |* 199 |* Beschreibung 200 |* Ersterstellung MM 16.05.91 201 |* Letzte Aenderung MM 16.05.91 202 |* 203 *************************************************************************/ 204 RscId::operator sal_Int32() const 205 { 206 return( GetNumber() ); 207 } 208 209 /************************************************************************* 210 |* 211 |* RscId::GetNames() 212 |* 213 |* Beschreibung 214 |* Ersterstellung MM 16.05.91 215 |* Letzte Aenderung MM 25.11.91 216 |* 217 *************************************************************************/ 218 ByteString RscId::GetName() const 219 { 220 ByteString aStr; 221 222 if ( !aExp.IsNothing() ) 223 { 224 if( bNames ) 225 aExp.GetMacro( aStr ); 226 else 227 aStr = ByteString::CreateFromInt32( GetNumber() ); 228 } 229 230 return aStr; 231 } 232 233 /************************************************************************* 234 |* 235 |* RscId::GetMacro() 236 |* 237 |* Beschreibung 238 |* Ersterstellung MM 01.11.91 239 |* Letzte Aenderung MM 25.11.91 240 |* 241 *************************************************************************/ 242 ByteString RscId::GetMacro() const 243 { 244 ByteString aStr; 245 246 if ( aExp.IsDefinition() ) 247 aStr = aExp.aExp.pDef->GetMacro(); 248 else 249 aExp.GetMacro( aStr ); 250 251 return aStr; 252 } 253 254 /****************** R s c D e f i n e ************************************/ 255 /************************************************************************* 256 |* 257 |* RscDefine::RscDefine() 258 |* 259 |* Beschreibung 260 |* Ersterstellung MM 01.11.91 261 |* Letzte Aenderung MM 01.11.91 262 |* 263 *************************************************************************/ 264 RscDefine::RscDefine( sal_uLong lKey, const ByteString & rDefName, sal_Int32 lDefId ) 265 : StringNode( rDefName ) 266 { 267 nRefCount = 0; 268 lFileKey = lKey; 269 lId = lDefId; 270 pExp = NULL; 271 } 272 273 RscDefine::RscDefine( sal_uLong lKey, const ByteString & rDefName, 274 RscExpression * pExpression ) 275 : StringNode( rDefName ) 276 { 277 nRefCount = 0; 278 lFileKey = lKey; 279 pExpression->Evaluate( &lId ); 280 pExp = pExpression; 281 } 282 283 /************************************************************************* 284 |* 285 |* RscDefine::~RscDefine() 286 |* 287 |* Beschreibung 288 |* Ersterstellung MM 01.11.91 289 |* Letzte Aenderung MM 01.11.91 290 |* 291 *************************************************************************/ 292 RscDefine::~RscDefine(){ 293 if( pExp ) 294 delete pExp; 295 if( nRefCount ) 296 RscExit( 14 ); 297 } 298 299 /************************************************************************* 300 |* 301 |* RscDefine::DecRef() 302 |* 303 |* Beschreibung 304 |* Ersterstellung MM 01.11.91 305 |* Letzte Aenderung MM 01.11.91 306 |* 307 *************************************************************************/ 308 void RscDefine::DecRef(){ 309 nRefCount--; 310 if( 0 == nRefCount ){ 311 delete this; 312 } 313 } 314 315 /************************************************************************* 316 |* 317 |* RscDefine::DefineToNumber() 318 |* 319 |* Beschreibung 320 |* Ersterstellung MM 07.11.91 321 |* Letzte Aenderung MM 07.11.91 322 |* 323 *************************************************************************/ 324 void RscDefine::DefineToNumber() 325 { 326 if( pExp ) 327 delete pExp; 328 pExp = NULL; 329 SetName( ByteString::CreateFromInt32( lId ) ); 330 } 331 332 /************************************************************************* 333 |* 334 |* RscDefine::ChangeMacro() 335 |* 336 |* Beschreibung 337 |* Ersterstellung MM 04.11.91 338 |* Letzte Aenderung MM 04.11.91 339 |* 340 *************************************************************************/ 341 void RscDefine::ChangeMacro( RscExpression * pExpression ){ 342 if( pExp ) 343 delete pExp; 344 pExp = pExpression; 345 pExp->Evaluate( &lId ); 346 } 347 348 void RscDefine::ChangeMacro( sal_Int32 lIdentifier ){ 349 if( pExp ){ 350 delete pExp; 351 pExp = NULL; 352 } 353 lId = lIdentifier; 354 } 355 356 /************************************************************************* 357 |* 358 |* RscDefine::Evaluate() 359 |* 360 |* Beschreibung 361 |* Ersterstellung MM 01.11.91 362 |* Letzte Aenderung MM 01.11.91 363 |* 364 *************************************************************************/ 365 sal_Bool RscDefine::Evaluate(){ 366 sal_Bool bRet = sal_True; 367 368 if( pExp ) 369 bRet = !pExp->Evaluate( &lId ); 370 371 return bRet; 372 } 373 374 /************************************************************************* 375 |* 376 |* RscDefine::Search() 377 |* 378 |* Beschreibung 379 |* Ersterstellung MM 11.11.91 380 |* Letzte Aenderung MM 11.11.91 381 |* 382 *************************************************************************/ 383 RscDefine * RscDefine::Search( const char * pStr ){ 384 return (RscDefine *)StringNode::Search( pStr ); 385 } 386 387 /************************************************************************* 388 |* 389 |* RscDefine::GetMacro() 390 |* 391 |* Beschreibung 392 |* Ersterstellung MM 01.11.91 393 |* Letzte Aenderung MM 01.11.91 394 |* 395 *************************************************************************/ 396 ByteString RscDefine::GetMacro() 397 { 398 if( pExp ) 399 return pExp->GetMacro(); 400 return ByteString::CreateFromInt32( lId ); 401 } 402 403 /****************** R s c D e f i n e L i s t ****************************/ 404 /************************************************************************* 405 |* 406 |* RscDefineList::New() 407 |* 408 |* Beschreibung 409 |* Ersterstellung MM 04.11.91 410 |* Letzte Aenderung MM 04.11.91 411 |* 412 *************************************************************************/ 413 RscDefine * RscDefineList::New( sal_uLong lFileKey, const ByteString & rDefName, 414 sal_Int32 lDefId, sal_uLong lPos ) 415 { 416 RscDefine * pDef; 417 418 pDef = new RscDefine( lFileKey, rDefName, lDefId ); 419 pDef->IncRef(); 420 Insert( pDef, lPos ); 421 return pDef; 422 } 423 424 RscDefine * RscDefineList::New( sal_uLong lFileKey, const ByteString & rDefName, 425 RscExpression * pExpression, sal_uLong lPos ) 426 { 427 RscDefine * pDef; 428 429 pDef = new RscDefine( lFileKey, rDefName, pExpression ); 430 pDef->IncRef(); 431 Insert( pDef, lPos ); 432 433 return pDef; 434 } 435 436 /************************************************************************* 437 |* 438 |* RscDefineList::Remove() 439 |* 440 |* Beschreibung 441 |* Ersterstellung MM 04.11.91 442 |* Letzte Aenderung MM 04.11.91 443 |* 444 *************************************************************************/ 445 sal_Bool RscDefineList::Remove( RscDefine * pDef ){ 446 pDef = RscSubDefList::Remove( pDef ); 447 if( pDef ){ 448 pDef->DefineToNumber(); 449 pDef->DecRef(); 450 } 451 452 return( NULL != pDef ); 453 } 454 455 sal_Bool RscDefineList::Remove( sal_uLong lIndex ){ 456 RscDefine * pDef = RscSubDefList::Remove( lIndex ); 457 if( pDef ){ 458 pDef->DefineToNumber(); 459 pDef->DecRef(); 460 } 461 462 return( NULL != pDef ); 463 } 464 465 sal_Bool RscDefineList::Remove(){ 466 RscDefine * pDef; 467 468 pDef = RscSubDefList::Remove( (sal_uLong)0 ); 469 470 if( pDef ){ 471 pDef->DefineToNumber(); 472 pDef->DecRef(); 473 } 474 return( NULL != pDef ); 475 } 476 477 /************************************************************************* 478 |* 479 |* RscDefineList::Befor() 480 |* 481 |* Beschreibung 482 |* Ersterstellung MM 12.11.91 483 |* Letzte Aenderung MM 12.11.91 484 |* 485 *************************************************************************/ 486 sal_Bool RscDefineList::Befor( const RscDefine * pFree, 487 const RscDefine * pDepend ) 488 { 489 RscDefine * pDef; 490 491 pDef = First(); 492 while( pDef ){ 493 if( pDef == pFree ){ 494 pDef = Next(); 495 while( pDef ){ 496 if( pDef == pDepend ) 497 return sal_True; 498 pDef = Next(); 499 } 500 } 501 pDef = Next(); 502 }; 503 return sal_False; 504 } 505 506 /************************************************************************* 507 |* 508 |* RscDefineList::WriteAll() 509 |* 510 |* Beschreibung 511 |* Ersterstellung MM 28.10.91 512 |* Letzte Aenderung MM 28.10.91 513 |* 514 *************************************************************************/ 515 void RscDefineList::WriteAll( FILE * fOutput ) 516 { 517 RscDefine * pDefEle = First(); 518 519 while( pDefEle ) 520 { 521 fprintf( fOutput, "#define %s %s\n", 522 pDefEle->GetName().GetBuffer(), 523 pDefEle->GetMacro().GetBuffer() ); 524 pDefEle = Next(); 525 }; 526 } 527 528 /****************** R s c E x p T y p e **********************************/ 529 /************************************************************************* 530 |* 531 |* RscExpType::Evaluate() 532 |* 533 |* Beschreibung 534 |* Ersterstellung MM 01.11.91 535 |* Letzte Aenderung MM 01.11.91 536 |* 537 *************************************************************************/ 538 sal_Bool RscExpType::Evaluate( sal_Int32 * plValue ) const{ 539 if( IsDefinition() ){ 540 aExp.pDef->Evaluate(); 541 // Eventuellen Fehler ignorieren 542 *plValue = aExp.pDef->GetNumber(); 543 } 544 else if( IsExpression() ) 545 return( aExp.pExp->Evaluate( plValue ) ); 546 else if( IsNothing() ) 547 *plValue = 0; 548 else 549 *plValue = GetLong(); 550 551 return sal_True; 552 } 553 554 /************************************************************************* 555 |* 556 |* RscExpType::GetMacro() 557 |* 558 |* Beschreibung 559 |* Ersterstellung MM 01.11.91 560 |* Letzte Aenderung MM 01.11.91 561 |* 562 *************************************************************************/ 563 void RscExpType::GetMacro( ByteString & rStr ) const 564 { 565 ByteString aStr; 566 567 if( IsDefinition() ) 568 { 569 rStr += aExp.pDef->GetName(); 570 } 571 else if( IsExpression() ) 572 rStr += aExp.pExp->GetMacro(); 573 else if( IsNumber() ) 574 rStr += ByteString::CreateFromInt32( GetLong() ); 575 } 576 577 578 /****************** R s c E x p r e s s i o n ****************************/ 579 /************************************************************************* 580 |* 581 |* RscExpression::RscExpression() 582 |* 583 |* Beschreibung 584 |* Ersterstellung MM 01.11.91 585 |* Letzte Aenderung MM 01.11.91 586 |* 587 *************************************************************************/ 588 RscExpression::RscExpression( RscExpType aLE, char cOp, RscExpType aRE ) 589 { 590 aLeftExp = aLE; 591 cOperation = cOp; 592 aRightExp = aRE; 593 if( aLeftExp.IsDefinition() ) 594 aLeftExp.aExp.pDef->IncRef(); 595 if( aRightExp.IsDefinition() ) 596 aRightExp.aExp.pDef->IncRef(); 597 } 598 599 /************************************************************************* 600 |* 601 |* RscExpression::~RscExpression() 602 |* 603 |* Beschreibung 604 |* Ersterstellung MM 01.11.91 605 |* Letzte Aenderung MM 01.11.91 606 |* 607 *************************************************************************/ 608 RscExpression::~RscExpression(){ 609 if( aLeftExp.IsDefinition() ) 610 aLeftExp.aExp.pDef->DecRef(); 611 else if( aLeftExp.IsExpression() ) 612 delete aLeftExp.aExp.pExp; 613 614 if( aRightExp.IsDefinition() ) 615 aRightExp.aExp.pDef->DecRef(); 616 else if( aRightExp.IsExpression() ) 617 delete aRightExp.aExp.pExp; 618 } 619 620 /************************************************************************* 621 |* 622 |* RscExpression::Evaluate() 623 |* 624 |* Beschreibung 625 |* Ersterstellung MM 01.11.91 626 |* Letzte Aenderung MM 01.11.91 627 |* 628 *************************************************************************/ 629 sal_Bool RscExpression::Evaluate( sal_Int32 * plValue ){ 630 sal_Int32 lLeft; 631 sal_Int32 lRight; 632 633 // linken und rechten Zweig auswerten 634 if( aLeftExp.Evaluate( &lLeft ) && aRightExp.Evaluate( &lRight ) ){ 635 if( cOperation == '&' ) 636 *plValue = lLeft & lRight; 637 else if( cOperation == '|' ) 638 *plValue = lLeft | lRight; 639 else if( cOperation == '+' ) 640 *plValue = lLeft + lRight; 641 else if( cOperation == '-' ) 642 *plValue = lLeft - lRight; 643 else if( cOperation == '*' ) 644 *plValue = lLeft * lRight; 645 else if( cOperation == 'r' ) 646 *plValue = lLeft >> lRight; 647 else if( cOperation == 'l' ) 648 *plValue = lLeft << lRight; 649 else{ 650 if( 0L == lRight ) 651 return sal_False; 652 *plValue = lLeft / lRight; 653 }; 654 return sal_True; 655 } 656 return sal_False; 657 } 658 659 /************************************************************************* 660 |* 661 |* RscExpression::GetMacro() 662 |* 663 |* Beschreibung 664 |* Ersterstellung MM 01.11.91 665 |* Letzte Aenderung MM 01.11.91 666 |* 667 *************************************************************************/ 668 ByteString RscExpression::GetMacro() 669 { 670 ByteString aLeft; 671 672 // Ausgabeoptimierung 673 if( aLeftExp.IsNothing() ) 674 { 675 if ( '-' == cOperation ) 676 { 677 aLeft += '('; 678 aLeft += '-'; 679 } 680 aRightExp.GetMacro( aLeft ); 681 if( '-' == cOperation ) 682 aLeft += ')'; 683 } 684 else if( aRightExp.IsNothing() ) 685 aLeftExp.GetMacro( aLeft ); 686 else{ 687 aLeft += '('; 688 // linken Zweig auswerten 689 aLeftExp.GetMacro( aLeft ); 690 691 aLeft += cOperation; 692 693 aLeft += '('; 694 // rechten Zweig auswerten 695 aRightExp.GetMacro( aLeft ); 696 aLeft += ')'; 697 698 aLeft += ')'; 699 } 700 701 return aLeft; 702 } 703 704 /****************** R s c F i l e ****************************************/ 705 /************************************************************************* 706 |* 707 |* RscFile::RscFile() 708 |* 709 |* Beschreibung 710 |* Ersterstellung MM 04.11.91 711 |* Letzte Aenderung MM 04.11.91 712 |* 713 *************************************************************************/ 714 RscFile :: RscFile(){ 715 bLoaded = sal_False; 716 bIncFile = sal_False; 717 bDirty = sal_False; 718 bScanned = sal_False; 719 } 720 721 /************************************************************************* 722 |* 723 |* RscFile::~RscFile() 724 |* 725 |* Beschreibung 726 |* Ersterstellung MM 04.11.91 727 |* Letzte Aenderung MM 04.11.91 728 |* 729 *************************************************************************/ 730 RscFile :: ~RscFile(){ 731 RscDepend * pDep = Remove( (sal_uLong)0 ); 732 733 while( pDep ){ 734 delete pDep; 735 pDep = Remove( (sal_uLong)0 ); 736 } 737 738 //von hinten nach vorne ist besser wegen der Abhaengigkeiten 739 //Objekte zerstoeren sich, wenn Referenzzaehler NULL 740 aDefLst.Last(); 741 while( aDefLst.Remove() ) ; 742 } 743 744 /************************************************************************* 745 |* 746 |* RscFile::Depend() 747 |* 748 |* Beschreibung Diese Methode gibt sal_True zurueck, wenn lDepend 749 |* existiert und hinter lFree steht, oder wenn 750 |* lDepend nicht existiert. 751 |* Ersterstellung MM 12.11.91 752 |* Letzte Aenderung MM 12.11.91 753 |* 754 *************************************************************************/ 755 sal_Bool RscFile::Depend( sal_uLong lDepend, sal_uLong lFree ){ 756 RscDepend * pDep; 757 758 pDep = Last(); 759 while( pDep ){ 760 if( pDep->GetFileKey() == lDepend ){ 761 while( pDep ){ 762 if( pDep->GetFileKey() == lFree ) 763 return sal_True; 764 pDep = Prev(); 765 } 766 return sal_False; 767 } 768 pDep = Prev(); 769 }; 770 771 return sal_True; 772 } 773 774 /************************************************************************* 775 |* 776 |* RscFile::InsertDependFile() 777 |* 778 |* Beschreibung 779 |* Ersterstellung MM 06.01.92 780 |* Letzte Aenderung MM 06.01.92 781 |* 782 *************************************************************************/ 783 sal_Bool RscFile :: InsertDependFile( sal_uLong lIncFile, sal_uLong lPos ) 784 { 785 RscDepend * pDep; 786 787 pDep = First(); 788 while( pDep ){ 789 if( pDep->GetFileKey() == lIncFile ) 790 return sal_True; 791 pDep = Next(); 792 } 793 794 // Current-Zeiger steht auf letztem Element 795 if( lPos >= Count() ){ //letztes Element muss immer letztes bleiben 796 // Abhaengigkeit vor der letzten Position eintragen 797 Insert( new RscDepend( lIncFile ) ); 798 } 799 else 800 Insert( new RscDepend( lIncFile ), lPos ); 801 802 return sal_True; 803 } 804 805 /************************************************************************* 806 |* 807 |* RscFile::RemoveDependFile() 808 |* 809 |* Beschreibung 810 |* Ersterstellung MM 18.11.91 811 |* Letzte Aenderung MM 18.11.91 812 |* 813 *************************************************************************/ 814 void RscFile :: RemoveDependFile( sal_uLong lDepFile ) 815 { 816 817 RscDepend * pDep = Last(); 818 819 while( pDep ){ 820 if( pDep->GetFileKey() == lDepFile ){ 821 Remove( pDep ); 822 delete pDep; 823 } 824 pDep = Prev(); 825 } 826 } 827 828 /****************** R s c D e f T r e e **********************************/ 829 /************************************************************************* 830 |* 831 |* RscDefTree::~RscDefTree() 832 |* 833 |* Beschreibung 834 |* Ersterstellung MM 12.11.91 835 |* Letzte Aenderung MM 12.11.91 836 |* 837 *************************************************************************/ 838 RscDefTree::~RscDefTree(){ 839 Remove(); 840 } 841 842 /************************************************************************* 843 |* 844 |* RscDefTree::Remove() 845 |* 846 |* Beschreibung 847 |* Ersterstellung MM 12.11.91 848 |* Letzte Aenderung MM 12.11.91 849 |* 850 *************************************************************************/ 851 void RscDefTree::Remove(){ 852 RscDefine * pDef; 853 while( pDefRoot ){ 854 pDef = pDefRoot; 855 pDefRoot = (RscDefine *)pDefRoot->Remove( pDefRoot ); 856 pDef->DecRef(); 857 } 858 } 859 860 /************************************************************************* 861 |* 862 |* RscDefTree::~Search() 863 |* 864 |* Beschreibung 865 |* Ersterstellung MM 12.11.91 866 |* Letzte Aenderung MM 12.11.91 867 |* 868 *************************************************************************/ 869 RscDefine * RscDefTree::Search( const char * pName ){ 870 if( pDefRoot ) 871 return pDefRoot->Search( pName ); 872 return NULL; 873 } 874 875 /************************************************************************* 876 |* 877 |* RscDefTree::Insert() 878 |* 879 |* Beschreibung 880 |* Ersterstellung MM 12.11.91 881 |* Letzte Aenderung MM 12.11.91 882 |* 883 *************************************************************************/ 884 void RscDefTree::Insert( RscDefine * pDef ){ 885 if( pDefRoot ) 886 pDefRoot->Insert( pDef ); 887 else 888 pDefRoot = pDef; 889 pDef->IncRef(); 890 } 891 892 /************************************************************************* 893 |* 894 |* RscDefTree::Remove() 895 |* 896 |* Beschreibung 897 |* Ersterstellung MM 12.11.91 898 |* Letzte Aenderung MM 12.11.91 899 |* 900 *************************************************************************/ 901 void RscDefTree::Remove( RscDefine * pDef ){ 902 if( pDefRoot ){ 903 //falls pDef == pDefRoot 904 pDefRoot = (RscDefine *)pDefRoot->Remove( pDef ); 905 } 906 pDef->DecRef(); 907 } 908 909 /************************************************************************* 910 |* 911 |* RscDefTree::Evaluate() 912 |* 913 |* Beschreibung 914 |* Ersterstellung MM 12.11.91 915 |* Letzte Aenderung MM 12.11.91 916 |* 917 *************************************************************************/ 918 sal_Bool RscDefTree::Evaluate( RscDefine * pDef ){ 919 if( pDef ){ 920 if( !Evaluate( (RscDefine *)pDef->Left() ) ) 921 return sal_False; 922 if( !Evaluate( (RscDefine *)pDef->Right() ) ) 923 return sal_False; 924 }; 925 return sal_True; 926 } 927 928 sal_Bool RscDefTree::Evaluate(){ 929 return Evaluate( pDefRoot ); 930 } 931 932 /****************** R s c F i l e T a b **********************************/ 933 /************************************************************************* 934 |* 935 |* RscFileTab::RscFileTab() 936 |* 937 |* Beschreibung 938 |* Ersterstellung MM 07.11.91 939 |* Letzte Aenderung MM 07.11.91 940 |* 941 *************************************************************************/ 942 RscFileTab::RscFileTab(){ 943 } 944 945 /************************************************************************* 946 |* 947 |* RscFileTab::~RscFileTab() 948 |* 949 |* Beschreibung 950 |* Ersterstellung MM 04.11.91 951 |* Letzte Aenderung MM 04.11.91 952 |* 953 *************************************************************************/ 954 RscFileTab :: ~RscFileTab(){ 955 RscFile * pFile; 956 957 aDefTree.Remove(); 958 959 pFile = Last(); 960 while( pFile ){ 961 Remove( GetIndex( pFile ) ); 962 delete pFile; 963 pFile = Prev(); 964 }; 965 } 966 967 /************************************************************************* 968 |* 969 |* RscFileTab::Find() 970 |* 971 |* Beschreibung 972 |* Ersterstellung MM 16.05.91 973 |* Letzte Aenderung MM 16.05.91 974 |* 975 *************************************************************************/ 976 sal_uLong RscFileTab :: Find( const ByteString & rName ) 977 { 978 RscFile * pFName; 979 980 pFName = First(); 981 while( pFName && (pFName->aFileName != rName) ) 982 pFName = Next(); 983 984 if( pFName ) 985 return( GetIndex( pFName ) ); 986 else 987 return( NOFILE_INDEX ); 988 } 989 990 /************************************************************************* 991 |* 992 |* RscFileTab::FindDef() 993 |* 994 |* Beschreibung 995 |* Ersterstellung MM 30.10.91 996 |* Letzte Aenderung MM 01.11.91 997 |* 998 *************************************************************************/ 999 RscDefine * RscFileTab::FindDef( const char * pName ){ 1000 return aDefTree.Search( pName ); 1001 } 1002 1003 /************************************************************************* 1004 |* 1005 |* RscFileTab::FindDef() 1006 |* 1007 |* Beschreibung 1008 |* Ersterstellung MM 30.10.91 1009 |* Letzte Aenderung MM 01.11.91 1010 |* 1011 *************************************************************************/ 1012 RscDefine * RscFileTab::FindDef( sal_uLong lFileKey, const ByteString & rName ) 1013 { 1014 RscDefine * pDef = FindDef( rName ); 1015 1016 if( pDef ) 1017 //befindet sich das DEFINE in einer Include-Datei in der 1018 //Datei lFileKey 1019 if( Depend( lFileKey, pDef->GetFileKey() ) ) 1020 return pDef; 1021 return NULL; 1022 } 1023 1024 /************************************************************************* 1025 |* 1026 |* RscFileTab::Depend() 1027 |* 1028 |* Beschreibung 1029 |* Ersterstellung MM 08.11.91 1030 |* Letzte Aenderung MM 08.11.91 1031 |* 1032 *************************************************************************/ 1033 sal_Bool RscFileTab::Depend( sal_uLong lDepend, sal_uLong lFree ){ 1034 if( lDepend == lFree ) 1035 return sal_True; 1036 1037 RscFile * pFile = First(); 1038 while( pFile ){ 1039 if( !pFile->IsIncFile() ){ 1040 if( !pFile->Depend( lDepend, lFree ) ) 1041 return sal_False; 1042 }; 1043 pFile = Next(); 1044 }; 1045 1046 return sal_True; 1047 } 1048 1049 /************************************************************************* 1050 |* 1051 |* RscFileTab::TestDef() 1052 |* 1053 |* Beschreibung 1054 |* Ersterstellung MM 14.01.92 1055 |* Letzte Aenderung MM 14.01.92 1056 |* 1057 *************************************************************************/ 1058 sal_Bool RscFileTab::TestDef( sal_uLong lFileKey, sal_uLong lPos, 1059 const RscDefine * pDefDec ) 1060 { 1061 if( lFileKey == pDefDec->GetFileKey() ){ 1062 RscFile * pFile = GetFile( pDefDec->GetFileKey() ); 1063 if( pFile && (lPos <= pFile->aDefLst.GetPos( (RscDefine *)pDefDec )) 1064 && (lPos != LIST_APPEND) ) 1065 return sal_False; 1066 } 1067 else if( !Depend( lFileKey, pDefDec->GetFileKey() ) ) 1068 return sal_False; 1069 1070 return TestDef( lFileKey, lPos, pDefDec->pExp ); 1071 } 1072 1073 /************************************************************************* 1074 |* 1075 |* RscFileTab::TestDef() 1076 |* 1077 |* Beschreibung 1078 |* Ersterstellung MM 14.01.92 1079 |* Letzte Aenderung MM 14.01.92 1080 |* 1081 *************************************************************************/ 1082 sal_Bool RscFileTab::TestDef( sal_uLong lFileKey, sal_uLong lPos, 1083 const RscExpression * pExpDec ) 1084 { 1085 if( !pExpDec ) 1086 return sal_True; 1087 1088 if( pExpDec->aLeftExp.IsExpression() ) 1089 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pExp ) ) 1090 return sal_False; 1091 1092 if( pExpDec->aLeftExp.IsDefinition() ) 1093 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pDef ) ) 1094 return sal_False; 1095 1096 if( pExpDec->aRightExp.IsExpression() ) 1097 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pExp ) ) 1098 return sal_False; 1099 1100 if( pExpDec->aRightExp.IsDefinition() ) 1101 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pDef ) ) 1102 return sal_False; 1103 1104 return sal_True; 1105 } 1106 1107 /************************************************************************* 1108 |* 1109 |* RscFileTab::NewDef() 1110 |* 1111 |* Beschreibung 1112 |* Ersterstellung MM 04.11.91 1113 |* Letzte Aenderung MM 04.11.91 1114 |* 1115 *************************************************************************/ 1116 RscDefine * RscFileTab::NewDef( sal_uLong lFileKey, const ByteString & rDefName, 1117 sal_Int32 lId, sal_uLong lPos ) 1118 { 1119 RscDefine * pDef = FindDef( rDefName ); 1120 1121 if( !pDef ){ 1122 RscFile * pFile = GetFile( lFileKey ); 1123 1124 if( pFile ){ 1125 pDef = pFile->aDefLst.New( lFileKey, rDefName, lId, lPos ); 1126 aDefTree.Insert( pDef ); 1127 } 1128 } 1129 else 1130 pDef = NULL; 1131 1132 return( pDef ); 1133 } 1134 1135 /************************************************************************* 1136 |* 1137 |* RscFileTab::NewDef() 1138 |* 1139 |* Beschreibung 1140 |* Ersterstellung MM 04.11.91 1141 |* Letzte Aenderung MM 04.11.91 1142 |* 1143 *************************************************************************/ 1144 RscDefine * RscFileTab::NewDef( sal_uLong lFileKey, const ByteString & rDefName, 1145 RscExpression * pExp, sal_uLong lPos ) 1146 { 1147 RscDefine * pDef = FindDef( rDefName ); 1148 1149 if( !pDef ){ 1150 //Macros in den Expressions sind definiert ? 1151 if( TestDef( lFileKey, lPos, pExp ) ){ 1152 RscFile * pFile = GetFile( lFileKey ); 1153 1154 if( pFile ){ 1155 pDef = pFile->aDefLst.New( lFileKey, rDefName, pExp, lPos ); 1156 aDefTree.Insert( pDef ); 1157 } 1158 } 1159 } 1160 else 1161 pDef = NULL; 1162 1163 if( !pDef ){ 1164 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird 1165 // geloescht werden 1166 delete pExp; 1167 } 1168 return( pDef ); 1169 } 1170 1171 /************************************************************************* 1172 |* 1173 |* RscFileTab::IsDefUsed() 1174 |* 1175 |* Beschreibung 1176 |* Ersterstellung MM 22.11.91 1177 |* Letzte Aenderung MM 22.11.91 1178 |* 1179 *************************************************************************/ 1180 sal_Bool RscFileTab::IsDefUsed( const ByteString & rDefName ) 1181 { 1182 RscDefine * pDef = FindDef( rDefName ); 1183 1184 if( pDef ) 1185 return( pDef->GetRefCount() != 2 ); 1186 1187 return sal_False; 1188 } 1189 1190 /************************************************************************* 1191 |* 1192 |* RscFileTab::DeleteDef() 1193 |* 1194 |* Beschreibung 1195 |* Ersterstellung MM 11.11.91 1196 |* Letzte Aenderung MM 11.11.91 1197 |* 1198 *************************************************************************/ 1199 void RscFileTab::DeleteDef( const ByteString & rDefName ) 1200 { 1201 RscDefine * pDef = FindDef( rDefName ); 1202 RscFile * pFile; 1203 1204 if( pDef ){ 1205 pFile = GetFile( pDef->GetFileKey() ); 1206 if( pFile ){ 1207 aDefTree.Remove( pDef ); 1208 pFile->aDefLst.Remove( pDef ); 1209 } 1210 }; 1211 } 1212 1213 /************************************************************************* 1214 |* 1215 |* RscFileTab::ChangeDef() 1216 |* 1217 |* Beschreibung 1218 |* Ersterstellung MM 04.11.91 1219 |* Letzte Aenderung MM 11.11.91 1220 |* 1221 *************************************************************************/ 1222 sal_Bool RscFileTab::ChangeDef( const ByteString & rDefName, sal_Int32 lId ) 1223 { 1224 RscDefine * pDef = FindDef( rDefName ); 1225 1226 if( pDef ){ 1227 pDef->ChangeMacro( lId ); 1228 //alle Macros neu bewerten 1229 return aDefTree.Evaluate(); 1230 }; 1231 return( sal_False ); 1232 } 1233 1234 /************************************************************************* 1235 |* 1236 |* RscFileTab::ChangeDef() 1237 |* 1238 |* Beschreibung 1239 |* Ersterstellung MM 04.11.91 1240 |* Letzte Aenderung MM 11.11.91 1241 |* 1242 *************************************************************************/ 1243 sal_Bool RscFileTab::ChangeDef( const ByteString & rDefName, 1244 RscExpression * pExp ) 1245 { 1246 RscDefine * pDef = FindDef( rDefName ); 1247 RscFile * pFile; 1248 sal_uLong lPos = 0; 1249 1250 if( pDef ){ 1251 pFile = GetFile( pDef->GetFileKey() ); 1252 if( pFile ) 1253 lPos = pFile->aDefLst.GetPos( pDef ); 1254 //Macros in den Expressions sind definiert ? 1255 if( TestDef( pDef->GetFileKey(), lPos, pExp ) ){ 1256 pDef->ChangeMacro( pExp ); 1257 //alle Macros neu bewerten 1258 return aDefTree.Evaluate(); 1259 } 1260 }; 1261 1262 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird 1263 // geloescht werden 1264 delete pExp; 1265 1266 return( sal_False ); 1267 } 1268 1269 /************************************************************************* 1270 |* 1271 |* RscFileTab::ChangeDefName() 1272 |* 1273 |* Beschreibung 1274 |* Ersterstellung MM 04.11.91 1275 |* Letzte Aenderung MM 04.11.91 1276 |* 1277 *************************************************************************/ 1278 sal_Bool RscFileTab::ChangeDefName( const ByteString & rDefName, 1279 const ByteString & rNewName ) 1280 { 1281 RscDefine * pDef = FindDef( rDefName ); 1282 1283 //Name gefunden ? 1284 if( pDef ){ 1285 // und neuer Name noch nicht bekannt ? 1286 if( !FindDef( pDef->GetFileKey(), rNewName ) ){ 1287 aDefTree.Remove( pDef ); 1288 pDef->SetName( rNewName ); 1289 aDefTree.Insert( pDef ); 1290 return( sal_True ); 1291 } 1292 }; 1293 1294 return( sal_False ); 1295 } 1296 1297 /************************************************************************* 1298 |* 1299 |* RscFileTab::DeleteFileContext() 1300 |* 1301 |* Beschreibung 1302 |* Ersterstellung MM 09.12.91 1303 |* Letzte Aenderung MM 09.12.91 1304 |* 1305 *************************************************************************/ 1306 void RscFileTab :: DeleteFileContext( sal_uLong lFileKey ){ 1307 RscFile * pFName; 1308 1309 pFName = GetFile( lFileKey ); 1310 if( pFName ){ 1311 RscDefine * pDef; 1312 1313 pDef = pFName->aDefLst.First(); 1314 while( pDef ){ 1315 aDefTree.Remove( pDef ); 1316 pDef = pFName->aDefLst.Next(); 1317 }; 1318 while( pFName->aDefLst.Remove( (sal_uLong)0 ) ) ; 1319 } 1320 } 1321 1322 /************************************************************************* 1323 |* 1324 |* RscFileTab::DeleteFile() 1325 |* 1326 |* Beschreibung 1327 |* Ersterstellung MM 16.05.91 1328 |* Letzte Aenderung MM 16.05.91 1329 |* 1330 *************************************************************************/ 1331 void RscFileTab :: DeleteFile( sal_uLong lFileKey ){ 1332 RscFile * pFName; 1333 1334 //Defines freigeben 1335 DeleteFileContext( lFileKey ); 1336 1337 //Schleife ueber alle Abhaengigkeiten 1338 pFName = First(); 1339 while( pFName ){ 1340 pFName->RemoveDependFile( lFileKey ); 1341 pFName = Next(); 1342 }; 1343 1344 pFName = Remove( lFileKey ); 1345 if( pFName ) 1346 delete pFName; 1347 } 1348 1349 /************************************************************************* 1350 |* 1351 |* RscFileTab::NewCodeFile() 1352 |* 1353 |* Beschreibung 1354 |* Ersterstellung MM 16.05.91 1355 |* Letzte Aenderung MM 16.05.91 1356 |* 1357 *************************************************************************/ 1358 sal_uLong RscFileTab :: NewCodeFile( const ByteString & rName ) 1359 { 1360 sal_uLong lKey; 1361 RscFile * pFName; 1362 1363 lKey = Find( rName ); 1364 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey ) 1365 { 1366 pFName = new RscFile(); 1367 pFName->aFileName = rName; 1368 pFName->aPathName = rName; 1369 lKey = Insert( pFName ); 1370 pFName->InsertDependFile( lKey, LIST_APPEND ); 1371 } 1372 return lKey; 1373 } 1374 1375 /************************************************************************* 1376 |* 1377 |* RscFileTab::NewIncFile() 1378 |* 1379 |* Beschreibung 1380 |* Ersterstellung MM 16.05.91 1381 |* Letzte Aenderung MM 16.05.91 1382 |* 1383 *************************************************************************/ 1384 sal_uLong RscFileTab :: NewIncFile( const ByteString & rName, 1385 const ByteString & rPath ) 1386 { 1387 sal_uLong lKey; 1388 RscFile * pFName; 1389 1390 lKey = Find( rName ); 1391 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey ) 1392 { 1393 pFName = new RscFile(); 1394 pFName->aFileName = rName; 1395 pFName->aPathName = rPath; 1396 pFName->SetIncFlag(); 1397 lKey = Insert( pFName ); 1398 pFName->InsertDependFile( lKey, LIST_APPEND ); 1399 } 1400 return lKey; 1401 } 1402