Files
test2/source/blender/makesdna/intern/dna_utils.h
2024-08-26 11:50:15 +10:00

104 lines
3.7 KiB
C

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup DNA
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
struct GHash;
struct MemArena;
/**
* Naming convention in this header:
* - `member_full` refers to the full definition of a struct member, including its prefixes (like
* the pointer `*` ones) and suffixes (like the `[]` array ones).
* - `member_id` (for member identifier) refers to the bare name of the struct member (e.g. `var`
* is the member identifier of the `*var[n1][n2]` full member).
*/
/**
* Parse the `[n1][n2]...` at the end of an array struct member.
*
* \return the total number of array elements `n1 * n2 ...`, or `1` if the member is not an array.
*/
int DNA_member_array_num(const char *str);
/** Find the start offset of the member id (the name) within the full member definition. */
uint DNA_member_id_offset_start(const char *member_full);
/**
* Find the end offset of the member id (the name) within the trimmed full member definition.
*
* WARNING: Expects an input string which has already been trimmed from its non-identifier
* prefixes. E.g. passing `*var[n1]` to this function will return `0`, while passing `var[n1]` will
* return the expected `3` value.
*/
uint DNA_member_id_offset_end(const char *member_full_trimmed);
/**
* Copy the member id part (the bare name) of the full source member into \a member_id_dst.
*
* \param member_id_dst: destination char buffer, must be at least the size of \a member_src_full.
*/
uint DNA_member_id_strip_copy(char *member_id_dst, const char *member_full_src);
/**
* Same as #DNA_member_id_strip_copy, but modifies the given \a member string in place.
*/
uint DNA_member_id_strip(char *member);
/**
* Check if the member identifier given in \a member_id matches the full name given in \a
* member_full. E.g. `var` matches full names like `var` or `*var[3]`, but not `variable`.
*
* \return true if it does, with the start offset of the match in \a r_member_full_offset.
*/
bool DNA_member_id_match(const char *member_id,
int member_id_len,
const char *member_full,
uint *r_member_full_offset);
/**
* Rename a struct member to a different name.
*
* Replace the source member identifier (\a member_id_src) by the destination one
* (\a member_id_dst), while preserving the potential prefixes and suffixes.
*
* \return a renamed DNA full member, allocated from \a mem_arena.
*/
char *DNA_member_id_rename(struct MemArena *mem_arena,
const char *member_id_src,
int member_id_src_len,
const char *member_id_dst,
int member_id_dst_len,
const char *member_full_src,
int member_full_src_len,
uint member_full_src_offset_len);
/**
* When requesting version info, support both directions.
*
* - 'Static' is the original name of the data, the one that is still stored in blend-files
* DNA info (to avoid breaking forward compatibility).
* - 'Alias' is the current name of the data, the one used in current DNA definition code.
*/
enum eDNA_RenameDir {
DNA_RENAME_STATIC_FROM_ALIAS = -1,
DNA_RENAME_ALIAS_FROM_STATIC = 1,
};
void DNA_alias_maps(enum eDNA_RenameDir version_dir,
struct GHash **r_type_map,
struct GHash **r_member_map);
/**
* DNA Compatibility Hack.
*/
const char *DNA_struct_rename_legacy_hack_alias_from_static(const char *name);
const char *DNA_struct_rename_legacy_hack_static_from_alias(const char *name);
#ifdef __cplusplus
}
#endif