Kody źródłowe/Rozwinięcie zmiennej systemowej w ścieżce

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.

C++[edytuj]

#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());
}