Blender  V2.93
Macros | Variables

Struct muncher for making SDNA. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_alloca.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
#include "BLI_sys_types.h"
#include "BLI_system.h"
#include "BLI_utildefines.h"
#include "dna_utils.h"
#include "DNA_ID.h"
#include "DNA_action_types.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_asset_types.h"
#include "DNA_boid_types.h"
#include "DNA_brush_types.h"
#include "DNA_cachefile_types.h"
#include "DNA_camera_types.h"
#include "DNA_cloth_types.h"
#include "DNA_collection_types.h"
#include "DNA_color_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
#include "DNA_curveprofile_types.h"
#include "DNA_customdata_types.h"
#include "DNA_dynamicpaint_types.h"
#include "DNA_effect_types.h"
#include "DNA_fileglobal_types.h"
#include "DNA_fluid_types.h"
#include "DNA_freestyle_types.h"
#include "DNA_gpencil_modifier_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_hair_types.h"
#include "DNA_image_types.h"
#include "DNA_ipo_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
#include "DNA_layer_types.h"
#include "DNA_light_types.h"
#include "DNA_lightprobe_types.h"
#include "DNA_lineart_types.h"
#include "DNA_linestyle_types.h"
#include "DNA_listBase.h"
#include "DNA_mask_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
#include "DNA_modifier_types.h"
#include "DNA_movieclip_types.h"
#include "DNA_nla_types.h"
#include "DNA_node_types.h"
#include "DNA_object_fluidsim_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_outliner_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_particle_types.h"
#include "DNA_pointcache_types.h"
#include "DNA_pointcloud_types.h"
#include "DNA_rigidbody_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_sdna_types.h"
#include "DNA_sequence_types.h"
#include "DNA_session_uuid_types.h"
#include "DNA_shader_fx_types.h"
#include "DNA_simulation_types.h"
#include "DNA_sound_types.h"
#include "DNA_space_types.h"
#include "DNA_speaker_types.h"
#include "DNA_text_types.h"
#include "DNA_texture_types.h"
#include "DNA_tracking_types.h"
#include "DNA_userdef_types.h"
#include "DNA_vec_types.h"
#include "DNA_vfont_types.h"
#include "DNA_view2d_types.h"
#include "DNA_view3d_types.h"
#include "DNA_volume_types.h"
#include "DNA_windowmanager_types.h"
#include "DNA_workspace_types.h"
#include "DNA_world_types.h"
#include "DNA_xr_types.h"
#include "dna_rename_defs.h"

Go to the source code of this file.

Macros

#define DNA_DEPRECATED_ALLOW
 
#define SDNA_MAX_FILENAME_LENGTH   255
 
#define DNA_STRUCT_RENAME(old, new)   (void)sizeof(new);
 
#define DNA_STRUCT_RENAME_ELEM(struct_name, old, new)   (void)offsetof(struct_name, new);
 

Functions

Function Declarations
static int add_type (const char *str, int size)
 
static int add_name (const char *str)
 
static short * add_struct (int namecode)
 
static int preprocess_include (char *maindata, const int maindata_len)
 
static int convert_include (const char *filename)
 
static int calculate_struct_sizes (int firststruct, FILE *file_verify, const char *base_directory)
 
static void dna_write (FILE *file, const void *pntr, const int size)
 
void print_struct_sizes (void)
 
DNA Renaming Sanity Check

Disable types:

  • 'long': even though DNA supports, 'long' shouldn't be used since it can be either 32 or 64bit, use int, int32_t or int64_t instead.

Only valid use would be as a runtime variable if an API expected a long, but so far we don't have this happening.

Without this it's possible to reference struct members that don't exist, breaking backward & forward compatibility.

static void UNUSED_FUNCTION() dna_rename_defs_ensure (void)
 

Variables

static const char * includefiles []
 

Variables

#define DEBUG_PRINTF(debug_level, ...)
 
static MemArenamem_arena = NULL
 
static int max_data_size = 500000
 
static int max_array_len = 50000
 
static int names_len = 0
 
static int types_len = 0
 
static int structs_len = 0
 
static char ** names
 
