path и env: Пути и настройки окружения
Считывает переменные пути и среды в буфере вызывающего объекта и определяет ошибки емкости.
Wave Foundation
комбинация путей
std::path::copy
path_join2(dst: ptr<u8>, dst_cap: i32, left: str, right: str) -> i32
path_basename_copy(dst: ptr<u8>, dst_cap: i32, path: str) -> i32
path_dirname_copy(dst: ptr<u8>, dst_cap: i32, path: str) -> i32
Емкость включает последнее пространство NUL. Результатом успеха является любая длина, за исключением NUL, неудачей является -1. Только в случае успеха мы будем использовать пункт назначения в виде строки. Эти функции работают со строками пути и не проверяют существование файла или права доступа. Объединение путей само по себе не предотвращает экранирование каталогов и не проверяет подлинность реальных файлов.
переменная среды
std::env::environ
env_get(name: str, dst: ptr<u8>, dst_cap: i64) -> i64
env_exists(name: str) -> bool
env_get_i64(name: str) -> EnvResult<i64>
env_get_i32(name: str) -> EnvResult<i32>
env_get возвращает длину, исключая NUL в случае успеха. Буфер вызывающего объекта должен иметь возможность хранить до NUL. Пустое значение отличается от ошибки без ключа, поскольку оно может иметь длину 0.
Получите и распознайте ошибки от std::env::consts до NOT_FOUND, NO_SPACE, INVALID_KEY, READ, SOURCE_INCOMPLETE, NO_MEMORY. Не рассматривайте выход из буфера как отсутствующий ключ. Чтобы найти числа, отметьте ok в результате, а затем используйте value. Не рассматривайте автоматически содержимое переменных среды как доверенные параметры; проверьте их область действия и тип.
В следующем примере сочетаются каталоги data и имена файлов input.txt.
import("std::path::copy")::{
path_join2
};
fun main() -> i32 {
var output: array<u8, 64>;
var length: i32 = path_join2(&output[0], 64, "data", "input.txt");
if (length < 0) {
return 1;
}
println("{}", &output[0] as str);
return 0;
}
Результат выполнения:
data/input.txt
Разделить каталоги и имена файлов
В следующем примере копируется путь, разделенный на два буфера. Исходный файл не обязательно должен существовать.
import("std::path::copy")::{
path_basename_copy,
path_dirname_copy
};
fun main() -> i32 {
var directory: array<u8, 64>;
var filename: array<u8, 64>;
var directory_length: i32 = path_dirname_copy(&directory[0], 64, "data/report.txt");
var filename_length: i32 = path_basename_copy(&filename[0], 64, "data/report.txt");
if (directory_length < 0 || filename_length < 0) {
return 1;
}
println("directory={}", &directory[0] as str);
println("filename={}", &filename[0] as str);
return 0;
}
Результат выполнения:
directory=data
filename=report.txt
Оба буфера будут действовать до конца main. as str читает тот же буфер, что и строка, без выделения новой строки. Следовательно, если вы измените буфер, строка, считанная по этому адресу, также изменится.
Установить настройки по умолчанию
Переменные среды — это настройки, передаваемые вне программы. При чтении числового параметра установите флажок «Можно ли его прочитать как целое число?» и «Находится ли это в пределах, разрешенных этой программой?»
import("std::env::environ")::{
EnvResult,
env_get_i32
};
fun main() -> i32 {
var setting: EnvResult<i32> = env_get_i32("WAVE_EXAMPLE_WORKERS");
var workers: i32 = 4;
if (setting.ok) {
if (setting.value < 1 || setting.value > 32) {
println("workers must be between 1 and 32");
return 1;
}
workers = setting.value;
}
println("workers={}", workers);
return 0;
}
Если WAVE_EXAMPLE_WORKERS отсутствует или не может быть прочитан как целое число, используется значение по умолчанию — 4. Если установлено целое число от 1 до 32, используется это значение, а если это целое число вне диапазона, оно завершается с ошибкой.
Linux/macOS:
WAVE_EXAMPLE_WORKERS=8 wavec run main.wave
PowerShell:
$env:WAVE_EXAMPLE_WORKERS = "8"
wavec run main.wave
В обоих случаях выводится workers=8. В приведенном выше примере выбрана простая политика по умолчанию. Если это обязательный параметр, рассматривайте ошибки числового поиска как ошибки, а не заменяйте их значениями по умолчанию. Если вам нужно отличить отсутствующий ключ, недостаточный буфер и ошибку чтения, используйте константы env_get и ENV_ERR_*.