/*
 * _file_mode_flags — парсер строки режима fopen/fdopen/freopen.
 * Поддержаны r, w, a; '+' в любом месте хвоста; 'b'/'t' игнорируются —
 * весь I/O на Sprinter бинарный.
 */

#include <fcntl.h>
#include <errno.h>
#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;
}
