34 lines
1.8 KiB
C
34 lines
1.8 KiB
C
/*
|
|
* _pop_file.h — внутренний файловый слой SprPoP для старых версий DSS.
|
|
*
|
|
* DSS до исправления относительных путей оставляет рабочий каталог внутри
|
|
* последнего подкаталога. POP_PATH_CALL восстанавливает абсолютный каталог
|
|
* приложения до и после операции. Это макрос намеренно: код исполняется в
|
|
* банке вызывающего, где доступен переданный указатель, и не расходует W1.
|
|
*/
|
|
#ifndef _POP_FILE_H
|
|
#define _POP_FILE_H
|
|
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
|
|
/* 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
|