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:
authorCampbell Barton <ideasman42@gmail.com>2019-02-12 09:03:16 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-02-12 09:09:57 +0300
commitd968db82b7aac37cd788a490997376004b5ce9eb (patch)
tree77724503d5638cbcc226e6a94b16a6ff8fe0275a
parentf96bfde4a5ef3c3c0b2878dec3828a967fda86cc (diff)
makesdna: add shared utility module
Currently only a single function was duplicated which isn't so bad, this change is to allow DNA versioning code to be shared between dna_genfile.c and makesdna.c.
-rw-r--r--source/blender/makesdna/DNA_genfile.h3
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt4
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c42
-rw-r--r--source/blender/makesdna/intern/dna_utils.c63
-rw-r--r--source/blender/makesdna/intern/dna_utils.h25
-rw-r--r--source/blender/makesdna/intern/makesdna.c34
6 files changed, 102 insertions, 69 deletions
diff --git a/source/blender/makesdna/DNA_genfile.h b/source/blender/makesdna/DNA_genfile.h
index 4f67246c891..0d330c8999a 100644
--- a/source/blender/makesdna/DNA_genfile.h
+++ b/source/blender/makesdna/DNA_genfile.h
@@ -24,6 +24,8 @@
#ifndef __DNA_GENFILE_H__
#define __DNA_GENFILE_H__
+#include "intern/dna_utils.h"
+
struct SDNA;
/**
@@ -94,7 +96,6 @@ void *DNA_struct_reconstruct(
const struct SDNA *newsdna, const struct SDNA *oldsdna,
const char *compflags, int oldSDNAnr, int blocks, const void *data);
-int DNA_elem_array_size(const char *str);
int DNA_elem_offset(struct SDNA *sdna, const char *stype, const char *vartype, const char *name);
bool DNA_struct_find(const struct SDNA *sdna, const char *stype);
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index ad84ffc68c1..4d6ad4b4389 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -33,6 +33,7 @@ blender_include_dirs(
# -----------------------------------------------------------------------------
# Build makesdna executable
set(SRC
+ dna_utils.c
makesdna.c
../../blenlib/intern/BLI_memarena.c
../../../../intern/guardedalloc/intern/mallocn.c
@@ -78,9 +79,12 @@ set(INC_SYS
)
set(SRC
+ dna_utils.c
dna_genfile.c
${CMAKE_CURRENT_BINARY_DIR}/dna.c
${SRC_DNA_INC}
+
+ dna_utils.h
)
set_source_files_properties(
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index 3d0f4fa1aab..04fd7596e1b 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -134,48 +134,6 @@
# define MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a))
#endif
-/* ************************* MAKE DNA ********************** */
-
-/* allowed duplicate code from makesdna.c */
-
-/**
- * parses the "[n1][n2]..." on the end of an array name and returns the number of array elements n1*n2*...
- */
-int DNA_elem_array_size(const char *str)
-{
- int result = 1;
- int current = 0;
- while (true) {
- char c = *str++;
- switch (c) {
- case '\0':
- return result;
- case '[':
- current = 0;
- break;
- case ']':
- result *= current;
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- current = current * 10 + (c - '0');
- break;
- default:
- break;
- }
- }
-}
-
-/* ************************* END MAKE DNA ********************** */
-
/* ************************* DIV ********************** */
void DNA_sdna_free(SDNA *sdna)
diff --git a/source/blender/makesdna/intern/dna_utils.c b/source/blender/makesdna/intern/dna_utils.c
new file mode 100644
index 00000000000..515315cce00
--- /dev/null
+++ b/source/blender/makesdna/intern/dna_utils.c
@@ -0,0 +1,63 @@
+/*
+ * 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 2
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright (C) 2018 Blender Foundation.
+ */
+
+/** \file \ingroup DNA
+ *
+ * Utilities for stand-alone makesdna.c and Blender to share.
+ */
+
+#include "BLI_sys_types.h"
+
+#include "dna_utils.h"
+
+/**
+ * Parses the `[n1][n2]...` on the end of an array name
+ * and returns the number of array elements `n1 * n2 ...`.
+ */
+int DNA_elem_array_size(const char *str)
+{
+ int result = 1;
+ int current = 0;
+ while (true) {
+ char c = *str++;
+ switch (c) {
+ case '\0':
+ return result;
+ case '[':
+ current = 0;
+ break;
+ case ']':
+ result *= current;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ current = current * 10 + (c - '0');
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/source/blender/makesdna/intern/dna_utils.h b/source/blender/makesdna/intern/dna_utils.h
new file mode 100644
index 00000000000..69b265be27a
--- /dev/null
+++ b/source/blender/makesdna/intern/dna_utils.h
@@ -0,0 +1,25 @@
+/*
+ * 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 2
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file \ingroup DNA
+ */
+
+#ifndef __DNA_UTILS_H__
+#define __DNA_UTILS_H__
+
+int DNA_elem_array_size(const char *str);
+
+#endif /* __DNA_UTILS_H__ */
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index f957bf637c3..e2616d91b27 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -49,6 +49,8 @@
#include "BLI_sys_types.h" /* for intptr_t support */
#include "BLI_memarena.h"
+#include "dna_utils.h"
+
#define SDNA_MAX_FILENAME_LENGTH 255
/* Included the path relative from /source/blender/ here, so we can move */
@@ -210,11 +212,6 @@ static int preprocess_include(char *maindata, int len);
static int convert_include(const char *filename);
/**
- * Determine how many bytes are needed for an array.
- */
-static int arraysize(const char *str);
-
-/**
* Determine how many bytes are needed for each struct.
*/
static int calculate_structlens(int);
@@ -723,25 +720,6 @@ static int convert_include(const char *filename)
return 0;
}
-static int arraysize(const char *str)
-{
- int a, mul = 1;
- const char *cp = NULL;
-
- for (a = 0; str[a]; a++) {
- if (str[a] == '[') {
- cp = &(str[a + 1]);
- }
- else if (str[a] == ']' && cp) {
- /* if 'cp' is a preprocessor definition, it will evaluate to 0,
- * the caller needs to check for this case and throw an error */
- mul *= atoi(cp);
- }
- }
-
- return mul;
-}
-
static bool check_field_alignment(int firststruct, int structtype, int type, int len,
const char *name, const char *detail)
{
@@ -798,7 +776,9 @@ static int calculate_structlens(int firststruct)
has_pointer = 1;
/* has the name an extra length? (array) */
int mul = 1;
- if (cp[namelen - 1] == ']') mul = arraysize(cp);
+ if (cp[namelen - 1] == ']') {
+ mul = DNA_elem_array_size(cp);
+ }
if (mul == 0) {
fprintf(stderr, "Zero array size found or could not parse %s: '%.*s'\n",
@@ -843,7 +823,9 @@ static int calculate_structlens(int firststruct)
else if (typelens_native[type]) {
/* has the name an extra length? (array) */
int mul = 1;
- if (cp[namelen - 1] == ']') mul = arraysize(cp);
+ if (cp[namelen - 1] == ']') {
+ mul = DNA_elem_array_size(cp);
+ }
if (mul == 0) {
fprintf(stderr, "Zero array size found or could not parse %s: '%.*s'\n",