Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/makesdna/intern/makesdna.c')
-rw-r--r--source/blender/makesdna/intern/makesdna.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index fc94a8d9ff4..b78299316e1 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -968,7 +968,7 @@ void printStructLengths(void)
}
-static int make_structDNA(const char *baseDirectory, FILE *file)
+static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offsets)
{
int len, i;
const short *sp;
@@ -1159,6 +1159,19 @@ static int make_structDNA(const char *baseDirectory, FILE *file)
/* end end padding test */
}
+ /* write a simple enum with all structs offsets,
+ * should only be accessed via SDNA_TYPE_FROM_STRUCT macro */
+ {
+ fprintf(file_offsets, "#define SDNA_TYPE_FROM_STRUCT(id) _SDNA_TYPE_##id\n");
+ fprintf(file_offsets, "enum {\n");
+ for (i = 0; i < nr_structs; i++) {
+ const short *structpoin = structs[i];
+ const int structtype = structpoin[0];
+ fprintf(file_offsets, "\t_SDNA_TYPE_%s = %d,\n", types[structtype], i);
+ }
+ fprintf(file_offsets, "\tSDNA_TYPE_MAX = %d,\n", nr_structs);
+ fprintf(file_offsets, "};\n");
+ }
MEM_freeN(namedata);
MEM_freeN(typedata);
@@ -1190,43 +1203,53 @@ static void make_bad_file(const char *file, int line)
int main(int argc, char **argv)
{
- FILE *file;
int return_status = 0;
- if (argc != 2 && argc != 3) {
- printf("Usage: %s outfile.c [base directory]\n", argv[0]);
+ if (argc != 3 && argc != 4) {
+ printf("Usage: %s dna.c dna_struct_offsets.h [base directory]\n", argv[0]);
return_status = 1;
}
else {
- file = fopen(argv[1], "w");
- if (!file) {
+ FILE *file_dna = fopen(argv[1], "w");
+ FILE *file_dna_offsets = fopen(argv[2], "w");
+ if (!file_dna) {
printf("Unable to open file: %s\n", argv[1]);
return_status = 1;
}
+ else if (!file_dna_offsets) {
+ printf("Unable to open file: %s\n", argv[2]);
+ return_status = 1;
+ }
else {
const char *baseDirectory;
- if (argc == 3) {
- baseDirectory = argv[2];
+ if (argc == 4) {
+ baseDirectory = argv[3];
}
else {
baseDirectory = BASE_HEADER;
}
- fprintf(file, "const unsigned char DNAstr[] = {\n");
- if (make_structDNA(baseDirectory, file)) {
+ fprintf(file_dna, "const unsigned char DNAstr[] = {\n");
+ if (make_structDNA(baseDirectory, file_dna, file_dna_offsets)) {
/* error */
- fclose(file);
+ fclose(file_dna);
+ file_dna = NULL;
make_bad_file(argv[1], __LINE__);
return_status = 1;
}
else {
- fprintf(file, "};\n");
- fprintf(file, "const int DNAlen = sizeof(DNAstr);\n");
-
- fclose(file);
+ fprintf(file_dna, "};\n");
+ fprintf(file_dna, "const int DNAlen = sizeof(DNAstr);\n");
}
}
+
+ if (file_dna) {
+ fclose(file_dna);
+ }
+ if (file_dna_offsets) {
+ fclose(file_dna_offsets);
+ }
}