update dev300-m58
[ooovba.git] / rsc / source / tools / rscdef.cxx
blobcdeac13446f1b9551238c6082d912edd430dea05
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: rscdef.cxx,v $
10 * $Revision: 1.7.14.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_rsc.hxx"
33 /****************** I N C L U D E S **************************************/
35 // Programmuebergreifende Includes.
36 #include <rscdef.hxx>
38 /****************** C o d e **********************************************/
39 /****************** R s c I d ********************************************/
40 BOOL RscId::bNames = TRUE;
42 /*************************************************************************
44 |* static RscId::SetNames
45 |* static RscId::SetNoNames
47 |* Beschreibung
48 |* Ersterstellung MM 26.06.91
49 |* Letzte Aenderung MM 26.06.91
51 *************************************************************************/
52 void RscId::SetNames( BOOL bSet ) { bNames = bSet; }
53 BOOL RscId::IsSetNames() { return bNames; }
55 /*************************************************************************
57 |* RscId::GetNumber
59 |* Beschreibung
60 |* Ersterstellung MM 17.05.91
61 |* Letzte Aenderung MM 17.05.91
63 *************************************************************************/
64 INT32 RscId::GetNumber() const{
65 INT32 lVal;
66 aExp.Evaluate( &lVal );
67 return lVal;
70 /*************************************************************************
72 |* RscId::Create()
74 |* Beschreibung
75 |* Ersterstellung MM 01.11.91
76 |* Letzte Aenderung MM 01.11.91
78 *************************************************************************/
79 void RscId::Create( const RscExpType & rExpType )
81 aExp = rExpType;
82 if( aExp.IsDefinition() )
83 aExp.aExp.pDef->IncRef();
84 else if( aExp.IsExpression() ){
85 INT32 lValue;
87 aExp.Evaluate( &lValue );
88 aExp.SetLong( lValue );
92 /*************************************************************************
94 |* RscId::Destroy()
96 |* Beschreibung
97 |* Ersterstellung MM 01.11.91
98 |* Letzte Aenderung MM 01.11.91
100 *************************************************************************/
101 void RscId::Destroy(){
102 if( aExp.IsDefinition() )
103 aExp.aExp.pDef->DecRef();
104 aExp.cType = RSCEXP_NOTHING;
107 /*************************************************************************
109 |* RscId::RscId()
111 |* Beschreibung
112 |* Ersterstellung MM 01.11.91
113 |* Letzte Aenderung MM 01.11.91
115 *************************************************************************/
116 RscId::RscId( const RscId& rRscId ){
117 aExp = rRscId.aExp;
118 if( aExp.IsDefinition() )
119 aExp.aExp.pDef->IncRef();
122 /*************************************************************************
124 |* RscId::RscId()
126 |* Beschreibung
127 |* Ersterstellung MM 01.11.91
128 |* Letzte Aenderung MM 25.11.91
130 *************************************************************************/
131 RscId::RscId( RscDefine * pDef ){
132 RscExpType aExpType;
134 aExpType.aExp.pDef = pDef;
135 aExpType.cType = RSCEXP_DEF;
136 Create( aExpType );
139 /*************************************************************************
141 |* RscId:: =
143 |* Beschreibung
144 |* Ersterstellung MM 01.11.91
145 |* Letzte Aenderung MM 01.11.91
147 *************************************************************************/
148 RscId& RscId::operator = ( const RscId& rRscId ){
149 if( rRscId.aExp.IsDefinition() )
150 rRscId.aExp.aExp.pDef->IncRef();
151 Destroy();
152 aExp = rRscId.aExp;
153 return *this;
156 /*************************************************************************
158 |* RscId::operator ==
160 |* Beschreibung
161 |* Ersterstellung MM 16.05.91
162 |* Letzte Aenderung MM 16.05.91
164 *************************************************************************/
165 BOOL RscId::operator == ( const RscId& rRscId ) const
167 return( GetNumber() == rRscId.GetNumber() );
170 /*************************************************************************
172 |* RscId::operator <
174 |* Beschreibung
175 |* Ersterstellung MM 16.05.91
176 |* Letzte Aenderung MM 16.05.91
178 *************************************************************************/
179 BOOL RscId::operator < ( const RscId& rRscId ) const
181 return( GetNumber() < rRscId.GetNumber() );
184 /*************************************************************************
186 |* RscId::operator >
188 |* Beschreibung
189 |* Ersterstellung MM 16.05.91
190 |* Letzte Aenderung MM 16.05.91
192 *************************************************************************/
193 BOOL RscId::operator > ( const RscId& rRscId ) const
195 return( GetNumber() > rRscId.GetNumber() );
198 /*************************************************************************
200 |* RscId::INT32()
202 |* Beschreibung
203 |* Ersterstellung MM 16.05.91
204 |* Letzte Aenderung MM 16.05.91
206 *************************************************************************/
207 RscId::operator INT32() const
209 return( GetNumber() );
212 /*************************************************************************
214 |* RscId::GetNames()
216 |* Beschreibung
217 |* Ersterstellung MM 16.05.91
218 |* Letzte Aenderung MM 25.11.91
220 *************************************************************************/
221 ByteString RscId::GetName() const
223 ByteString aStr;
225 if ( !aExp.IsNothing() )
227 if( bNames )
228 aExp.GetMacro( aStr );
229 else
230 aStr = ByteString::CreateFromInt32( GetNumber() );
233 return aStr;
236 /*************************************************************************
238 |* RscId::GetMacro()
240 |* Beschreibung
241 |* Ersterstellung MM 01.11.91
242 |* Letzte Aenderung MM 25.11.91
244 *************************************************************************/
245 ByteString RscId::GetMacro() const
247 ByteString aStr;
249 if ( aExp.IsDefinition() )
250 aStr = aExp.aExp.pDef->GetMacro();
251 else
252 aExp.GetMacro( aStr );
254 return aStr;
257 /****************** R s c D e f i n e ************************************/
258 /*************************************************************************
260 |* RscDefine::RscDefine()
262 |* Beschreibung
263 |* Ersterstellung MM 01.11.91
264 |* Letzte Aenderung MM 01.11.91
266 *************************************************************************/
267 RscDefine::RscDefine( ULONG lKey, const ByteString & rDefName, INT32 lDefId )
268 : StringNode( rDefName )
270 nRefCount = 0;
271 lFileKey = lKey;
272 lId = lDefId;
273 pExp = NULL;
276 RscDefine::RscDefine( ULONG lKey, const ByteString & rDefName,
277 RscExpression * pExpression )
278 : StringNode( rDefName )
280 nRefCount = 0;
281 lFileKey = lKey;
282 pExpression->Evaluate( &lId );
283 pExp = pExpression;
286 /*************************************************************************
288 |* RscDefine::~RscDefine()
290 |* Beschreibung
291 |* Ersterstellung MM 01.11.91
292 |* Letzte Aenderung MM 01.11.91
294 *************************************************************************/
295 RscDefine::~RscDefine(){
296 if( pExp )
297 delete pExp;
298 if( nRefCount )
299 RscExit( 14 );
302 /*************************************************************************
304 |* RscDefine::DecRef()
306 |* Beschreibung
307 |* Ersterstellung MM 01.11.91
308 |* Letzte Aenderung MM 01.11.91
310 *************************************************************************/
311 void RscDefine::DecRef(){
312 nRefCount--;
313 if( 0 == nRefCount ){
314 delete this;
318 /*************************************************************************
320 |* RscDefine::DefineToNumber()
322 |* Beschreibung
323 |* Ersterstellung MM 07.11.91
324 |* Letzte Aenderung MM 07.11.91
326 *************************************************************************/
327 void RscDefine::DefineToNumber()
329 if( pExp )
330 delete pExp;
331 pExp = NULL;
332 SetName( ByteString::CreateFromInt32( lId ) );
335 /*************************************************************************
337 |* RscDefine::ChangeMacro()
339 |* Beschreibung
340 |* Ersterstellung MM 04.11.91
341 |* Letzte Aenderung MM 04.11.91
343 *************************************************************************/
344 void RscDefine::ChangeMacro( RscExpression * pExpression ){
345 if( pExp )
346 delete pExp;
347 pExp = pExpression;
348 pExp->Evaluate( &lId );
351 void RscDefine::ChangeMacro( INT32 lIdentifier ){
352 if( pExp ){
353 delete pExp;
354 pExp = NULL;
356 lId = lIdentifier;
359 /*************************************************************************
361 |* RscDefine::Evaluate()
363 |* Beschreibung
364 |* Ersterstellung MM 01.11.91
365 |* Letzte Aenderung MM 01.11.91
367 *************************************************************************/
368 BOOL RscDefine::Evaluate(){
369 BOOL bRet = TRUE;
371 if( pExp )
372 bRet = !pExp->Evaluate( &lId );
374 return bRet;
377 /*************************************************************************
379 |* RscDefine::Search()
381 |* Beschreibung
382 |* Ersterstellung MM 11.11.91
383 |* Letzte Aenderung MM 11.11.91
385 *************************************************************************/
386 RscDefine * RscDefine::Search( const char * pStr ){
387 return (RscDefine *)StringNode::Search( pStr );
390 /*************************************************************************
392 |* RscDefine::GetMacro()
394 |* Beschreibung
395 |* Ersterstellung MM 01.11.91
396 |* Letzte Aenderung MM 01.11.91
398 *************************************************************************/
399 ByteString RscDefine::GetMacro()
401 if( pExp )
402 return pExp->GetMacro();
403 return ByteString::CreateFromInt32( lId );
406 /****************** R s c D e f i n e L i s t ****************************/
407 /*************************************************************************
409 |* RscDefineList::New()
411 |* Beschreibung
412 |* Ersterstellung MM 04.11.91
413 |* Letzte Aenderung MM 04.11.91
415 *************************************************************************/
416 RscDefine * RscDefineList::New( ULONG lFileKey, const ByteString & rDefName,
417 INT32 lDefId, ULONG lPos )
419 RscDefine * pDef;
421 pDef = new RscDefine( lFileKey, rDefName, lDefId );
422 pDef->IncRef();
423 Insert( pDef, lPos );
424 return pDef;
427 RscDefine * RscDefineList::New( ULONG lFileKey, const ByteString & rDefName,
428 RscExpression * pExpression, ULONG lPos )
430 RscDefine * pDef;
432 pDef = new RscDefine( lFileKey, rDefName, pExpression );
433 pDef->IncRef();
434 Insert( pDef, lPos );
436 return pDef;
439 /*************************************************************************
441 |* RscDefineList::Remove()
443 |* Beschreibung
444 |* Ersterstellung MM 04.11.91
445 |* Letzte Aenderung MM 04.11.91
447 *************************************************************************/
448 BOOL RscDefineList::Remove( RscDefine * pDef ){
449 pDef = RscSubDefList::Remove( pDef );
450 if( pDef ){
451 pDef->DefineToNumber();
452 pDef->DecRef();
455 return( NULL != pDef );
458 BOOL RscDefineList::Remove( ULONG lIndex ){
459 RscDefine * pDef = RscSubDefList::Remove( lIndex );
460 if( pDef ){
461 pDef->DefineToNumber();
462 pDef->DecRef();
465 return( NULL != pDef );
468 BOOL RscDefineList::Remove(){
469 RscDefine * pDef;
471 pDef = RscSubDefList::Remove( (ULONG)0 );
473 if( pDef ){
474 pDef->DefineToNumber();
475 pDef->DecRef();
477 return( NULL != pDef );
480 /*************************************************************************
482 |* RscDefineList::Befor()
484 |* Beschreibung
485 |* Ersterstellung MM 12.11.91
486 |* Letzte Aenderung MM 12.11.91
488 *************************************************************************/
489 BOOL RscDefineList::Befor( const RscDefine * pFree,
490 const RscDefine * pDepend )
492 RscDefine * pDef;
494 pDef = First();
495 while( pDef ){
496 if( pDef == pFree ){
497 pDef = Next();
498 while( pDef ){
499 if( pDef == pDepend )
500 return TRUE;
501 pDef = Next();
504 pDef = Next();
506 return FALSE;
509 /*************************************************************************
511 |* RscDefineList::WriteAll()
513 |* Beschreibung
514 |* Ersterstellung MM 28.10.91
515 |* Letzte Aenderung MM 28.10.91
517 *************************************************************************/
518 void RscDefineList::WriteAll( FILE * fOutput )
520 RscDefine * pDefEle = First();
522 while( pDefEle )
524 fprintf( fOutput, "#define %s %s\n",
525 pDefEle->GetName().GetBuffer(),
526 pDefEle->GetMacro().GetBuffer() );
527 pDefEle = Next();
531 /****************** R s c E x p T y p e **********************************/
532 /*************************************************************************
534 |* RscExpType::Evaluate()
536 |* Beschreibung
537 |* Ersterstellung MM 01.11.91
538 |* Letzte Aenderung MM 01.11.91
540 *************************************************************************/
541 BOOL RscExpType::Evaluate( INT32 * plValue ) const{
542 if( IsDefinition() ){
543 aExp.pDef->Evaluate();
544 // Eventuellen Fehler ignorieren
545 *plValue = aExp.pDef->GetNumber();
547 else if( IsExpression() )
548 return( aExp.pExp->Evaluate( plValue ) );
549 else if( IsNothing() )
550 *plValue = 0;
551 else
552 *plValue = GetLong();
554 return TRUE;
557 /*************************************************************************
559 |* RscExpType::GetMacro()
561 |* Beschreibung
562 |* Ersterstellung MM 01.11.91
563 |* Letzte Aenderung MM 01.11.91
565 *************************************************************************/
566 void RscExpType::GetMacro( ByteString & rStr ) const
568 ByteString aStr;
570 if( IsDefinition() )
572 rStr += aExp.pDef->GetName();
574 else if( IsExpression() )
575 rStr += aExp.pExp->GetMacro();
576 else if( IsNumber() )
577 rStr += ByteString::CreateFromInt32( GetLong() );
581 /****************** R s c E x p r e s s i o n ****************************/
582 /*************************************************************************
584 |* RscExpression::RscExpression()
586 |* Beschreibung
587 |* Ersterstellung MM 01.11.91
588 |* Letzte Aenderung MM 01.11.91
590 *************************************************************************/
591 RscExpression::RscExpression( RscExpType aLE, char cOp, RscExpType aRE )
593 aLeftExp = aLE;
594 cOperation = cOp;
595 aRightExp = aRE;
596 if( aLeftExp.IsDefinition() )
597 aLeftExp.aExp.pDef->IncRef();
598 if( aRightExp.IsDefinition() )
599 aRightExp.aExp.pDef->IncRef();
602 /*************************************************************************
604 |* RscExpression::~RscExpression()
606 |* Beschreibung
607 |* Ersterstellung MM 01.11.91
608 |* Letzte Aenderung MM 01.11.91
610 *************************************************************************/
611 RscExpression::~RscExpression(){
612 if( aLeftExp.IsDefinition() )
613 aLeftExp.aExp.pDef->DecRef();
614 else if( aLeftExp.IsExpression() )
615 delete aLeftExp.aExp.pExp;
617 if( aRightExp.IsDefinition() )
618 aRightExp.aExp.pDef->DecRef();
619 else if( aRightExp.IsExpression() )
620 delete aRightExp.aExp.pExp;
623 /*************************************************************************
625 |* RscExpression::Evaluate()
627 |* Beschreibung
628 |* Ersterstellung MM 01.11.91
629 |* Letzte Aenderung MM 01.11.91
631 *************************************************************************/
632 BOOL RscExpression::Evaluate( INT32 * plValue ){
633 INT32 lLeft;
634 INT32 lRight;
636 // linken und rechten Zweig auswerten
637 if( aLeftExp.Evaluate( &lLeft ) && aRightExp.Evaluate( &lRight ) ){
638 if( cOperation == '&' )
639 *plValue = lLeft & lRight;
640 else if( cOperation == '|' )
641 *plValue = lLeft | lRight;
642 else if( cOperation == '+' )
643 *plValue = lLeft + lRight;
644 else if( cOperation == '-' )
645 *plValue = lLeft - lRight;
646 else if( cOperation == '*' )
647 *plValue = lLeft * lRight;
648 else if( cOperation == 'r' )
649 *plValue = lLeft >> lRight;
650 else if( cOperation == 'l' )
651 *plValue = lLeft << lRight;
652 else{
653 if( 0L == lRight )
654 return FALSE;
655 *plValue = lLeft / lRight;
657 return TRUE;
659 return FALSE;
662 /*************************************************************************
664 |* RscExpression::GetMacro()
666 |* Beschreibung
667 |* Ersterstellung MM 01.11.91
668 |* Letzte Aenderung MM 01.11.91
670 *************************************************************************/
671 ByteString RscExpression::GetMacro()
673 ByteString aLeft;
675 // Ausgabeoptimierung
676 if( aLeftExp.IsNothing() )
678 if ( '-' == cOperation )
680 aLeft += '(';
681 aLeft += '-';
683 aRightExp.GetMacro( aLeft );
684 if( '-' == cOperation )
685 aLeft += ')';
687 else if( aRightExp.IsNothing() )
688 aLeftExp.GetMacro( aLeft );
689 else{
690 aLeft += '(';
691 // linken Zweig auswerten
692 aLeftExp.GetMacro( aLeft );
694 aLeft += cOperation;
696 aLeft += '(';
697 // rechten Zweig auswerten
698 aRightExp.GetMacro( aLeft );
699 aLeft += ')';
701 aLeft += ')';
704 return aLeft;
707 /****************** R s c F i l e ****************************************/
708 /*************************************************************************
710 |* RscFile::RscFile()
712 |* Beschreibung
713 |* Ersterstellung MM 04.11.91
714 |* Letzte Aenderung MM 04.11.91
716 *************************************************************************/
717 RscFile :: RscFile(){
718 bLoaded = FALSE;
719 bIncFile = FALSE;
720 bDirty = FALSE;
721 bScanned = FALSE;
724 /*************************************************************************
726 |* RscFile::~RscFile()
728 |* Beschreibung
729 |* Ersterstellung MM 04.11.91
730 |* Letzte Aenderung MM 04.11.91
732 *************************************************************************/
733 RscFile :: ~RscFile(){
734 RscDepend * pDep = Remove( (ULONG)0 );
736 while( pDep ){
737 delete pDep;
738 pDep = Remove( (ULONG)0 );
741 //von hinten nach vorne ist besser wegen der Abhaengigkeiten
742 //Objekte zerstoeren sich, wenn Referenzzaehler NULL
743 aDefLst.Last();
744 while( aDefLst.Remove() ) ;
747 /*************************************************************************
749 |* RscFile::Depend()
751 |* Beschreibung Diese Methode gibt TRUE zurueck, wenn lDepend
752 |* existiert und hinter lFree steht, oder wenn
753 |* lDepend nicht existiert.
754 |* Ersterstellung MM 12.11.91
755 |* Letzte Aenderung MM 12.11.91
757 *************************************************************************/
758 BOOL RscFile::Depend( ULONG lDepend, ULONG lFree ){
759 RscDepend * pDep;
761 pDep = Last();
762 while( pDep ){
763 if( pDep->GetFileKey() == lDepend ){
764 while( pDep ){
765 if( pDep->GetFileKey() == lFree )
766 return TRUE;
767 pDep = Prev();
769 return FALSE;
771 pDep = Prev();
774 return TRUE;
777 /*************************************************************************
779 |* RscFile::InsertDependFile()
781 |* Beschreibung
782 |* Ersterstellung MM 06.01.92
783 |* Letzte Aenderung MM 06.01.92
785 *************************************************************************/
786 BOOL RscFile :: InsertDependFile( ULONG lIncFile, ULONG lPos )
788 RscDepend * pDep;
790 pDep = First();
791 while( pDep ){
792 if( pDep->GetFileKey() == lIncFile )
793 return TRUE;
794 pDep = Next();
797 // Current-Zeiger steht auf letztem Element
798 if( lPos >= Count() ){ //letztes Element muss immer letztes bleiben
799 // Abhaengigkeit vor der letzten Position eintragen
800 Insert( new RscDepend( lIncFile ) );
802 else
803 Insert( new RscDepend( lIncFile ), lPos );
805 return TRUE;
808 /*************************************************************************
810 |* RscFile::RemoveDependFile()
812 |* Beschreibung
813 |* Ersterstellung MM 18.11.91
814 |* Letzte Aenderung MM 18.11.91
816 *************************************************************************/
817 void RscFile :: RemoveDependFile( ULONG lDepFile )
820 RscDepend * pDep = Last();
822 while( pDep ){
823 if( pDep->GetFileKey() == lDepFile ){
824 Remove( pDep );
825 delete pDep;
827 pDep = Prev();
831 /****************** R s c D e f T r e e **********************************/
832 /*************************************************************************
834 |* RscDefTree::~RscDefTree()
836 |* Beschreibung
837 |* Ersterstellung MM 12.11.91
838 |* Letzte Aenderung MM 12.11.91
840 *************************************************************************/
841 RscDefTree::~RscDefTree(){
842 Remove();
845 /*************************************************************************
847 |* RscDefTree::Remove()
849 |* Beschreibung
850 |* Ersterstellung MM 12.11.91
851 |* Letzte Aenderung MM 12.11.91
853 *************************************************************************/
854 void RscDefTree::Remove(){
855 RscDefine * pDef;
856 while( pDefRoot ){
857 pDef = pDefRoot;
858 pDefRoot = (RscDefine *)pDefRoot->Remove( pDefRoot );
859 pDef->DecRef();
863 /*************************************************************************
865 |* RscDefTree::~Search()
867 |* Beschreibung
868 |* Ersterstellung MM 12.11.91
869 |* Letzte Aenderung MM 12.11.91
871 *************************************************************************/
872 RscDefine * RscDefTree::Search( const char * pName ){
873 if( pDefRoot )
874 return pDefRoot->Search( pName );
875 return NULL;
878 /*************************************************************************
880 |* RscDefTree::Insert()
882 |* Beschreibung
883 |* Ersterstellung MM 12.11.91
884 |* Letzte Aenderung MM 12.11.91
886 *************************************************************************/
887 void RscDefTree::Insert( RscDefine * pDef ){
888 if( pDefRoot )
889 pDefRoot->Insert( pDef );
890 else
891 pDefRoot = pDef;
892 pDef->IncRef();
895 /*************************************************************************
897 |* RscDefTree::Remove()
899 |* Beschreibung
900 |* Ersterstellung MM 12.11.91
901 |* Letzte Aenderung MM 12.11.91
903 *************************************************************************/
904 void RscDefTree::Remove( RscDefine * pDef ){
905 if( pDefRoot ){
906 //falls pDef == pDefRoot
907 pDefRoot = (RscDefine *)pDefRoot->Remove( pDef );
909 pDef->DecRef();
912 /*************************************************************************
914 |* RscDefTree::Evaluate()
916 |* Beschreibung
917 |* Ersterstellung MM 12.11.91
918 |* Letzte Aenderung MM 12.11.91
920 *************************************************************************/
921 BOOL RscDefTree::Evaluate( RscDefine * pDef ){
922 if( pDef ){
923 if( !Evaluate( (RscDefine *)pDef->Left() ) )
924 return FALSE;
925 if( !Evaluate( (RscDefine *)pDef->Right() ) )
926 return FALSE;
928 return TRUE;
931 BOOL RscDefTree::Evaluate(){
932 return Evaluate( pDefRoot );
935 /****************** R s c F i l e T a b **********************************/
936 /*************************************************************************
938 |* RscFileTab::RscFileTab()
940 |* Beschreibung
941 |* Ersterstellung MM 07.11.91
942 |* Letzte Aenderung MM 07.11.91
944 *************************************************************************/
945 RscFileTab::RscFileTab(){
948 /*************************************************************************
950 |* RscFileTab::~RscFileTab()
952 |* Beschreibung
953 |* Ersterstellung MM 04.11.91
954 |* Letzte Aenderung MM 04.11.91
956 *************************************************************************/
957 RscFileTab :: ~RscFileTab(){
958 RscFile * pFile;
960 aDefTree.Remove();
962 pFile = Last();
963 while( pFile ){
964 Remove( GetIndex( pFile ) );
965 delete pFile;
966 pFile = Prev();
970 /*************************************************************************
972 |* RscFileTab::Find()
974 |* Beschreibung
975 |* Ersterstellung MM 16.05.91
976 |* Letzte Aenderung MM 16.05.91
978 *************************************************************************/
979 ULONG RscFileTab :: Find( const ByteString & rName )
981 RscFile * pFName;
983 pFName = First();
984 while( pFName && (pFName->aFileName != rName) )
985 pFName = Next();
987 if( pFName )
988 return( GetIndex( pFName ) );
989 else
990 return( NOFILE_INDEX );
993 /*************************************************************************
995 |* RscFileTab::FindDef()
997 |* Beschreibung
998 |* Ersterstellung MM 30.10.91
999 |* Letzte Aenderung MM 01.11.91
1001 *************************************************************************/
1002 RscDefine * RscFileTab::FindDef( const char * pName ){
1003 return aDefTree.Search( pName );
1006 /*************************************************************************
1008 |* RscFileTab::FindDef()
1010 |* Beschreibung
1011 |* Ersterstellung MM 30.10.91
1012 |* Letzte Aenderung MM 01.11.91
1014 *************************************************************************/
1015 RscDefine * RscFileTab::FindDef( ULONG lFileKey, const ByteString & rName )
1017 RscDefine * pDef = FindDef( rName );
1019 if( pDef )
1020 //befindet sich das DEFINE in einer Include-Datei in der
1021 //Datei lFileKey
1022 if( Depend( lFileKey, pDef->GetFileKey() ) )
1023 return pDef;
1024 return NULL;
1027 /*************************************************************************
1029 |* RscFileTab::Depend()
1031 |* Beschreibung
1032 |* Ersterstellung MM 08.11.91
1033 |* Letzte Aenderung MM 08.11.91
1035 *************************************************************************/
1036 BOOL RscFileTab::Depend( ULONG lDepend, ULONG lFree ){
1037 if( lDepend == lFree )
1038 return TRUE;
1040 RscFile * pFile = First();
1041 while( pFile ){
1042 if( !pFile->IsIncFile() ){
1043 if( !pFile->Depend( lDepend, lFree ) )
1044 return FALSE;
1046 pFile = Next();
1049 return TRUE;
1052 /*************************************************************************
1054 |* RscFileTab::TestDef()
1056 |* Beschreibung
1057 |* Ersterstellung MM 14.01.92
1058 |* Letzte Aenderung MM 14.01.92
1060 *************************************************************************/
1061 BOOL RscFileTab::TestDef( ULONG lFileKey, ULONG lPos,
1062 const RscDefine * pDefDec )
1064 if( lFileKey == pDefDec->GetFileKey() ){
1065 RscFile * pFile = GetFile( pDefDec->GetFileKey() );
1066 if( pFile && (lPos <= pFile->aDefLst.GetPos( (RscDefine *)pDefDec ))
1067 && (lPos != LIST_APPEND) )
1068 return FALSE;
1070 else if( !Depend( lFileKey, pDefDec->GetFileKey() ) )
1071 return FALSE;
1073 return TestDef( lFileKey, lPos, pDefDec->pExp );
1076 /*************************************************************************
1078 |* RscFileTab::TestDef()
1080 |* Beschreibung
1081 |* Ersterstellung MM 14.01.92
1082 |* Letzte Aenderung MM 14.01.92
1084 *************************************************************************/
1085 BOOL RscFileTab::TestDef( ULONG lFileKey, ULONG lPos,
1086 const RscExpression * pExpDec )
1088 if( !pExpDec )
1089 return TRUE;
1091 if( pExpDec->aLeftExp.IsExpression() )
1092 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pExp ) )
1093 return FALSE;
1095 if( pExpDec->aLeftExp.IsDefinition() )
1096 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pDef ) )
1097 return FALSE;
1099 if( pExpDec->aRightExp.IsExpression() )
1100 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pExp ) )
1101 return FALSE;
1103 if( pExpDec->aRightExp.IsDefinition() )
1104 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pDef ) )
1105 return FALSE;
1107 return TRUE;
1110 /*************************************************************************
1112 |* RscFileTab::NewDef()
1114 |* Beschreibung
1115 |* Ersterstellung MM 04.11.91
1116 |* Letzte Aenderung MM 04.11.91
1118 *************************************************************************/
1119 RscDefine * RscFileTab::NewDef( ULONG lFileKey, const ByteString & rDefName,
1120 INT32 lId, ULONG lPos )
1122 RscDefine * pDef = FindDef( rDefName );
1124 if( !pDef ){
1125 RscFile * pFile = GetFile( lFileKey );
1127 if( pFile ){
1128 pDef = pFile->aDefLst.New( lFileKey, rDefName, lId, lPos );
1129 aDefTree.Insert( pDef );
1132 else
1133 pDef = NULL;
1135 return( pDef );
1138 /*************************************************************************
1140 |* RscFileTab::NewDef()
1142 |* Beschreibung
1143 |* Ersterstellung MM 04.11.91
1144 |* Letzte Aenderung MM 04.11.91
1146 *************************************************************************/
1147 RscDefine * RscFileTab::NewDef( ULONG lFileKey, const ByteString & rDefName,
1148 RscExpression * pExp, ULONG lPos )
1150 RscDefine * pDef = FindDef( rDefName );
1152 if( !pDef ){
1153 //Macros in den Expressions sind definiert ?
1154 if( TestDef( lFileKey, lPos, pExp ) ){
1155 RscFile * pFile = GetFile( lFileKey );
1157 if( pFile ){
1158 pDef = pFile->aDefLst.New( lFileKey, rDefName, pExp, lPos );
1159 aDefTree.Insert( pDef );
1163 else
1164 pDef = NULL;
1166 if( !pDef ){
1167 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird
1168 // geloescht werden
1169 delete pExp;
1171 return( pDef );
1174 /*************************************************************************
1176 |* RscFileTab::IsDefUsed()
1178 |* Beschreibung
1179 |* Ersterstellung MM 22.11.91
1180 |* Letzte Aenderung MM 22.11.91
1182 *************************************************************************/
1183 BOOL RscFileTab::IsDefUsed( const ByteString & rDefName )
1185 RscDefine * pDef = FindDef( rDefName );
1187 if( pDef )
1188 return( pDef->GetRefCount() != 2 );
1190 return FALSE;
1193 /*************************************************************************
1195 |* RscFileTab::DeleteDef()
1197 |* Beschreibung
1198 |* Ersterstellung MM 11.11.91
1199 |* Letzte Aenderung MM 11.11.91
1201 *************************************************************************/
1202 void RscFileTab::DeleteDef( const ByteString & rDefName )
1204 RscDefine * pDef = FindDef( rDefName );
1205 RscFile * pFile;
1207 if( pDef ){
1208 pFile = GetFile( pDef->GetFileKey() );
1209 if( pFile ){
1210 aDefTree.Remove( pDef );
1211 pFile->aDefLst.Remove( pDef );
1216 /*************************************************************************
1218 |* RscFileTab::ChangeDef()
1220 |* Beschreibung
1221 |* Ersterstellung MM 04.11.91
1222 |* Letzte Aenderung MM 11.11.91
1224 *************************************************************************/
1225 BOOL RscFileTab::ChangeDef( const ByteString & rDefName, INT32 lId )
1227 RscDefine * pDef = FindDef( rDefName );
1229 if( pDef ){
1230 pDef->ChangeMacro( lId );
1231 //alle Macros neu bewerten
1232 return aDefTree.Evaluate();
1234 return( FALSE );
1237 /*************************************************************************
1239 |* RscFileTab::ChangeDef()
1241 |* Beschreibung
1242 |* Ersterstellung MM 04.11.91
1243 |* Letzte Aenderung MM 11.11.91
1245 *************************************************************************/
1246 BOOL RscFileTab::ChangeDef( const ByteString & rDefName,
1247 RscExpression * pExp )
1249 RscDefine * pDef = FindDef( rDefName );
1250 RscFile * pFile;
1251 ULONG lPos = 0;
1253 if( pDef ){
1254 pFile = GetFile( pDef->GetFileKey() );
1255 if( pFile )
1256 lPos = pFile->aDefLst.GetPos( pDef );
1257 //Macros in den Expressions sind definiert ?
1258 if( TestDef( pDef->GetFileKey(), lPos, pExp ) ){
1259 pDef->ChangeMacro( pExp );
1260 //alle Macros neu bewerten
1261 return aDefTree.Evaluate();
1265 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird
1266 // geloescht werden
1267 delete pExp;
1269 return( FALSE );
1272 /*************************************************************************
1274 |* RscFileTab::ChangeDefName()
1276 |* Beschreibung
1277 |* Ersterstellung MM 04.11.91
1278 |* Letzte Aenderung MM 04.11.91
1280 *************************************************************************/
1281 BOOL RscFileTab::ChangeDefName( const ByteString & rDefName,
1282 const ByteString & rNewName )
1284 RscDefine * pDef = FindDef( rDefName );
1286 //Name gefunden ?
1287 if( pDef ){
1288 // und neuer Name noch nicht bekannt ?
1289 if( !FindDef( pDef->GetFileKey(), rNewName ) ){
1290 aDefTree.Remove( pDef );
1291 pDef->SetName( rNewName );
1292 aDefTree.Insert( pDef );
1293 return( TRUE );
1297 return( FALSE );
1300 /*************************************************************************
1302 |* RscFileTab::DeleteFileContext()
1304 |* Beschreibung
1305 |* Ersterstellung MM 09.12.91
1306 |* Letzte Aenderung MM 09.12.91
1308 *************************************************************************/
1309 void RscFileTab :: DeleteFileContext( ULONG lFileKey ){
1310 RscFile * pFName;
1312 pFName = GetFile( lFileKey );
1313 if( pFName ){
1314 RscDefine * pDef;
1316 pDef = pFName->aDefLst.First();
1317 while( pDef ){
1318 aDefTree.Remove( pDef );
1319 pDef = pFName->aDefLst.Next();
1321 while( pFName->aDefLst.Remove( (ULONG)0 ) ) ;
1325 /*************************************************************************
1327 |* RscFileTab::DeleteFile()
1329 |* Beschreibung
1330 |* Ersterstellung MM 16.05.91
1331 |* Letzte Aenderung MM 16.05.91
1333 *************************************************************************/
1334 void RscFileTab :: DeleteFile( ULONG lFileKey ){
1335 RscFile * pFName;
1337 //Defines freigeben
1338 DeleteFileContext( lFileKey );
1340 //Schleife ueber alle Abhaengigkeiten
1341 pFName = First();
1342 while( pFName ){
1343 pFName->RemoveDependFile( lFileKey );
1344 pFName = Next();
1347 pFName = Remove( lFileKey );
1348 if( pFName )
1349 delete pFName;
1352 /*************************************************************************
1354 |* RscFileTab::NewCodeFile()
1356 |* Beschreibung
1357 |* Ersterstellung MM 16.05.91
1358 |* Letzte Aenderung MM 16.05.91
1360 *************************************************************************/
1361 ULONG RscFileTab :: NewCodeFile( const ByteString & rName )
1363 ULONG lKey;
1364 RscFile * pFName;
1366 lKey = Find( rName );
1367 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey )
1369 pFName = new RscFile();
1370 pFName->aFileName = rName;
1371 pFName->aPathName = rName;
1372 lKey = Insert( pFName );
1373 pFName->InsertDependFile( lKey, LIST_APPEND );
1375 return lKey;
1378 /*************************************************************************
1380 |* RscFileTab::NewIncFile()
1382 |* Beschreibung
1383 |* Ersterstellung MM 16.05.91
1384 |* Letzte Aenderung MM 16.05.91
1386 *************************************************************************/
1387 ULONG RscFileTab :: NewIncFile( const ByteString & rName,
1388 const ByteString & rPath )
1390 ULONG lKey;
1391 RscFile * pFName;
1393 lKey = Find( rName );
1394 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey )
1396 pFName = new RscFile();
1397 pFName->aFileName = rName;
1398 pFName->aPathName = rPath;
1399 pFName->SetIncFlag();
1400 lKey = Insert( pFName );
1401 pFName->InsertDependFile( lKey, LIST_APPEND );
1403 return lKey;