static char ** types
 
static short * types_size_native
 
static short * types_align_32
 
static short * types_align_64
 
static short * types_size_32
 
static short * types_size_64
 
static short ** structs
 
static short * structdata
 
struct {
   GHash *   struct_map_alias_from_static
 
   GHash *   struct_map_static_from_alias
 
   GHash *   elem_map_alias_from_static
 
   GHash *   elem_map_static_from_alias
 
g_version_data = {NULL}
 
static int debugSDNA = 0
 
static int additional_slen_offset
 
void BLI_system_backtrace (FILE *fp)
 

Implementation

Make DNA string (write to file).

#define MAX_DNA_LINE_LENGTH   20
 
static const char * version_struct_static_from_alias (const char *str)
 
static const char * version_struct_alias_from_static (const char *str)
 
static const char * version_elem_static_from_alias (const int strct, const char *elem_alias_full)
 
static bool is_name_legal (const char *name)
 
static void * read_file_data (const char *filename, int *r_len)
 
static bool check_field_alignment (int firststruct, int structtype, int type, int len, const char *name, const char *detail)
 
static int make_structDNA (const char *base_directory, FILE *file, FILE *file_offsets, FILE *file_verify)
 

Main Function

#define BASE_HEADER   "../"
 
static void make_bad_file (const char *file, int line)
 
int main (int argc, char **argv)
 

Detailed Description

Struct muncher for making SDNA.

About makesdna tool

Originally by Ton, some mods by Frank, and some cleaning and extension by Nzc.

Makesdna creates a .c file with a long string of numbers that encode the Blender file format. It is fast, because it is basically a binary dump. There are some details to mind when reconstructing the file (endianness and byte-alignment).

This little program scans all structs that need to be serialized, and determined the names and types of all members. It calculates how much memory (on disk or in ram) is needed to store that struct, and the offsets for reaching a particular one.

There is a facility to get verbose output from sdna. Search for debugSDNA. This int can be set to 0 (no output) to some int. Higher numbers give more output.

Definition in file makesdna.c.

Macro Definition Documentation

◆ BASE_HEADER

#define BASE_HEADER   "../"

Definition at line 1482 of file makesdna.c.

◆ DEBUG_PRINTF

#define DEBUG_PRINTF (   debug_level,
  ... 
)
Value:
{ \
if (debugSDNA > debug_level) { \
printf(__VA_ARGS__); \
} \
} \
((void)0)
static int debugSDNA
Definition: makesdna.c:199

Definition at line 202 of file makesdna.c.

◆ DNA_DEPRECATED_ALLOW

#define DNA_DEPRECATED_ALLOW

Definition at line 44 of file makesdna.c.

◆ DNA_STRUCT_RENAME

#define DNA_STRUCT_RENAME (   old,
  new 
)    (void)sizeof(new);

◆ DNA_STRUCT_RENAME_ELEM

#define DNA_STRUCT_RENAME_ELEM (   struct_name,
  old,
  new 
)    (void)offsetof(struct_name, new);

◆ MAX_DNA_LINE_LENGTH

#define MAX_DNA_LINE_LENGTH   20

Definition at line 1173 of file makesdna.c.

◆ SDNA_MAX_FILENAME_LENGTH

#define SDNA_MAX_FILENAME_LENGTH   255

Definition at line 61 of file makesdna.c.

Function Documentation

◆ add_name()

static int add_name ( const char *  str)
static

Ensure str is int the names array.

Parameters
strStruct member name which may include pointer prefix & array size.
Returns
Index in the names array.

Because of the weird way of tokenizing, we have to 'cast' function pointers to ... (*f)(), whatever the original signature. In fact, we add name and type at the same time... There are two special cases, unfortunately. These are explicitly checked.

Definition at line 413 of file makesdna.c.

References additional_slen_offset, BLI_memarena_alloc(), DEBUG_PRINTF, is_name_legal(), max_array_len, mem_arena, names, names_len, NULL, str, and STREQ.

Referenced by convert_include().

◆ add_struct()

static short * add_struct ( int  namecode)
static

