/* * _file_mode_flags — парсер строки режима fopen/fdopen/freopen. * Поддержаны r, w, a; '+' в любом месте хвоста; 'b'/'t' игнорируются — * весь I/O на Sprinter бинарный. */ #include #include #include "_file.h" int _file_mode_flags(const char *mode, uint8_t *ff) { if (!mode || !*mode) { errno = EINVAL; return -1; } int oflags = 0; uint8_t f = 0; char base = *mode; int plus = 0; for (const char *p = mode + 1; *p; p++) { if (*p == '+') plus = 1; } switch (base) { case 'r': oflags = plus ? O_RDWR : O_RDONLY; f = _F_READ | (plus ? _F_WRITE : 0); break; case 'w': oflags = (plus ? O_RDWR : O_WRONLY) | O_CREAT | O_TRUNC; f = _F_WRITE | (plus ? _F_READ : 0); break; case 'a': oflags = (plus ? O_RDWR : O_WRONLY) | O_CREAT | O_APPEND; f = _F_WRITE | _F_APPEND | (plus ? _F_READ : 0); break; default: errno = EINVAL; return -1; } *ff = f; return oflags; }