/* * _pop_file.h — внутренний файловый слой SprPoP для старых версий DSS. * * DSS до исправления относительных путей оставляет рабочий каталог внутри * последнего подкаталога. POP_PATH_CALL восстанавливает абсолютный каталог * приложения до и после операции. Это макрос намеренно: код исполняется в * банке вызывающего, где доступен переданный указатель, и не расходует W1. */ #ifndef _POP_FILE_H #define _POP_FILE_H #include #include /* BANK10: получить каталог EXE через APPINFO B=1 и сделать его текущим. */ int8_t pop_path_init(void) __banked; int8_t pop_chdir_home(void) __banked; /* expression вычисляется только после успешного chdir. errno файловой * операции сохраняется через завершающее восстановление каталога. */ #define POP_PATH_CALL(result, expression) do { \ if (pop_chdir_home() != 0) { \ (result) = -1; \ } else { \ int _pop_path_errno; \ (result) = (expression); \ _pop_path_errno = errno; \ (void)pop_chdir_home(); \ errno = _pop_path_errno; \ } \ } while (0) #endif