Search whether this structure type was already found, and if not, add it.

Definition at line 552 of file makesdna.c.

References len, max_array_len, structdata, structs, and structs_len.

Referenced by convert_include().

◆ add_type()

static int add_type ( const char *  str,
int  size 
)
static

Ensure type str to is in the types array.

Parameters
strStruct name without any qualifiers.
sizeThe struct size in bytes.
Returns
Index in the types array.

Definition at line 360 of file makesdna.c.

References BLI_memarena_alloc(), max_array_len, mem_arena, size(), str, STREQ, types, types_align_32, types_align_64, types_len, types_size_32, types_size_64, types_size_native, and version_struct_static_from_alias().

Referenced by convert_include(), and make_structDNA().

◆ BLI_system_backtrace()

void BLI_system_backtrace ( FILE *  fp)

Write a backtrace into a file for systems which support it.

Definition at line 212 of file makesdna.c.

◆ calculate_struct_sizes()

static int calculate_struct_sizes ( int  firststruct,
FILE *  file_verify,
const char *  base_directory 
)
static

◆ check_field_alignment()

static bool check_field_alignment ( int  firststruct,
int  structtype,
int  type,
int  len,
const char *  name,
const char *  detail 
)
static

Definition at line 865 of file makesdna.c.

References len, result, type, types, and types_size_native.

Referenced by calculate_struct_sizes().

◆ convert_include()

static int convert_include ( const char *  filename)
static

◆ dna_rename_defs_ensure()

static void UNUSED_FUNCTION() dna_rename_defs_ensure ( void  )
static

Definition at line 1663 of file makesdna.c.

◆ dna_write()

static void dna_write ( FILE *  file,
const void *  pntr,
const int  size 
)
static

Construct the DNA.c file

Definition at line 1175 of file makesdna.c.

References data, file, MAX_DNA_LINE_LENGTH, and size().

Referenced by make_structDNA().

◆ is_name_legal()

static bool is_name_legal ( const char *  name)
static

Enforce '_pad123' naming convention, disallow 'pad123' or 'pad_123', special exception for [a-z] after since there is a 'pad_rot_angle' preference.

Definition at line 321 of file makesdna.c.

References Freestyle::c, and DNA_elem_id_strip_copy().

Referenced by add_name().

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 1485 of file makesdna.c.

References BASE_HEADER, ELEM, make_bad_file(), make_structDNA(), and NULL.

◆ make_bad_file()

static void make_bad_file ( const char *  file,
int  line 
)
static

Definition at line 1471 of file makesdna.c.

References file.

Referenced by main().

◆ make_structDNA()

static int make_structDNA ( const char *  base_directory,
FILE *  file,
FILE *  file_offsets,
FILE *  file_verify 
)
static

◆ preprocess_include()

static int preprocess_include ( char *  maindata,
const int  maindata_len 
)
static

Remove comments from this buffer. Assumes that the buffer refers to ascii-code text.

Definition at line 575 of file makesdna.c.

References Freestyle::a, MEM_freeN, and MEM_mallocN.

Referenced by convert_include().

◆ print_struct_sizes()

void print_struct_sizes ( void  )

Report all structures found so far, and print their lengths.

Definition at line 1190 of file makesdna.c.

References Freestyle::a, structs, structs_len, types, and types_size_native.

◆ read_file_data()

static void* read_file_data ( const char *  filename,
int *  r_len 
)
static

Definition at line 646 of file makesdna.c.

References data, L, MEM_freeN, MEM_mallocN, and NULL.

Referenced by convert_include().

◆ version_elem_static_from_alias()

static const char* version_elem_static_from_alias ( const int  strct,
const char *  elem_alias_full 
)
static

◆ version_struct_alias_from_static()

static const char* version_struct_alias_from_static ( const char *  str)
static

Definition at line 288 of file makesdna.c.

References BLI_ghash_lookup(), g_version_data, NULL, and str.

Referenced by calculate_struct_sizes(), and make_structDNA().

◆ version_struct_static_from_alias()

static const char* version_struct_static_from_alias ( const char *  str)
static

Definition at line 279 of file makesdna.c.

