Blender V4.3
BLI_path_utils.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
10#include "BLI_compiler_attrs.h"
11#include "BLI_compiler_compat.h"
12#include "BLI_utildefines.h"
14
15/* -------------------------------------------------------------------- */
31bool BLI_path_name_at_index(const char *__restrict path,
32 int index,
33 int *__restrict r_offset,
34 int *__restrict r_len) ATTR_NONNULL(1, 3, 4) ATTR_WARN_UNUSED_RESULT;
35
40
41bool BLI_path_is_win32_drive(const char *path);
42bool BLI_path_is_win32_drive_only(const char *path);
43bool BLI_path_is_win32_drive_with_slash(const char *path);
44
47/* -------------------------------------------------------------------- */
59bool BLI_path_parent_dir(char *path) ATTR_NONNULL(1);
67
79const char *BLI_path_parent_dir_end(const char *path, size_t path_len)
81
84/* -------------------------------------------------------------------- */
114bool BLI_path_make_safe_filename_ex(char *filename, bool allow_tokens) ATTR_NONNULL(1);
115bool BLI_path_make_safe_filename(char *filename) ATTR_NONNULL(1);
116
122bool BLI_path_make_safe(char *path) ATTR_NONNULL(1);
123
128void BLI_path_to_display_name(char *display_name, int display_name_maxncpy, const char *name)
129 ATTR_NONNULL(1, 3);
130
133/* -------------------------------------------------------------------- */
159int BLI_path_normalize(char *path) ATTR_NONNULL(1);
160
168int BLI_path_normalize_native(char *path) ATTR_NONNULL(1);
169
177int BLI_path_normalize_dir(char *dir, size_t dir_maxncpy) ATTR_NONNULL(1);
178
179#if defined(WIN32)
180void BLI_path_normalize_unc_16(wchar_t *path_16);
181void BLI_path_normalize_unc(char *path, int path_maxncpy);
182#endif
183
186/* -------------------------------------------------------------------- */
204int BLI_path_canonicalize_native(char *path, int path_maxncpy);
205
208/* -------------------------------------------------------------------- */
216bool BLI_path_filename_ensure(char *filepath, size_t filepath_maxncpy, const char *filename)
217 ATTR_NONNULL(1, 3);
218
231bool BLI_path_suffix(char *path, size_t path_maxncpy, const char *suffix, const char *sep)
232 ATTR_NONNULL(1, 3, 4);
233
236/* -------------------------------------------------------------------- */
243const char *BLI_path_slash_find(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
247const char *BLI_path_slash_rfind(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
253int BLI_path_slash_ensure_ex(char *path, size_t path_maxncpy, const size_t path_len)
254 ATTR_NONNULL(1);
259int BLI_path_slash_ensure(char *path, size_t path_maxncpy) ATTR_NONNULL(1);
263void BLI_path_slash_rstrip(char *path) ATTR_NONNULL(1);
267const char *BLI_path_slash_skip(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
271void BLI_path_slash_native(char *path) ATTR_NONNULL(1);
272
275/* -------------------------------------------------------------------- */
283void BLI_path_split_dir_file(const char *filepath,
284 char *dir,
285 size_t dir_maxncpy,
286 char *file,
287 size_t file_maxncpy) ATTR_NONNULL(1, 2, 4);
291void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy)
292 ATTR_NONNULL(1, 2);
298void BLI_path_split_file_part(const char *filepath, char *file, size_t file_maxncpy)
299 ATTR_NONNULL(1, 2);
300
307const char *BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
308
311/* -------------------------------------------------------------------- */
319
322/* -------------------------------------------------------------------- */
330size_t BLI_path_append(char *__restrict dst, size_t dst_maxncpy, const char *__restrict file)
331 ATTR_NONNULL(1, 3);
336size_t BLI_path_append_dir(char *__restrict dst, size_t dst_maxncpy, const char *__restrict dir)
337 ATTR_NONNULL(1, 3);
338
341/* -------------------------------------------------------------------- */
348size_t BLI_path_join_array(char *__restrict dst,
349 const size_t dst_maxncpy,
350 const char *path_array[],
351 const int path_array_num) ATTR_NONNULL(1, 3);
352
368#define BLI_path_join(...) VA_NARGS_CALL_OVERLOAD(_BLI_path_join_, __VA_ARGS__)
369
370#define _BLI_PATH_JOIN_ARGS_1 char *__restrict dst, size_t dst_maxncpy, const char *a
371#define _BLI_PATH_JOIN_ARGS_2 _BLI_PATH_JOIN_ARGS_1, const char *b
372#define _BLI_PATH_JOIN_ARGS_3 _BLI_PATH_JOIN_ARGS_2, const char *c
373#define _BLI_PATH_JOIN_ARGS_4 _BLI_PATH_JOIN_ARGS_3, const char *d
374#define _BLI_PATH_JOIN_ARGS_5 _BLI_PATH_JOIN_ARGS_4, const char *e
375#define _BLI_PATH_JOIN_ARGS_6 _BLI_PATH_JOIN_ARGS_5, const char *f
376#define _BLI_PATH_JOIN_ARGS_7 _BLI_PATH_JOIN_ARGS_6, const char *g
377#define _BLI_PATH_JOIN_ARGS_8 _BLI_PATH_JOIN_ARGS_7, const char *h
378#define _BLI_PATH_JOIN_ARGS_9 _BLI_PATH_JOIN_ARGS_8, const char *i
379#define _BLI_PATH_JOIN_ARGS_10 _BLI_PATH_JOIN_ARGS_9, const char *j
380
391
393{
394 const char *path_array[] = {a};
395 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
396}
398{
399 const char *path_array[] = {a, b};
400 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
401}
403{
404 const char *path_array[] = {a, b, c};
405 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
406}
408{
409 const char *path_array[] = {a, b, c, d};
410 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
411}
413{
414 const char *path_array[] = {a, b, c, d, e};
415 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
416}
418{
419 const char *path_array[] = {a, b, c, d, e, f};
420 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
421}
423{
424 const char *path_array[] = {a, b, c, d, e, f, g};
425 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
426}
428{
429 const char *path_array[] = {a, b, c, d, e, f, g, h};
430 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
431}
433{
434 const char *path_array[] = {a, b, c, d, e, f, g, h, i};
435 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
436}
438{
439 const char *path_array[] = {a, b, c, d, e, f, g, h, i, j};
440 return BLI_path_join_array(dst, dst_maxncpy, path_array, ARRAY_SIZE(path_array));
441}
442
443#undef _BLI_PATH_JOIN_ARGS_1
444#undef _BLI_PATH_JOIN_ARGS_2
445#undef _BLI_PATH_JOIN_ARGS_3
446#undef _BLI_PATH_JOIN_ARGS_4
447#undef _BLI_PATH_JOIN_ARGS_5
448#undef _BLI_PATH_JOIN_ARGS_6
449#undef _BLI_PATH_JOIN_ARGS_7
450#undef _BLI_PATH_JOIN_ARGS_8
451#undef _BLI_PATH_JOIN_ARGS_9
452#undef _BLI_PATH_JOIN_ARGS_10
453
456/* -------------------------------------------------------------------- */
464const char *BLI_path_extension_or_end(const char *filepath)
470const char *BLI_path_extension(const char *filepath) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
471
475bool BLI_path_extension_check(const char *path, const char *ext)
477bool BLI_path_extension_check_n(const char *path, ...) ATTR_NONNULL(1) ATTR_SENTINEL(0);
481bool BLI_path_extension_check_array(const char *path, const char **ext_array)
487bool BLI_path_extension_check_glob(const char *path, const char *ext_fnmatch)
498bool BLI_path_extension_glob_validate(char *ext_fnmatch) ATTR_NONNULL(1);
503bool BLI_path_extension_replace(char *path, size_t path_maxncpy, const char *ext)
504 ATTR_NONNULL(1, 3);
509bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1);
513bool BLI_path_extension_ensure(char *path, size_t path_maxncpy, const char *ext)
514 ATTR_NONNULL(1, 3);
515
518/* -------------------------------------------------------------------- */
522/* Path string comparisons: case-insensitive for Windows, case-sensitive otherwise. */
523#if defined(WIN32)
524# define BLI_path_cmp BLI_strcasecmp
525# define BLI_path_ncmp BLI_strncasecmp
526#else
527# define BLI_path_cmp strcmp
528# define BLI_path_ncmp strncmp
529#endif
530
542int BLI_path_cmp_normalized(const char *p1, const char *p2)
544
546bool BLI_path_contains(const char *container_path, const char *containee_path)
548
551/* -------------------------------------------------------------------- */
555#ifdef _WIN32
556bool BLI_path_program_extensions_add_win32(char *program_name, size_t program_name_maxncpy);
557#endif
562 size_t program_filepath_maxncpy,
563 const char *program_name) ATTR_NONNULL(1, 3);
564
567/* -------------------------------------------------------------------- */
575void BLI_path_sequence_encode(char *path,
576 size_t path_maxncpy,
577 const char *head,
578 const char *tail,
579 unsigned short numlen,
580 int pic);
581
593int BLI_path_sequence_decode(const char *path,
594 char *head,
595 size_t head_maxncpy,
596 char *tail,
597 size_t tail_maxncpy,
598 unsigned short *r_digits_len);
599
602/* -------------------------------------------------------------------- */
610bool BLI_path_frame(char *path, size_t path_maxncpy, int frame, int digits) ATTR_NONNULL(1);
616bool BLI_path_frame_range(char *path, size_t path_maxncpy, int sta, int end, int digits)
617 ATTR_NONNULL(1);
621bool BLI_path_frame_get(const char *path, int *r_frame, int *r_digits_len) ATTR_NONNULL(1, 2, 3);
628void BLI_path_frame_strip(char *path, char *r_ext, size_t ext_maxncpy) ATTR_NONNULL(1, 2);
633
636/* -------------------------------------------------------------------- */
654#ifndef FILE_MAXDIR
655# define FILE_MAXDIR 768
656# define FILE_MAXFILE 256
657# define FILE_MAX 1024
658#endif
659
670bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1, 2);
675void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1);
676
682
685/* -------------------------------------------------------------------- */
703bool BLI_path_abs_from_cwd(char *path, size_t path_maxncpy) ATTR_NONNULL(1);
704
707/* -------------------------------------------------------------------- */
711#ifdef WIN32
712# define SEP '\\'
713# define ALTSEP '/'
714# define SEP_STR "\\"
715# define ALTSEP_STR "/"
716#else
717# define SEP '/'
718# define ALTSEP '\\'
719# define SEP_STR "/"
720# define ALTSEP_STR "\\"
721#endif
722
727{
728 /* On UNIX it only makes sense to treat `/` as a path separator.
729 * On WIN32 either may be used. */
730 if (ch == SEP) {
731 return true;
732 }
733#ifdef WIN32
734 if (ch == ALTSEP) {
735 return true;
736 }
737#endif
738 return false;
739}
740
743/* -------------------------------------------------------------------- */
753void BLI_setenv(const char *env, const char *val) ATTR_NONNULL(1);
760void BLI_setenv_if_new(const char *env, const char *val) ATTR_NONNULL(1);
769const char *BLI_getenv(const char *env) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
770
773/* -------------------------------------------------------------------- */
777/* Parent and current dir helpers. */
778#define FILENAME_PARENT ".."
779#define FILENAME_CURRENT "."
780
781/* Avoid calling `strcmp` on one or two chars! */
782#define FILENAME_IS_PARENT(_n) (((_n)[0] == '.') && ((_n)[1] == '.') && ((_n)[2] == '\0'))
783#define FILENAME_IS_CURRENT(_n) (((_n)[0] == '.') && ((_n)[1] == '\0'))
784#define FILENAME_IS_CURRPAR(_n) \
785 (((_n)[0] == '.') && (((_n)[1] == '\0') || (((_n)[1] == '.') && ((_n)[2] == '\0'))))
786
#define ATTR_SENTINEL(arg_pos)
#define ATTR_RETURNS_NONNULL
#define ATTR_NONNULL(...)
#define BLI_INLINE
BLI_INLINE size_t _BLI_path_join_11(_BLI_PATH_JOIN_ARGS_9) ATTR_NONNULL()
BLI_INLINE size_t _BLI_path_join_6(_BLI_PATH_JOIN_ARGS_4) ATTR_NONNULL()
bool BLI_path_parent_dir(char *path) ATTR_NONNULL(1)
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool BLI_path_parent_dir_until_exists(char *path) ATTR_NONNULL(1)
#define ALTSEP
bool void BLI_path_frame_strip(char *path, char *r_ext, size_t ext_maxncpy) ATTR_NONNULL(1
#define _BLI_PATH_JOIN_ARGS_7
#define _BLI_PATH_JOIN_ARGS_4
BLI_INLINE size_t _BLI_path_join_7(_BLI_PATH_JOIN_ARGS_5) ATTR_NONNULL()
bool BLI_path_make_safe(char *path) ATTR_NONNULL(1)
size_t BLI_path_append(char *__restrict dst, size_t dst_maxncpy, const char *__restrict file) ATTR_NONNULL(1
bool BLI_path_filename_ensure(char *filepath, size_t filepath_maxncpy, const char *filename) ATTR_NONNULL(1
bool bool BLI_path_suffix(char *path, size_t path_maxncpy, const char *suffix, const char *sep) ATTR_NONNULL(1
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
bool void bool BLI_path_frame_check_chars(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define _BLI_PATH_JOIN_ARGS_9
#define _BLI_PATH_JOIN_ARGS_3
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
BLI_INLINE size_t _BLI_path_join_9(_BLI_PATH_JOIN_ARGS_7) ATTR_NONNULL()
void BLI_path_to_display_name(char *display_name, int display_name_maxncpy, const char *name) ATTR_NONNULL(1
#define _BLI_PATH_JOIN_ARGS_8
int BLI_path_normalize_dir(char *dir, size_t dir_maxncpy) ATTR_NONNULL(1)
bool BLI_path_has_hidden_component(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check_array(const char *path, const char **ext_array) ATTR_NONNULL(1
bool ATTR_WARN_UNUSED_RESULT
int BLI_path_slash_ensure_ex(char *path, size_t path_maxncpy, const size_t path_len) ATTR_NONNULL(1)
#define FILE_MAX
bool BLI_path_extension_replace(char *path, size_t path_maxncpy, const char *ext) ATTR_NONNULL(1
void BLI_setenv(const char *env, const char *val) ATTR_NONNULL(1)
void BLI_path_slash_native(char *path) ATTR_NONNULL(1)
bool BLI_path_program_search(char *program_filepath, size_t program_filepath_maxncpy, const char *program_name) ATTR_NONNULL(1
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
bool BLI_path_contains(const char *container_path, const char *containee_path) ATTR_NONNULL(1
const char * BLI_path_extension_or_end(const char *filepath) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
const char * BLI_getenv(const char *env) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_is_win32_drive(const char *path)
bool BLI_path_is_abs_from_cwd(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void void void BLI_path_split_file_part(const char *filepath, char *file, size_t file_maxncpy) ATTR_NONNULL(1
int BLI_path_canonicalize_native(char *path, int path_maxncpy)
#define _BLI_PATH_JOIN_ARGS_1
BLI_INLINE size_t _BLI_path_join_10(_BLI_PATH_JOIN_ARGS_8) ATTR_NONNULL()
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define SEP
BLI_INLINE size_t _BLI_path_join_12(_BLI_PATH_JOIN_ARGS_10) ATTR_NONNULL()
bool BLI_path_extension_glob_validate(char *ext_fnmatch) ATTR_NONNULL(1)
#define _BLI_PATH_JOIN_ARGS_5
bool BLI_path_frame_get(const char *path, int *r_frame, int *r_digits_len) ATTR_NONNULL(1
#define _BLI_PATH_JOIN_ARGS_10
const char * BLI_path_slash_skip(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_extension_check(const char *path, const char *ext) ATTR_NONNULL(1
const char * BLI_path_slash_find(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_path_slash_is_native_compat(const char ch)
bool BLI_path_extension_ensure(char *path, size_t path_maxncpy, const char *ext) ATTR_NONNULL(1
int BLI_path_sequence_decode(const char *path, char *head, size_t head_maxncpy, char *tail, size_t tail_maxncpy, unsigned short *r_digits_len)
Definition path_utils.cc:57
const char * BLI_path_parent_dir_end(const char *path, size_t path_len) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
int BLI_path_cmp_normalized(const char *p1, const char *p2) ATTR_NONNULL(1
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
size_t BLI_path_join_array(char *__restrict dst, const size_t dst_maxncpy, const char *path_array[], const int path_array_num) ATTR_NONNULL(1
void BLI_setenv_if_new(const char *env, const char *val) ATTR_NONNULL(1)
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
bool BLI_path_extension_check_n(const char *path,...) ATTR_NONNULL(1) ATTR_SENTINEL(0)
BLI_INLINE size_t _BLI_path_join_8(_BLI_PATH_JOIN_ARGS_6) ATTR_NONNULL()
bool BLI_path_is_win32_drive_only(const char *path)
bool BLI_path_make_safe_filename_ex(char *filename, bool allow_tokens) ATTR_NONNULL(1)
BLI_INLINE size_t _BLI_path_join_3(_BLI_PATH_JOIN_ARGS_1) ATTR_NONNULL()
size_t size_t BLI_path_append_dir(char *__restrict dst, size_t dst_maxncpy, const char *__restrict dir) ATTR_NONNULL(1
void BLI_path_slash_rstrip(char *path) ATTR_NONNULL(1)
#define _BLI_PATH_JOIN_ARGS_6
bool BLI_path_is_win32_drive_with_slash(const char *path)
int BLI_path_slash_ensure(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
bool BLI_path_abs_from_cwd(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
bool BLI_path_make_safe_filename(char *filename) ATTR_NONNULL(1)
#define _BLI_PATH_JOIN_ARGS_2
const char * BLI_path_slash_rfind(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_frame_range(char *path, size_t path_maxncpy, int sta, int end, int digits) ATTR_NONNULL(1)
const char * BLI_path_extension(const char *filepath) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
int BLI_path_normalize_native(char *path) ATTR_NONNULL(1)
bool BLI_path_frame(char *path, size_t path_maxncpy, int frame, int digits) ATTR_NONNULL(1)
bool BLI_path_extension_check_glob(const char *path, const char *ext_fnmatch) ATTR_NONNULL(1
bool BLI_path_is_unc(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_name_at_index(const char *__restrict path, int index, int *__restrict r_offset, int *__restrict r_len) ATTR_NONNULL(1
BLI_INLINE size_t _BLI_path_join_5(_BLI_PATH_JOIN_ARGS_3) ATTR_NONNULL()
BLI_INLINE size_t _BLI_path_join_4(_BLI_PATH_JOIN_ARGS_2) ATTR_NONNULL()
void BLI_path_sequence_encode(char *path, size_t path_maxncpy, const char *head, const char *tail, unsigned short numlen, int pic)
#define ARRAY_SIZE(arr)
char program_filepath[FILE_MAX]
Definition appdir.cc:71
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
local_group_size(16, 16) .push_constant(Type b