Environment.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024, 2026 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package platform.independent.osservices;

import avt.lang.array.*;
import platform.dependent.*;

public class Environment(Object, Measureable, ObjectArray)
{
    private final Mutex fldOperation;
    private final EnvironmentTable fldVariables;

    public () {
        PlatformServices services = PlatformServices.getInstance();
        fldOperation = services.newMutex();
        fldVariables = services.newEnvironmentTable();
    }

    public boolean equals(Object anot) {
        if(!(anot instanceof Environment)) return false;
        if(anot == this) return true;
        Environment aobj = (Environment) anot;
        Mutex toperation = fldOperation;
        toperation.lock();
        try
        {
            Mutex aoperation = aobj.fldOperation;
            aoperation.lock();
            try
            {
                return fldVariables.equals(aobj.fldVariables);
            } finally
            {
                aoperation.unlock();
            }
        } finally
        {
            toperation.unlock();
        }
    }

    public String toString() {
        String eoln = PlatformServices.getInstance().lineSeparator;
        StringBuilder result = new StringBuilder();
        EnvironmentTable vars = fldVariables;
        Mutex operation = fldOperation;
        operation.lock();
        try
        {
            for(int length = vars.length, int index = 0; index < length; index++)
            {
                String name = vars[index];
                result.append(name).append('=').append(vars[name]).append(eoln);
            }
        } finally
        {
            operation.unlock();
        }
        return result.toString();
    }

    public void assign(Environment anot) {
        if(anot == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "anot" }));
        }
        if(anot == this) return;
        EnvironmentTable tvars = fldVariables;
        EnvironmentTable avars = anot.fldVariables;
        Mutex toperation = fldOperation;
        toperation.lock();
        try
        {
            Mutex aoperation = anot.fldOperation;
            aoperation.lock();
            try
            {
                for(tvars.clear(), int length = avars.length, int index = 0; index < length; index++)
                {
                    String name = avars[index];
                    tvars[name] = avars[name];
                }
            } finally
            {
                aoperation.unlock();
            }
        } finally
        {
            toperation.unlock();
        }
    }

    public boolean isEmulation() { return false; }

    public boolean isCaseSensitive() { return fldVariables.isCaseSensitive(); }

    public boolean contains(String envName) {
        if(envName == null) return false;
        Mutex operation = fldOperation;
        operation.lock();
        try
        {
            return fldVariables.contains(envName);
        } finally
        {
            operation.unlock();
        }
    }

    public int length { read = fldVariables.length }

    public String operator [](int index) {
        Mutex operation = fldOperation;
        operation.lock();
        try
        {
            return fldVariables[index];
        } finally
        {
            operation.unlock();
        }
    }

    public void operator []=(String envName, String newValue) {
        if(envName == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "envName" }));
        }
        if(envName.indexOf(0) >= 0 || envName.indexOf('=') >= 0)
        {
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "envName" }));
        }
        if(newValue != null && newValue.indexOf(0) >= 0)
        {
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "newValue" }));
        }
        Mutex operation = fldOperation;
        operation.lock();
        try
        {
            fldVariables[envName] = newValue;
        } finally
        {
            operation.unlock();
        }
    }

    public String operator [](String envName) {
        if(envName == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "envName" }));
        }
        if(envName.indexOf(0) >= 0 || envName.indexOf('=') >= 0)
        {
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "envName" }));
        }
        Mutex operation = fldOperation;
        operation.lock();
        try
        {
            return fldVariables[envName];
        } finally
        {
            operation.unlock();
        }
    }

    package final Mutex operation { read = fldOperation }

    package final EnvironmentTable variables { read = fldVariables }
}