References BLI_ghash_lookup(), g_version_data, NULL, and str.

Referenced by add_type().

Variable Documentation

◆ additional_slen_offset

int additional_slen_offset
static

Definition at line 200 of file makesdna.c.

Referenced by add_name(), and convert_include().

◆ debugSDNA

int debugSDNA = 0
static

Variable to control debug output of makesdna. debugSDNA:

  • 0 = no output, except errors
  • 1 = detail actions
  • 2 = full trace, tell which names and types were found
  • 4 = full trace, plus all gritty details

Definition at line 199 of file makesdna.c.

Referenced by calculate_struct_sizes(), and make_structDNA().

◆ elem_map_alias_from_static

GHash* elem_map_alias_from_static

Definition at line 187 of file makesdna.c.

Referenced by DNA_sdna_alias_data_ensure(), and dna_sdna_alias_from_static_elem_full().

◆ elem_map_static_from_alias

GHash* elem_map_static_from_alias

Definition at line 188 of file makesdna.c.

◆ 

struct { ... } g_version_data

◆ includefiles

const char* includefiles[]
static

Definition at line 65 of file makesdna.c.

Referenced by calculate_struct_sizes(), and make_structDNA().

◆ max_array_len

int max_array_len = 50000
static

Definition at line 157 of file makesdna.c.

Referenced by add_name(), add_struct(), add_type(), and make_structDNA().

◆ max_data_size

int max_data_size = 500000
static

Definition at line 157 of file makesdna.c.

Referenced by make_structDNA().

◆ mem_arena

MemArena* mem_arena = NULL
static

◆ names

char** names
static

◆ names_len

int names_len = 0
static

Definition at line 158 of file makesdna.c.

Referenced by add_name(), driver_compile_simple_expr_impl(), and make_structDNA().

◆ struct_map_alias_from_static

GHash* struct_map_alias_from_static

Definition at line 185 of file makesdna.c.

Referenced by DNA_sdna_alias_data_ensure().

◆ struct_map_static_from_alias

GHash* struct_map_static_from_alias

Definition at line 186 of file makesdna.c.

◆ structdata

short * structdata
static

Definition at line 181 of file makesdna.c.

Referenced by add_struct(), and make_structDNA().

◆ structs

short** structs
static

At sp = structs[a] is the first address of a struct definition:

  • sp[0] is type number.
  • sp[1] is the length of the element array (next).
  • sp[2] sp[3] is [(type_index, name_index), ..] (number of pairs is defined by sp[1]),

Definition at line 181 of file makesdna.c.

Referenced by add_struct(), calculate_struct_sizes(), dna_struct_find_nr_ex_impl(), make_structDNA(), and print_struct_sizes().

◆ structs_len

int structs_len = 0
static

◆ types

char** types
static

◆ types_align_32

short* types_align_32
static

Contains align requirements for a struct on 32 bit systems.

Definition at line 168 of file makesdna.c.

Referenced by add_type(), calculate_struct_sizes(), and make_structDNA().

◆ types_align_64

short* types_align_64
static

Contains align requirements for a struct on 64 bit systems.

Definition at line 170 of file makesdna.c.

Referenced by add_type(), calculate_struct_sizes(), and make_structDNA().

◆ types_len

int types_len = 0
static

Definition at line 159 of file makesdna.c.

Referenced by add_type(), and make_structDNA().

◆ types_size_32

short* types_size_32
static

Contains sizes as they are calculated on 32 bit systems.

Definition at line 172 of file makesdna.c.

Referenced by add_type(), calculate_struct_sizes(), and make_structDNA().

◆ types_size_64

short* types_size_64
static

Contains sizes as they are calculated on 64 bit systems.

Definition at line 174 of file makesdna.c.

Referenced by add_type(), calculate_struct_sizes(), and make_structDNA().

◆ types_size_native

short* types_size_native
static

At types_size[a] is the size of type a on this systems bitness (32 or 64).

Definition at line 166 of file makesdna.c.

Referenced by add_type(), calculate_struct_sizes(), check_field_alignment(), make_structDNA(), and print_struct_sizes().