/* Handle different target file systems for GDB, the GNU Debugger.
   Copyright (C) 2010-2024 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDB_FILESYSTEM_H
#define GDB_FILESYSTEM_H

extern const char file_system_kind_auto[];
extern const char file_system_kind_unix[];
extern const char file_system_kind_dos_based[];

extern const char *target_file_system_kind;

/* Same as IS_DIR_SEPARATOR but with file system kind KIND's
   semantics, instead of host semantics.  */

#define IS_TARGET_DIR_SEPARATOR(kind, c)				\
  (((kind) == file_system_kind_dos_based) ? IS_DOS_DIR_SEPARATOR (c) \
   : IS_UNIX_DIR_SEPARATOR (c))

/* Same as IS_ABSOLUTE_PATH but with file system kind KIND's
   semantics, instead of host semantics.  */

#define IS_TARGET_ABSOLUTE_PATH(kind, p)				\
  (((kind) == file_system_kind_dos_based) ? IS_DOS_ABSOLUTE_PATH (p) \
   : IS_UNIX_ABSOLUTE_PATH (p))

/* Same as HAS_DRIVE_SPEC but with file system kind KIND's semantics,
   instead of host semantics.  */

#define HAS_TARGET_DRIVE_SPEC(kind, p)					\
  (((kind) == file_system_kind_dos_based) ? HAS_DOS_DRIVE_SPEC (p) \
   : 0)

/* Same as lbasename, but with file system kind KIND's semantics,
   instead of host semantics.  */
extern const char *target_lbasename (const char *kind, const char *name);

/* The effective setting of "set target-file-system-kind", with "auto"
   resolved to the real kind.  That is, you never see "auto" as a
   result from this function.  */
extern const char *effective_target_file_system_kind (void);

#endif /* GDB_FILESYSTEM_H */
