CWS-TOOLING: integrate CWS os146
[LibreOffice.git] / rsc / source / tools / rscdef.cxx
blob6231bbd92aae70060e47bb0a41ed6e16b52f59df
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
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.
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).
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.
26 ************************************************************************/
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 **************************************/
32 // Programmuebergreifende Includes.
33 #include <rscdef.hxx>
35 /****************** C o d e **********************************************/
36 /****************** R s c I d ********************************************/
37 sal_Bool RscId::bNames = sal_True;
39 /*************************************************************************
41 |* static RscId::SetNames
42 |* static RscId::SetNoNames
44 |* Beschreibung
45 |* Ersterstellung MM 26.06.91
46 |* Letzte Aenderung MM 26.06.91
48 *************************************************************************/
49 void RscId::SetNames( sal_Bool bSet ) { bNames = bSet; }
50 sal_Bool RscId::IsSetNames() { return bNames; }
52 /*************************************************************************
54 |* RscId::GetNumber
56 |* Beschreibung
57 |* Ersterstellung MM 17.05.91
58 |* Letzte Aenderung MM 17.05.91
60 *************************************************************************/
61 sal_Int32 RscId::GetNumber() const{
62 sal_Int32 lVal;
63 aExp.Evaluate( &lVal );
64 return lVal;
67 /*************************************************************************
69 |* RscId::Create()
71 |* Beschreibung
72 |* Ersterstellung MM 01.11.91
73 |* Letzte Aenderung MM 01.11.91
75 *************************************************************************/
76 void RscId::Create( const RscExpType & rExpType )
78 aExp = rExpType;
79 if( aExp.IsDefinition() )
80 aExp.aExp.pDef->IncRef();
81 else if( aExp.IsExpression() ){
82 sal_Int32 lValue;
84 aExp.Evaluate( &lValue );
85 aExp.SetLong( lValue );
89 /*************************************************************************
91 |* RscId::Destroy()
93 |* Beschreibung
94 |* Ersterstellung MM 01.11.91
95 |* Letzte Aenderung MM 01.11.91
97 *************************************************************************/
98 void RscId::Destroy(){
99 if( aExp.IsDefinition() )
100 aExp.aExp.pDef->DecRef();
101 aExp.cType = RSCEXP_NOTHING;
104 /*************************************************************************
106 |* RscId::RscId()
108 |* Beschreibung
109 |* Ersterstellung MM 01.11.91
110 |* Letzte Aenderung MM 01.11.91
112 *************************************************************************/
113 RscId::RscId( const RscId& rRscId ){
114 aExp = rRscId.aExp;
115 if( aExp.IsDefinition() )
116 aExp.aExp.pDef->IncRef();
119 /*************************************************************************
121 |* RscId::RscId()
123 |* Beschreibung
124 |* Ersterstellung MM 01.11.91
125 |* Letzte Aenderung MM 25.11.91
127 *************************************************************************/
128 RscId::RscId( RscDefine * pDef ){
129 RscExpType aExpType;
131 aExpType.aExp.pDef = pDef;
132 aExpType.cType = RSCEXP_DEF;
133 Create( aExpType );
136 /*************************************************************************
138 |* RscId:: =
140 |* Beschreibung
141 |* Ersterstellung MM 01.11.91
142 |* Letzte Aenderung MM 01.11.91
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;
153 /*************************************************************************
155 |* RscId::operator ==
157 |* Beschreibung
158 |* Ersterstellung MM 16.05.91
159 |* Letzte Aenderung MM 16.05.91
161 *************************************************************************/
162 sal_Bool RscId::operator == ( const RscId& rRscId ) const
164 return( GetNumber() == rRscId.GetNumber() );
167 /*************************************************************************
169 |* RscId::operator <
171 |* Beschreibung
172 |* Ersterstellung MM 16.05.91
173 |* Letzte Aenderung MM 16.05.91
175 *************************************************************************/
176 sal_Bool RscId::operator < ( const RscId& rRscId ) const
178 return( GetNumber() < rRscId.GetNumber() );
181 /*************************************************************************
183 |* RscId::operator >
185 |* Beschreibung
186 |* Ersterstellung MM 16.05.91
187 |* Letzte Aenderung MM 16.05.91
189 *************************************************************************/
190 sal_Bool RscId::operator > ( const RscId& rRscId ) const
192 return( GetNumber() > rRscId.GetNumber() );
195 /*************************************************************************
197 |* RscId::sal_Int32()
199 |* Beschreibung
200 |* Ersterstellung MM 16.05.91
201 |* Letzte Aenderung MM 16.05.91
203 *************************************************************************/
204 RscId::operator sal_Int32() const
206 return( GetNumber() );
209 /*************************************************************************
211 |* RscId::GetNames()
213 |* Beschreibung
214 |* Ersterstellung MM 16.05.91
215 |* Letzte Aenderung MM 25.11.91
217 *************************************************************************/
218 ByteString RscId::GetName() const
220 ByteString aStr;
222 if ( !aExp.IsNothing() )
224 if( bNames )
225 aExp.GetMacro( aStr );
226 else
227 aStr = ByteString::CreateFromInt32( GetNumber() );
230 return aStr;
233 /*************************************************************************
235 |* RscId::GetMacro()
237 |* Beschreibung
238 |* Ersterstellung MM 01.11.91
239 |* Letzte Aenderung MM 25.11.91
241 *************************************************************************/
242 ByteString RscId::GetMacro() const
244 ByteString aStr;
246 if ( aExp.IsDefinition() )
247 aStr = aExp.aExp.pDef->GetMacro();
248 else
249 aExp.GetMacro( aStr );
251 return aStr;
254 /****************** R s c D e f i n e ************************************/
255 /*************************************************************************
257 |* RscDefine::RscDefine()
259 |* Beschreibung
260 |* Ersterstellung MM 01.11.91
261 |* Letzte Aenderung MM 01.11.91
263 *************************************************************************/
264 RscDefine::RscDefine( sal_uLong lKey, const ByteString & rDefName, sal_Int32 lDefId )
265 : StringNode( rDefName )
267 nRefCount = 0;
268 lFileKey = lKey;
269 lId = lDefId;
270 pExp = NULL;
273 RscDefine::RscDefine( sal_uLong lKey, const ByteString & rDefName,
274 RscExpression * pExpression )
275 : StringNode( rDefName )
277 nRefCount = 0;
278 lFileKey = lKey;
279 pExpression->Evaluate( &lId );
280 pExp = pExpression;
283 /*************************************************************************
285 |* RscDefine::~RscDefine()
287 |* Beschreibung
288 |* Ersterstellung MM 01.11.91
289 |* Letzte Aenderung MM 01.11.91
291 *************************************************************************/
292 RscDefine::~RscDefine(){
293 if( pExp )
294 delete pExp;
295 if( nRefCount )
296 RscExit( 14 );
299 /*************************************************************************
301 |* RscDefine::DecRef()
303 |* Beschreibung
304 |* Ersterstellung MM 01.11.91
305 |* Letzte Aenderung MM 01.11.91
307 *************************************************************************/
308 void RscDefine::DecRef(){
309 nRefCount--;
310 if( 0 == nRefCount ){
311 delete this;
315 /*************************************************************************
317 |* RscDefine::DefineToNumber()
319 |* Beschreibung
320 |* Ersterstellung MM 07.11.91
321 |* Letzte Aenderung MM 07.11.91
323 *************************************************************************/
324 void RscDefine::DefineToNumber()
326 if( pExp )
327 delete pExp;
328 pExp = NULL;
329 SetName( ByteString::CreateFromInt32( lId ) );
332 /*************************************************************************
334 |* RscDefine::ChangeMacro()
336 |* Beschreibung
337 |* Ersterstellung MM 04.11.91
338 |* Letzte Aenderung MM 04.11.91
340 *************************************************************************/
341 void RscDefine::ChangeMacro( RscExpression * pExpression ){
342 if( pExp )
343 delete pExp;
344 pExp = pExpression;
345 pExp->Evaluate( &lId );
348 void RscDefine::ChangeMacro( sal_Int32 lIdentifier ){
349 if( pExp ){
350 delete pExp;
351 pExp = NULL;
353 lId = lIdentifier;
356 /*************************************************************************
358 |* RscDefine::Evaluate()
360 |* Beschreibung
361 |* Ersterstellung MM 01.11.91
362 |* Letzte Aenderung MM 01.11.91
364 *************************************************************************/
365 sal_Bool RscDefine::Evaluate(){
366 sal_Bool bRet = sal_True;
368 if( pExp )
369 bRet = !pExp->Evaluate( &lId );
371 return bRet;
374 /*************************************************************************
376 |* RscDefine::Search()
378 |* Beschreibung
379 |* Ersterstellung MM 11.11.91
380 |* Letzte Aenderung MM 11.11.91
382 *************************************************************************/
383 RscDefine * RscDefine::Search( const char * pStr ){
384 return (RscDefine *)StringNode::Search( pStr );
387 /*************************************************************************
389 |* RscDefine::GetMacro()
391 |* Beschreibung
392 |* Ersterstellung MM 01.11.91
393 |* Letzte Aenderung MM 01.11.91
395 *************************************************************************/
396 ByteString RscDefine::GetMacro()
398 if( pExp )
399 return pExp->GetMacro();
400 return ByteString::CreateFromInt32( lId );
403 /****************** R s c D e f i n e L i s t ****************************/
404 /*************************************************************************
406 |* RscDefineList::New()
408 |* Beschreibung
409 |* Ersterstellung MM 04.11.91
410 |* Letzte Aenderung MM 04.11.91
412 *************************************************************************/
413 RscDefine * RscDefineList::New( sal_uLong lFileKey, const ByteString & rDefName,
414 sal_Int32 lDefId, sal_uLong lPos )
416 RscDefine * pDef;
418 pDef = new RscDefine( lFileKey, rDefName, lDefId );
419 pDef->IncRef();
420 Insert( pDef, lPos );
421 return pDef;
424 RscDefine * RscDefineList::New( sal_uLong lFileKey, const ByteString & rDefName,
425 RscExpression * pExpression, sal_uLong lPos )
427 RscDefine * pDef;
429 pDef = new RscDefine( lFileKey, rDefName, pExpression );
430 pDef->IncRef();
431 Insert( pDef, lPos );
433 return pDef;
436 /*************************************************************************
438 |* RscDefineList::Remove()
440 |* Beschreibung
441 |* Ersterstellung MM 04.11.91
442 |* Letzte Aenderung MM 04.11.91
444 *************************************************************************/
445 sal_Bool RscDefineList::Remove( RscDefine * pDef ){
446 pDef = RscSubDefList::Remove( pDef );
447 if( pDef ){
448 pDef->DefineToNumber();
449 pDef->DecRef();
452 return( NULL != pDef );
455 sal_Bool RscDefineList::Remove( sal_uLong lIndex ){
456 RscDefine * pDef = RscSubDefList::Remove( lIndex );
457 if( pDef ){
458 pDef->DefineToNumber();
459 pDef->DecRef();
462 return( NULL != pDef );
465 sal_Bool RscDefineList::Remove(){
466 RscDefine * pDef;
468 pDef = RscSubDefList::Remove( (sal_uLong)0 );
470 if( pDef ){
471 pDef->DefineToNumber();
472 pDef->DecRef();
474 return( NULL != pDef );
477 /*************************************************************************
479 |* RscDefineList::Befor()
481 |* Beschreibung
482 |* Ersterstellung MM 12.11.91
483 |* Letzte Aenderung MM 12.11.91
485 *************************************************************************/
486 sal_Bool RscDefineList::Befor( const RscDefine * pFree,
487 const RscDefine * pDepend )
489 RscDefine * pDef;
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();
501 pDef = Next();
503 return sal_False;
506 /*************************************************************************
508 |* RscDefineList::WriteAll()
510 |* Beschreibung
511 |* Ersterstellung MM 28.10.91
512 |* Letzte Aenderung MM 28.10.91
514 *************************************************************************/
515 void RscDefineList::WriteAll( FILE * fOutput )
517 RscDefine * pDefEle = First();
519 while( pDefEle )
521 fprintf( fOutput, "#define %s %s\n",
522 pDefEle->GetName().GetBuffer(),
523 pDefEle->GetMacro().GetBuffer() );
524 pDefEle = Next();
528 /****************** R s c E x p T y p e **********************************/
529 /*************************************************************************
531 |* RscExpType::Evaluate()
533 |* Beschreibung
534 |* Ersterstellung MM 01.11.91
535 |* Letzte Aenderung MM 01.11.91
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();
544 else if( IsExpression() )
545 return( aExp.pExp->Evaluate( plValue ) );
546 else if( IsNothing() )
547 *plValue = 0;
548 else
549 *plValue = GetLong();
551 return sal_True;
554 /*************************************************************************
556 |* RscExpType::GetMacro()
558 |* Beschreibung
559 |* Ersterstellung MM 01.11.91
560 |* Letzte Aenderung MM 01.11.91
562 *************************************************************************/
563 void RscExpType::GetMacro( ByteString & rStr ) const
565 ByteString aStr;
567 if( IsDefinition() )
569 rStr += aExp.pDef->GetName();
571 else if( IsExpression() )
572 rStr += aExp.pExp->GetMacro();
573 else if( IsNumber() )
574 rStr += ByteString::CreateFromInt32( GetLong() );
578 /****************** R s c E x p r e s s i o n ****************************/
579 /*************************************************************************
581 |* RscExpression::RscExpression()
583 |* Beschreibung
584 |* Ersterstellung MM 01.11.91
585 |* Letzte Aenderung MM 01.11.91
587 *************************************************************************/
588 RscExpression::RscExpression( RscExpType aLE, char cOp, RscExpType aRE )
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();
599 /*************************************************************************
601 |* RscExpression::~RscExpression()
603 |* Beschreibung
604 |* Ersterstellung MM 01.11.91
605 |* Letzte Aenderung MM 01.11.91
607 *************************************************************************/
608 RscExpression::~RscExpression(){
609 if( aLeftExp.IsDefinition() )
610 aLeftExp.aExp.pDef->DecRef();
611 else if( aLeftExp.IsExpression() )
612 delete aLeftExp.aExp.pExp;
614 if( aRightExp.IsDefinition() )
615 aRightExp.aExp.pDef->DecRef();
616 else if( aRightExp.IsExpression() )
617 delete aRightExp.aExp.pExp;
620 /*************************************************************************
622 |* RscExpression::Evaluate()
624 |* Beschreibung
625 |* Ersterstellung MM 01.11.91
626 |* Letzte Aenderung MM 01.11.91
628 *************************************************************************/
629 sal_Bool RscExpression::Evaluate( sal_Int32 * plValue ){
630 sal_Int32 lLeft;
631 sal_Int32 lRight;
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;
654 return sal_True;
656 return sal_False;
659 /*************************************************************************
661 |* RscExpression::GetMacro()
663 |* Beschreibung
664 |* Ersterstellung MM 01.11.91
665 |* Letzte Aenderung MM 01.11.91
667 *************************************************************************/
668 ByteString RscExpression::GetMacro()
670 ByteString aLeft;
672 // Ausgabeoptimierung
673 if( aLeftExp.IsNothing() )
675 if ( '-' == cOperation )
677 aLeft += '(';
678 aLeft += '-';
680 aRightExp.GetMacro( aLeft );
681 if( '-' == cOperation )
682 aLeft += ')';
684 else if( aRightExp.IsNothing() )
685 aLeftExp.GetMacro( aLeft );
686 else{
687 aLeft += '(';
688 // linken Zweig auswerten
689 aLeftExp.GetMacro( aLeft );
691 aLeft += cOperation;
693 aLeft += '(';
694 // rechten Zweig auswerten
695 aRightExp.GetMacro( aLeft );
696 aLeft += ')';
698 aLeft += ')';
701 return aLeft;
704 /****************** R s c F i l e ****************************************/
705 /*************************************************************************
707 |* RscFile::RscFile()
709 |* Beschreibung
710 |* Ersterstellung MM 04.11.91
711 |* Letzte Aenderung MM 04.11.91
713 *************************************************************************/
714 RscFile :: RscFile(){
715 bLoaded = sal_False;
716 bIncFile = sal_False;
717 bDirty = sal_False;
718 bScanned = sal_False;
721 /*************************************************************************
723 |* RscFile::~RscFile()
725 |* Beschreibung
726 |* Ersterstellung MM 04.11.91
727 |* Letzte Aenderung MM 04.11.91
729 *************************************************************************/
730 RscFile :: ~RscFile(){
731 RscDepend * pDep = Remove( (sal_uLong)0 );
733 while( pDep ){
734 delete pDep;
735 pDep = Remove( (sal_uLong)0 );
738 //von hinten nach vorne ist besser wegen der Abhaengigkeiten
739 //Objekte zerstoeren sich, wenn Referenzzaehler NULL
740 aDefLst.Last();
741 while( aDefLst.Remove() ) ;
744 /*************************************************************************
746 |* RscFile::Depend()
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
754 *************************************************************************/
755 sal_Bool RscFile::Depend( sal_uLong lDepend, sal_uLong lFree ){
756 RscDepend * pDep;
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();
766 return sal_False;
768 pDep = Prev();
771 return sal_True;
774 /*************************************************************************
776 |* RscFile::InsertDependFile()
778 |* Beschreibung
779 |* Ersterstellung MM 06.01.92
780 |* Letzte Aenderung MM 06.01.92
782 *************************************************************************/
783 sal_Bool RscFile :: InsertDependFile( sal_uLong lIncFile, sal_uLong lPos )
785 RscDepend * pDep;
787 pDep = First();
788 while( pDep ){
789 if( pDep->GetFileKey() == lIncFile )
790 return sal_True;
791 pDep = Next();
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 ) );
799 else
800 Insert( new RscDepend( lIncFile ), lPos );
802 return sal_True;
805 /*************************************************************************
807 |* RscFile::RemoveDependFile()
809 |* Beschreibung
810 |* Ersterstellung MM 18.11.91
811 |* Letzte Aenderung MM 18.11.91
813 *************************************************************************/
814 void RscFile :: RemoveDependFile( sal_uLong lDepFile )
817 RscDepend * pDep = Last();
819 while( pDep ){
820 if( pDep->GetFileKey() == lDepFile ){
821 Remove( pDep );
822 delete pDep;
824 pDep = Prev();
828 /****************** R s c D e f T r e e **********************************/
829 /*************************************************************************
831 |* RscDefTree::~RscDefTree()
833 |* Beschreibung
834 |* Ersterstellung MM 12.11.91
835 |* Letzte Aenderung MM 12.11.91
837 *************************************************************************/
838 RscDefTree::~RscDefTree(){
839 Remove();
842 /*************************************************************************
844 |* RscDefTree::Remove()
846 |* Beschreibung
847 |* Ersterstellung MM 12.11.91
848 |* Letzte Aenderung MM 12.11.91
850 *************************************************************************/
851 void RscDefTree::Remove(){
852 RscDefine * pDef;
853 while( pDefRoot ){
854 pDef = pDefRoot;
855 pDefRoot = (RscDefine *)pDefRoot->Remove( pDefRoot );
856 pDef->DecRef();
860 /*************************************************************************
862 |* RscDefTree::~Search()
864 |* Beschreibung
865 |* Ersterstellung MM 12.11.91
866 |* Letzte Aenderung MM 12.11.91
868 *************************************************************************/
869 RscDefine * RscDefTree::Search( const char * pName ){
870 if( pDefRoot )
871 return pDefRoot->Search( pName );
872 return NULL;
875 /*************************************************************************
877 |* RscDefTree::Insert()
879 |* Beschreibung
880 |* Ersterstellung MM 12.11.91
881 |* Letzte Aenderung MM 12.11.91
883 *************************************************************************/
884 void RscDefTree::Insert( RscDefine * pDef ){
885 if( pDefRoot )
886 pDefRoot->Insert( pDef );
887 else
888 pDefRoot = pDef;
889 pDef->IncRef();
892 /*************************************************************************
894 |* RscDefTree::Remove()
896 |* Beschreibung
897 |* Ersterstellung MM 12.11.91
898 |* Letzte Aenderung MM 12.11.91
900 *************************************************************************/
901 void RscDefTree::Remove( RscDefine * pDef ){
902 if( pDefRoot ){
903 //falls pDef == pDefRoot
904 pDefRoot = (RscDefine *)pDefRoot->Remove( pDef );
906 pDef->DecRef();
909 /*************************************************************************
911 |* RscDefTree::Evaluate()
913 |* Beschreibung
914 |* Ersterstellung MM 12.11.91
915 |* Letzte Aenderung MM 12.11.91
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;
925 return sal_True;
928 sal_Bool RscDefTree::Evaluate(){
929 return Evaluate( pDefRoot );
932 /****************** R s c F i l e T a b **********************************/
933 /*************************************************************************
935 |* RscFileTab::RscFileTab()
937 |* Beschreibung
938 |* Ersterstellung MM 07.11.91
939 |* Letzte Aenderung MM 07.11.91
941 *************************************************************************/
942 RscFileTab::RscFileTab(){
945 /*************************************************************************
947 |* RscFileTab::~RscFileTab()
949 |* Beschreibung
950 |* Ersterstellung MM 04.11.91
951 |* Letzte Aenderung MM 04.11.91
953 *************************************************************************/
954 RscFileTab :: ~RscFileTab(){
955 RscFile * pFile;
957 aDefTree.Remove();
959 pFile = Last();
960 while( pFile ){
961 Remove( GetIndex( pFile ) );
962 delete pFile;
963 pFile = Prev();
967 /*************************************************************************
969 |* RscFileTab::Find()
971 |* Beschreibung
972 |* Ersterstellung MM 16.05.91
973 |* Letzte Aenderung MM 16.05.91
975 *************************************************************************/
976 sal_uLong RscFileTab :: Find( const ByteString & rName )
978 RscFile * pFName;
980 pFName = First();
981 while( pFName && (pFName->aFileName != rName) )
982 pFName = Next();
984 if( pFName )
985 return( GetIndex( pFName ) );
986 else
987 return( NOFILE_INDEX );
990 /*************************************************************************
992 |* RscFileTab::FindDef()
994 |* Beschreibung
995 |* Ersterstellung MM 30.10.91
996 |* Letzte Aenderung MM 01.11.91
998 *************************************************************************/
999 RscDefine * RscFileTab::FindDef( const char * pName ){
1000 return aDefTree.Search( pName );
1003 /*************************************************************************
1005 |* RscFileTab::FindDef()
1007 |* Beschreibung
1008 |* Ersterstellung MM 30.10.91
1009 |* Letzte Aenderung MM 01.11.91
1011 *************************************************************************/
1012 RscDefine * RscFileTab::FindDef( sal_uLong lFileKey, const ByteString & rName )
1014 RscDefine * pDef = FindDef( rName );
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;
1024 /*************************************************************************
1026 |* RscFileTab::Depend()
1028 |* Beschreibung
1029 |* Ersterstellung MM 08.11.91
1030 |* Letzte Aenderung MM 08.11.91
1032 *************************************************************************/
1033 sal_Bool RscFileTab::Depend( sal_uLong lDepend, sal_uLong lFree ){
1034 if( lDepend == lFree )
1035 return sal_True;
1037 RscFile * pFile = First();
1038 while( pFile ){
1039 if( !pFile->IsIncFile() ){
1040 if( !pFile->Depend( lDepend, lFree ) )
1041 return sal_False;
1043 pFile = Next();
1046 return sal_True;
1049 /*************************************************************************
1051 |* RscFileTab::TestDef()
1053 |* Beschreibung
1054 |* Ersterstellung MM 14.01.92
1055 |* Letzte Aenderung MM 14.01.92
1057 *************************************************************************/
1058 sal_Bool RscFileTab::TestDef( sal_uLong lFileKey, sal_uLong lPos,
1059 const RscDefine * pDefDec )
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;
1067 else if( !Depend( lFileKey, pDefDec->GetFileKey() ) )
1068 return sal_False;
1070 return TestDef( lFileKey, lPos, pDefDec->pExp );
1073 /*************************************************************************
1075 |* RscFileTab::TestDef()
1077 |* Beschreibung
1078 |* Ersterstellung MM 14.01.92
1079 |* Letzte Aenderung MM 14.01.92
1081 *************************************************************************/
1082 sal_Bool RscFileTab::TestDef( sal_uLong lFileKey, sal_uLong lPos,
1083 const RscExpression * pExpDec )
1085 if( !pExpDec )
1086 return sal_True;
1088 if( pExpDec->aLeftExp.IsExpression() )
1089 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pExp ) )
1090 return sal_False;
1092 if( pExpDec->aLeftExp.IsDefinition() )
1093 if( !TestDef( lFileKey, lPos, pExpDec->aLeftExp.aExp.pDef ) )
1094 return sal_False;
1096 if( pExpDec->aRightExp.IsExpression() )
1097 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pExp ) )
1098 return sal_False;
1100 if( pExpDec->aRightExp.IsDefinition() )
1101 if( !TestDef( lFileKey, lPos, pExpDec->aRightExp.aExp.pDef ) )
1102 return sal_False;
1104 return sal_True;
1107 /*************************************************************************
1109 |* RscFileTab::NewDef()
1111 |* Beschreibung
1112 |* Ersterstellung MM 04.11.91
1113 |* Letzte Aenderung MM 04.11.91
1115 *************************************************************************/
1116 RscDefine * RscFileTab::NewDef( sal_uLong lFileKey, const ByteString & rDefName,
1117 sal_Int32 lId, sal_uLong lPos )
1119 RscDefine * pDef = FindDef( rDefName );
1121 if( !pDef ){
1122 RscFile * pFile = GetFile( lFileKey );
1124 if( pFile ){
1125 pDef = pFile->aDefLst.New( lFileKey, rDefName, lId, lPos );
1126 aDefTree.Insert( pDef );
1129 else
1130 pDef = NULL;
1132 return( pDef );
1135 /*************************************************************************
1137 |* RscFileTab::NewDef()
1139 |* Beschreibung
1140 |* Ersterstellung MM 04.11.91
1141 |* Letzte Aenderung MM 04.11.91
1143 *************************************************************************/
1144 RscDefine * RscFileTab::NewDef( sal_uLong lFileKey, const ByteString & rDefName,
1145 RscExpression * pExp, sal_uLong lPos )
1147 RscDefine * pDef = FindDef( rDefName );
1149 if( !pDef ){
1150 //Macros in den Expressions sind definiert ?
1151 if( TestDef( lFileKey, lPos, pExp ) ){
1152 RscFile * pFile = GetFile( lFileKey );
1154 if( pFile ){
1155 pDef = pFile->aDefLst.New( lFileKey, rDefName, pExp, lPos );
1156 aDefTree.Insert( pDef );
1160 else
1161 pDef = NULL;
1163 if( !pDef ){
1164 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird
1165 // geloescht werden
1166 delete pExp;
1168 return( pDef );
1171 /*************************************************************************
1173 |* RscFileTab::IsDefUsed()
1175 |* Beschreibung
1176 |* Ersterstellung MM 22.11.91
1177 |* Letzte Aenderung MM 22.11.91
1179 *************************************************************************/
1180 sal_Bool RscFileTab::IsDefUsed( const ByteString & rDefName )
1182 RscDefine * pDef = FindDef( rDefName );
1184 if( pDef )
1185 return( pDef->GetRefCount() != 2 );
1187 return sal_False;
1190 /*************************************************************************
1192 |* RscFileTab::DeleteDef()
1194 |* Beschreibung
1195 |* Ersterstellung MM 11.11.91
1196 |* Letzte Aenderung MM 11.11.91
1198 *************************************************************************/
1199 void RscFileTab::DeleteDef( const ByteString & rDefName )
1201 RscDefine * pDef = FindDef( rDefName );
1202 RscFile * pFile;
1204 if( pDef ){
1205 pFile = GetFile( pDef->GetFileKey() );
1206 if( pFile ){
1207 aDefTree.Remove( pDef );
1208 pFile->aDefLst.Remove( pDef );
1213 /*************************************************************************
1215 |* RscFileTab::ChangeDef()
1217 |* Beschreibung
1218 |* Ersterstellung MM 04.11.91
1219 |* Letzte Aenderung MM 11.11.91
1221 *************************************************************************/
1222 sal_Bool RscFileTab::ChangeDef( const ByteString & rDefName, sal_Int32 lId )
1224 RscDefine * pDef = FindDef( rDefName );
1226 if( pDef ){
1227 pDef->ChangeMacro( lId );
1228 //alle Macros neu bewerten
1229 return aDefTree.Evaluate();
1231 return( sal_False );
1234 /*************************************************************************
1236 |* RscFileTab::ChangeDef()
1238 |* Beschreibung
1239 |* Ersterstellung MM 04.11.91
1240 |* Letzte Aenderung MM 11.11.91
1242 *************************************************************************/
1243 sal_Bool RscFileTab::ChangeDef( const ByteString & rDefName,
1244 RscExpression * pExp )
1246 RscDefine * pDef = FindDef( rDefName );
1247 RscFile * pFile;
1248 sal_uLong lPos = 0;
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();
1262 // pExp wird immer Eigentum und muss, wenn es nicht benoetigt wird
1263 // geloescht werden
1264 delete pExp;
1266 return( sal_False );
1269 /*************************************************************************
1271 |* RscFileTab::ChangeDefName()
1273 |* Beschreibung
1274 |* Ersterstellung MM 04.11.91
1275 |* Letzte Aenderung MM 04.11.91
1277 *************************************************************************/
1278 sal_Bool RscFileTab::ChangeDefName( const ByteString & rDefName,
1279 const ByteString & rNewName )
1281 RscDefine * pDef = FindDef( rDefName );
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 );
1294 return( sal_False );
1297 /*************************************************************************
1299 |* RscFileTab::DeleteFileContext()
1301 |* Beschreibung
1302 |* Ersterstellung MM 09.12.91
1303 |* Letzte Aenderung MM 09.12.91
1305 *************************************************************************/
1306 void RscFileTab :: DeleteFileContext( sal_uLong lFileKey ){
1307 RscFile * pFName;
1309 pFName = GetFile( lFileKey );
1310 if( pFName ){
1311 RscDefine * pDef;
1313 pDef = pFName->aDefLst.First();
1314 while( pDef ){
1315 aDefTree.Remove( pDef );
1316 pDef = pFName->aDefLst.Next();
1318 while( pFName->aDefLst.Remove( (sal_uLong)0 ) ) ;
1322 /*************************************************************************
1324 |* RscFileTab::DeleteFile()
1326 |* Beschreibung
1327 |* Ersterstellung MM 16.05.91
1328 |* Letzte Aenderung MM 16.05.91
1330 *************************************************************************/
1331 void RscFileTab :: DeleteFile( sal_uLong lFileKey ){
1332 RscFile * pFName;
1334 //Defines freigeben
1335 DeleteFileContext( lFileKey );
1337 //Schleife ueber alle Abhaengigkeiten
1338 pFName = First();
1339 while( pFName ){
1340 pFName->RemoveDependFile( lFileKey );
1341 pFName = Next();
1344 pFName = Remove( lFileKey );
1345 if( pFName )
1346 delete pFName;
1349 /*************************************************************************
1351 |* RscFileTab::NewCodeFile()
1353 |* Beschreibung
1354 |* Ersterstellung MM 16.05.91
1355 |* Letzte Aenderung MM 16.05.91
1357 *************************************************************************/
1358 sal_uLong RscFileTab :: NewCodeFile( const ByteString & rName )
1360 sal_uLong lKey;
1361 RscFile * pFName;
1363 lKey = Find( rName );
1364 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey )
1366 pFName = new RscFile();
1367 pFName->aFileName = rName;
1368 pFName->aPathName = rName;
1369 lKey = Insert( pFName );
1370 pFName->InsertDependFile( lKey, LIST_APPEND );
1372 return lKey;
1375 /*************************************************************************
1377 |* RscFileTab::NewIncFile()
1379 |* Beschreibung
1380 |* Ersterstellung MM 16.05.91
1381 |* Letzte Aenderung MM 16.05.91
1383 *************************************************************************/
1384 sal_uLong RscFileTab :: NewIncFile( const ByteString & rName,
1385 const ByteString & rPath )
1387 sal_uLong lKey;
1388 RscFile * pFName;
1390 lKey = Find( rName );
1391 if( UNIQUEINDEX_ENTRY_NOTFOUND == lKey )
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 );
1400 return lKey;