/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
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 }
}