Merged changes in the trunk up to revision 42116.
[blender.git] / source / blender / makesdna / intern / makesdna.c
index 8b841b67e548ea2c7d9983e023bee59a8c18678b..6d96f423afb372f6911dcab747cb975d789ba960 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -50,7 +48,7 @@
  * numbers give more output.
  * */
 
-#define DNA_VERSION_DATE "$Id$"
+#define DNA_VERSION_DATE "FIXME-DNA_VERSION_DATE"
 
 #include <string.h>
 #include <stdlib.h>
@@ -66,7 +64,7 @@
 
 /* Included the path relative from /source/blender/ here, so we can move     */
 /* headers around with more freedom.                                         */
-const char *includefiles[] = {
+static const char *includefiles[] = {
 
        // if you add files here, please add them at the end
        // of makesdna.c (this file) as well
@@ -132,23 +130,29 @@ const char *includefiles[] = {
        "DNA_anim_types.h",
        "DNA_boid_types.h",
        "DNA_smoke_types.h",
+       "DNA_speaker_types.h",
+       "DNA_movieclip_types.h",
+       "DNA_tracking_types.h",
+       "DNA_dynamicpaint_types.h",
+       "DNA_freestyle_types.h",
+       "DNA_linestyle_types.h",
 
        // empty string to indicate end of includefiles
        ""
 };
 
-int maxdata= 500000, maxnr= 50000;
-int nr_names=0;
-int nr_types=0;
-int nr_structs=0;
-char **names, *namedata;               /* at address names[a] is string a */
-char **types, *typedata;               /* at address types[a] is string a */
-short *typelens;                               /* at typelens[a] is de length of type a */
-short *alphalens;                          /* contains sizes as they are calculated on the DEC Alpha (64 bits) */
-short **structs, *structdata;  /* at sp= structs[a] is the first address of a struct definition
-                                                                  sp[0] is type number
-                                                                  sp[1] is amount of elements
-                                                                  sp[2] sp[3] is typenr,  namenr (etc) */
+static int maxdata= 500000, maxnr= 50000;
+static int nr_names=0;
+static int nr_types=0;
+static int nr_structs=0;
+static char **names, *namedata;                /* at address names[a] is string a */
+static char **types, *typedata;                /* at address types[a] is string a */
+static short *typelens;                                /* at typelens[a] is de length of type a */
+static short *alphalens;                       /* contains sizes as they are calculated on the DEC Alpha (64 bits), infact any 64bit system */
+static short **structs, *structdata;/* at sp= structs[a] is the first address of a struct definition
+                                       sp[0] is type number
+                                       sp[1] is amount of elements
+                                       sp[2] sp[3] is typenr,  namenr (etc) */
 /**
  * Variable to control debug output of makesdna.
  * debugSDNA:
@@ -157,8 +161,8 @@ short **structs, *structdata;       /* at sp= structs[a] is the first address of a str
  *  - 2 = full trace, tell which names and types were found
  *  - 4 = full trace, plus all gritty details
  */
-int debugSDNA = 0;
-int additional_slen_offset;
+static int debugSDNA = 0;
+static int additional_slen_offset;
 
 /* ************************************************************************** */
 /* Functions                                                                  */
@@ -169,35 +173,35 @@ int additional_slen_offset;
  * \param str char
  * \param len int
  */
-int add_type(const char *str, int len);
+static int add_type(const char *str, int len);
 
 /**
  * Add variable \c str to 
  * \param str
  */
-int add_name(char *str);
+static int add_name(const char *str);
 
 /**
  * Search whether this structure type was already found, and if not,
  * add it.
  */
-short *add_struct(int namecode);
+static short *add_struct(int namecode);
 
 /**
  * Remove comments from this buffer. Assumes that the buffer refers to
  * ascii-code text.
  */
-int preprocess_include(char *maindata, int len);
+static int preprocess_include(char *maindata, int len);
 
 /**
  * Scan this file for serializable types.
  */ 
-int convert_include(char *filename);
+static int convert_include(char *filename);
 
 /**
  * Determine how many bytes are needed for an array.
  */ 
-int arraysize(char *astr, int len);
+static int arraysize(char *astr, int len);
 
 /**
  * Determine how many bytes are needed for each struct.
@@ -222,7 +226,7 @@ void printStructLenghts(void);
 
 /* ************************* MAKEN DNA ********************** */
 
-int add_type(const char *str, int len)
+static int add_type(const char *str, int len)
 {
        int nr;
        char *cp;
@@ -268,12 +272,12 @@ int add_type(const char *str, int len)
  * cases, unfortunately. These are explicitly checked.
  *
  * */
-int add_name(char *str)
+static int add_name(const char *str)
 {
        int nr, i, j, k;
        char *cp;
        char buf[255]; /* stupid limit, change it :) */
-       char *name;
+       const char *name;
 
        additional_slen_offset = 0;
        
@@ -397,7 +401,7 @@ int add_name(char *str)
        return nr_names-1;
 }
 
-short *add_struct(int namecode)
+static short *add_struct(int namecode)
 {
        int len;
        short *sp;
@@ -423,7 +427,7 @@ short *add_struct(int namecode)
        return sp;
 }
 
-int preprocess_include(char *maindata, int len)
+static int preprocess_include(char *maindata, int len)
 {
        int a, newlen, comment = 0;
        char *cp, *temp, *md;
@@ -520,7 +524,7 @@ static void *read_file_data(char *filename, int *len_r)
        return data;
 }
 
-int convert_include(char *filename)
+static int convert_include(char *filename)
 {
        /* read include file, skip structs with a '#' before it.
           store all data in temporal arrays.
@@ -657,7 +661,7 @@ int convert_include(char *filename)
        return 0;
 }
 
-int arraysize(char *astr, int len)
+static int arraysize(char *astr, int len)
 {
        int a, mul=1;
        char str[100], *cp=NULL;
@@ -670,6 +674,8 @@ int arraysize(char *astr, int len)
                }
                else if( str[a]==']' && cp) {
                        str[a]= 0;
+                       /* 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);
                }
        }
@@ -713,7 +719,12 @@ static int calculate_structlens(int firststruct)
                                                /* has the name an extra length? (array) */
                                                mul= 1;
                                                if( cp[namelen-1]==']') mul= arraysize(cp, namelen);
-                                               
+
+                                               if (mul == 0) {
+                                                       printf("Zero array size found or could not parse %s: '%.*s'\n", types[structtype], namelen + 1, cp);
+                                                       dna_error = 1;
+                                               }
+
                                                /* 4-8 aligned/ */
                                                if(sizeof(void *) == 4) {
                                                        if (len % 4) {
@@ -743,7 +754,12 @@ static int calculate_structlens(int firststruct)
                                                /* has the name an extra length? (array) */
                                                mul= 1;
                                                if( cp[namelen-1]==']') mul= arraysize(cp, namelen);
-                                               
+
+                                               if (mul == 0) {
+                                                       printf("Zero array size found or could not parse %s: '%.*s'\n", types[structtype], namelen + 1, cp);
+                                                       dna_error = 1;
+                                               }
+
                                                /* struct alignment */
                                                if(type >= firststruct) {
                                                        if(sizeof(void *)==8 && (len % 8) ) {
@@ -877,7 +893,7 @@ void printStructLenghts(void)
 }
 
 
-int make_structDNA(char *baseDirectory, FILE *file)
+static int make_structDNA(char *baseDirectory, FILE *file)
 {
        int len, i;
        short *sp;
@@ -1076,7 +1092,7 @@ int make_structDNA(char *baseDirectory, FILE *file)
 
 /* ************************* END MAKE DNA ********************** */
 
-static void make_bad_file(char *file, int line)
+static void make_bad_file(const char *file, int line)
 {
        FILE *fp= fopen(file, "w");
        fprintf(fp, "#error \"Error! can't make correct DNA.c file from %s:%d, STUPID!\"\n", __FILE__, line);
@@ -1184,4 +1200,10 @@ int main(int argc, char ** argv)
 #include "DNA_anim_types.h"
 #include "DNA_boid_types.h"
 #include "DNA_smoke_types.h"
+#include "DNA_speaker_types.h"
+#include "DNA_movieclip_types.h"
+#include "DNA_tracking_types.h"
+#include "DNA_dynamicpaint_types.h"
+#include "DNA_freestyle_types.h"
+#include "DNA_linestyle_types.h"
 /* end of list */