Z Wikibooks, biblioteki wolnych podręczników.
Metoda • Rozwinięcie zmiennej systemowej w ścieżce
Metoda Rozwinięcie zmiennej systemowej w ścieżce
Program zamienia ciąg wystąpienia zmiennej systemowej na jej wartość. Napisany w C++ z użyciem QT5, bez wyrażeń regularnych. Gdy w wyniku dostaniemy nową nazwę zmiennej jeszcze raz rozwija.
#include <QtCore>
class VarExpander
{
QString result ;
int posResult ;
void append ( QChar c )
{
if ( posResult >= result . capacity ())
{
result . reserve ( result . capacity () * 2 );
}
result [ posResult ] = c ;
posResult ++ ;
}
void replaceVar ( QString path , QString startTag , QString endTag , int & varCounter )
{
varCounter = 0 ;
int startPos = 0 ;
int endPos = - endTag . length ();
result . reserve ( path . length () * 2 );
posResult = 0 ;
while ( startPos >= 0 && startPos < path . length ())
{
startPos = path . indexOf ( startTag , startPos );
if ( startPos < 0 )
{
for ( int i = endPos + endTag . length (); i < path . length (); i ++ )
append ( path [ i ]);
break ;
}
for ( int i = endPos + endTag . length (); i < startPos ; i ++ )
append ( path [ i ]);
endPos = path . indexOf ( endTag , startPos + startTag . length ());
if ( endPos < 0 )
{
for ( int i = startPos + startTag . length (); i < path . length (); i ++ )
append ( path [ i ]);
break ;
}
QString varName = path . mid ( startPos + startTag . length (),
endPos - startPos - startTag . length ());
QString varValue = QString :: fromStdString ( qgetenv ( varName . toStdString (). c_str ()). toStdString ());
varCounter ++ ;
for ( int i = 0 ; i < varValue . length (); i ++ )
append ( varValue [ i ]);
startPos = endPos + endTag . length ();
}
result . squeeze ();
}
public :
VarExpander () {}
QString expand ( QString path ){
QString startTag , endTag ;
#if defined(Q_OS_WIN)
startTag = "%" , endTag = "%" ;
#elif defined(Q_OS_LINUX)
startTag = "${" , endTag = "}" ;
#endif
int varCounter ;
int loopCounter = 0 ;
do {
replaceVar ( path , startTag , endTag , varCounter );
if ( QString :: compare ( path , result , Qt :: CaseInsensitive ) == 0 ) break ;
path = result ;
loopCounter ++ ;
} while ( varCounter > 0 && loopCounter < 10 );
return path ;
}
};
int main ( int argc , char * argv [])
{
VarExpander ve ;
QString res = ve . expand ( "%SystemRoot% \\ system32 \\ wmploc.dll,-732" );
printf ( "%s \n " , res . toStdString (). c_str ());
}