diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..838e06b --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ + +# Project specific +*Makefile +config.h +config.log +config.status +.deps/ +dia2code/dia2code +stamp-h1 diff --git a/dia2code/dia2code.c b/dia2code/dia2code.c index c7866c6..c1fd95e 100644 --- a/dia2code/dia2code.c +++ b/dia2code/dia2code.c @@ -332,6 +332,7 @@ endless_string * new_endless_string() endless_string *es = my_malloc(sizeof(endless_string)); es->start = NULL; es->end = NULL; + return es; } void destroy_endless_string(endless_string * es) @@ -759,7 +760,7 @@ void param_list_destroy() param_list * d2c_parameter_add(char *name, char *value) { param_list *entry; - entry = malloc(sizeof(d2c_parameters)); + entry = malloc(sizeof(param_list)); entry->name = strdup(name); entry->value = value ? strdup(value) : NULL; entry->next = d2c_parameters; diff --git a/dia2code/generate_code_cpp.c b/dia2code/generate_code_cpp.c index 8217b22..04f7f1b 100644 --- a/dia2code/generate_code_cpp.c +++ b/dia2code/generate_code_cpp.c @@ -68,7 +68,6 @@ pass_by_reference (umlclass *cl) if (strlen (st) == 0) return 1; if (eq (st, "CORBATypedef")) { - umlattrlist umla = cl->attributes; umlclassnode *ref = find_by_name (gb->classlist, cl->name); if (ref == NULL) return 0; @@ -625,4 +624,3 @@ generate_code_cpp (batch *b) d = d->next; } } - diff --git a/dia2code/generate_code_java.c b/dia2code/generate_code_java.c index c50ce93..3d1905e 100644 --- a/dia2code/generate_code_java.c +++ b/dia2code/generate_code_java.c @@ -129,7 +129,7 @@ void generate_code_java(batch *b) if (file_found) { d2c_parse_impl(dummyfile, "//", ""); - close(dummyfile); + fclose(dummyfile); if (d2c_backup(outfilename)) exit(5); } @@ -343,4 +343,3 @@ void generate_code_java(batch *b) tmplist = tmplist->next; } } - diff --git a/dia2code/generate_code_php_five.c b/dia2code/generate_code_php_five.c index 89ca4a5..3d86fc2 100644 --- a/dia2code/generate_code_php_five.c +++ b/dia2code/generate_code_php_five.c @@ -54,7 +54,7 @@ char *d2c_php_visibility(char vis) } } -/* +/* * php5 allows declaration of method arg types, * but only for non-built in types, return empty string for them */ @@ -62,7 +62,7 @@ int d2c_php_show_arg(char *arg) { // convert to lower case ? char *tmp = strtolower(arg); - int result = 1; + int result = 1; if (eq("int", tmp)|| eq("integer", tmp)|| eq("bool", tmp) || @@ -72,7 +72,7 @@ int d2c_php_show_arg(char *arg) eq("array", tmp)) { result = 0; } - + free(tmp); return result; } @@ -80,9 +80,9 @@ int d2c_php_show_arg(char *arg) /** * write comment block for a function */ -int d2c_php_print_func_comments(FILE *outfile, umloplist umlo) +void d2c_php_print_func_comments(FILE *outfile, umloplist umlo) { - + umlattrlist parama; char *tmpname; // begin function comments @@ -97,33 +97,32 @@ int d2c_php_print_func_comments(FILE *outfile, umloplist umlo) TABS, parama->key.type, parama->key.name); parama= parama->next; } - + if (strlen(umlo->key.attr.type) > 0) { fprintf(outfile, "%s * @return %s XXX\n", TABS, umlo->key.attr.type); } - + fprintf(outfile, "%s * @access ", TABS ); tmpname = d2c_php_visibility(umlo->key.attr.visibility); fprintf(outfile, "%s\n", tmpname); - + if (umlo->key.attr.isabstract) { fprintf(outfile, "%s * @abstract\n", TABS ); umlo->key.attr.value[0] = '0'; } - + if (umlo->key.attr.isstatic) { fprintf(outfile, "%s * @static ", TABS); } - + fprintf(outfile, "%s */\n", TABS ); - return 0; } /* - * write the function body + * write the function body */ -int d2c_php_print_func_code(FILE *outfile, umloplist umlo) +void d2c_php_print_func_code(FILE *outfile, umloplist umlo) { char *tmpname = d2c_php_visibility(umlo->key.attr.visibility); fprintf(outfile, TABS); @@ -162,7 +161,6 @@ int d2c_php_print_func_code(FILE *outfile, umloplist umlo) // don't print an empty body for abstract methods fprintf(outfile, ";\n\n"); } - return 0; } /* @@ -201,8 +199,8 @@ int d2c_php_print_attributes(FILE *outfile, umlclasslist tmplist) fprintf(outfile, "%s * XXX\n", TABS ); fprintf(outfile, "%s *\n", TABS ); fprintf(outfile, "%s * @var %s\n", TABS, umla->key.type); - fprintf(outfile, "%s * @access ", TABS); - + fprintf(outfile, "%s * @access ", TABS); + char *tmpname = d2c_php_visibility(umla->key.visibility); fprintf(outfile, "%s\n", tmpname); if (umla->key.isstatic) { @@ -225,17 +223,16 @@ int d2c_php_print_attributes(FILE *outfile, umlclasslist tmplist) /* * print class methods */ -int d2c_php_print_operations(FILE *outfile, umlclasslist tmplist) +void d2c_php_print_operations(FILE *outfile, umlclasslist tmplist) { umloplist umlo = tmplist->key->operations; fprintf(outfile, "%s// Operations\n", TABS); while (umlo != NULL) { // print each function - int result = d2c_php_print_func_comments(outfile, umlo); - int r2 = d2c_php_print_func_code(outfile, umlo); + d2c_php_print_func_comments(outfile, umlo); + d2c_php_print_func_code(outfile, umlo); umlo = umlo->next; } - return 0; } @@ -289,13 +286,13 @@ int d2c_php_print_class_desc(FILE *outfile, umlclasslist tmplist) { umlpackagelist tmppcklist; fprintf(outfile, "/**\n" ); - + fprintf(outfile, " * XXX detailed description\n" ); fprintf(outfile, " *\n" ); fprintf(outfile, " * @author XXX\n" ); fprintf(outfile, " * @version XXX\n" ); fprintf(outfile, " * @copyright XXX\n" ); - + tmppcklist = make_package_list(tmplist->key->package); if ( tmppcklist != NULL ) { int packcounter = 0; @@ -313,11 +310,11 @@ int d2c_php_print_class_desc(FILE *outfile, umlclasslist tmplist) } fprintf(outfile, "\n"); } - + if (tmplist->key->isabstract) { fprintf(outfile, " * @abstract\n" ); } - + fprintf(outfile, " */\n" ); return 0; } @@ -333,14 +330,14 @@ int d2c_php_print_class_decl(FILE *outfile, umlclasslist tmplist) tmpname = d2c_php_class_type(tmplist); // print class 'type' and name fprintf(outfile, "%s %s", tmpname, tmplist->key->name); - + parents = tmplist->parents; if (parents != NULL) { while (parents != NULL) { tmpname = strtolower(parents->key->stereotype); if (eq(tmpname, "interface")) { fprintf(outfile, " implements "); - } + } else { fprintf(outfile, " extends "); } @@ -375,9 +372,9 @@ FILE *d2c_php_getoutfile(umlclasslist tmplist, batch *b, FILE *outfile, int maxl /* * main function called to begin output * */ -void generate_code_php_five(batch *b) +void generate_code_php_five(batch *b) { - umlclasslist tmplist; + umlclasslist tmplist; char *tmpname; char outfilename[90]; FILE * outfile, *dummyfile, *licensefile = NULL; @@ -395,7 +392,7 @@ void generate_code_php_five(batch *b) licensefile = fopen(b->license, "r"); if(!licensefile) { fprintf(stderr, "Can't open the license file.\n"); - exit(2); + exit(2); } } // for each class @@ -439,4 +436,3 @@ void generate_code_php_five(batch *b) tmplist = tmplist->next; } } - diff --git a/dia2code/generate_code_ruby.c b/dia2code/generate_code_ruby.c index 4931738..5853ae9 100644 --- a/dia2code/generate_code_ruby.c +++ b/dia2code/generate_code_ruby.c @@ -174,7 +174,7 @@ void generate_code_ruby(batch *b) { if ( strlen(tmplist->key->comment) > 0 ) { fprintf(outfile,"# %s\n",tmplist->key->comment); } else { - fprintf(outfile,"# XXX\n",tmplist->key->comment); + fprintf(outfile,"# XXX\n"); } if (tmplist->key->isabstract) { diff --git a/dia2code/generate_code_shp.c b/dia2code/generate_code_shp.c index 102454a..4f45e56 100644 --- a/dia2code/generate_code_shp.c +++ b/dia2code/generate_code_shp.c @@ -1,10 +1,10 @@ /*************************************************************************** - generate_code_shp.c - generate batch file for - shapefile creation - ------------------- - begin : Tue Oct 16 2001 - copyright : (C) by Steffen Macke - email : sdteffen@yahoo.com + generate_code_shp.c - generate batch file for + shapefile creation + ------------------- +begin : Tue Oct 16 2001 +copyright : (C) by Steffen Macke +email : sdteffen@yahoo.com ***************************************************************************/ /*************************************************************************** @@ -22,17 +22,16 @@ void generate_code_shp(batch *b) { /* - umlclasslist tmplist,parents,dependencies; - umlassoclist associations; - namelist used_classes,tmpnamelist; - int tmpv; - umlattrlist umla,tmpa; - umloplist umlo; - */ + umlclasslist tmplist,parents,dependencies; + umlassoclist associations; + namelist used_classes,tmpnamelist; + int tmpv; + umlattrlist umla,tmpa; + umloplist umlo; + */ umlclasslist tmplist; umlclasslist parentlist, parentlist2; umlattrlist umla; - int tmpv; char *tmpname; char outfilename[256]; FILE * outfileshp, *dummyfile; @@ -79,86 +78,83 @@ void generate_code_shp(batch *b) { free(tmpname); - tmpv = -1; - - if(tmplist->key->isabstract == 0) { - - /* create attribute table */ - umla = tmplist->key->attributes; - parentlist = tmplist; - fprintf(outfileshp, "dbfcreate %s", tmplist->key->name); - - while ( umla != NULL) { - if((strcmp(umla->key.name,"Shape") != 0)&& - (umla->key.visibility != 1)) { - if(strcmp(umla->key.type,"String") == 0) { - fprintf(outfileshp, " -s %s 255", - umla->key.name); - } - else if((strcmp(umla->key.type, - "CodedValue") == 0)|| - strcmp(umla->key.type, "Integer") ==0 ) { - fprintf(outfileshp, " -n %s 16 0", - umla->key.name); - } - else if(strcmp(umla->key.type, "Float") == 0) { - fprintf(outfileshp, " -n %s 16 3", - umla->key.name); - } - } - umla = umla->next; - - if((umla == NULL)&&(parentlist != NULL)) { - parentlist = parentlist->parents; - if(parentlist != NULL) { - umla = parentlist->key->attributes; - parentlist2 = b->classlist; - while((strcmp(parentlist->key->name, - parentlist2->key->name) != 0)&& - (parentlist2 != NULL)) - parentlist2 = parentlist2->next; - parentlist = parentlist2; - } - } - - } - fprintf(outfileshp, "\n"); - - /* create shp file */ - umla = tmplist->key->attributes; - parentlist = tmplist; - while ( umla != NULL) { - if(strcmp(umla->key.name,"Shape") == 0) { - if(strcmp(strtolower(umla->key.type), - "polyline") == 0) { - strcpy(umla->key.type, "arc"); - } - fprintf(outfileshp, "shpcreate %s %s\n\n", - tmplist->key->name, - strtolower(umla->key.type)); - break; - } - umla = umla->next; - - if((umla == NULL)&&(parentlist != NULL)) { - parentlist = parentlist->parents; - if(parentlist != NULL) { - umla = parentlist->key->attributes; - parentlist2 = b->classlist; - while((strcmp(parentlist->key->name, - parentlist2->key->name) != 0)&& - (parentlist2 != NULL)) - parentlist2 = parentlist2->next; - parentlist = parentlist2; - } - } - - } - } - } - fclose(outfileshp); + if(tmplist->key->isabstract == 0) { + + /* create attribute table */ + umla = tmplist->key->attributes; + parentlist = tmplist; + fprintf(outfileshp, "dbfcreate %s", tmplist->key->name); + + while ( umla != NULL) { + if((strcmp(umla->key.name,"Shape") != 0)&& + (umla->key.visibility != 1)) { + if(strcmp(umla->key.type,"String") == 0) { + fprintf(outfileshp, " -s %s 255", + umla->key.name); + } + else if((strcmp(umla->key.type, + "CodedValue") == 0)|| + strcmp(umla->key.type, "Integer") ==0 ) { + fprintf(outfileshp, " -n %s 16 0", + umla->key.name); + } + else if(strcmp(umla->key.type, "Float") == 0) { + fprintf(outfileshp, " -n %s 16 3", + umla->key.name); + } + } + umla = umla->next; + + if((umla == NULL)&&(parentlist != NULL)) { + parentlist = parentlist->parents; + if(parentlist != NULL) { + umla = parentlist->key->attributes; + parentlist2 = b->classlist; + while((strcmp(parentlist->key->name, + parentlist2->key->name) != 0)&& + (parentlist2 != NULL)) + parentlist2 = parentlist2->next; + parentlist = parentlist2; + } + } + + } + fprintf(outfileshp, "\n"); + + /* create shp file */ + umla = tmplist->key->attributes; + parentlist = tmplist; + while ( umla != NULL) { + if(strcmp(umla->key.name,"Shape") == 0) { + if(strcmp(strtolower(umla->key.type), + "polyline") == 0) { + strcpy(umla->key.type, "arc"); + } + fprintf(outfileshp, "shpcreate %s %s\n\n", + tmplist->key->name, + strtolower(umla->key.type)); + break; + } + umla = umla->next; + + if((umla == NULL)&&(parentlist != NULL)) { + parentlist = parentlist->parents; + if(parentlist != NULL) { + umla = parentlist->key->attributes; + parentlist2 = b->classlist; + while((strcmp(parentlist->key->name, + parentlist2->key->name) != 0)&& + (parentlist2 != NULL)) + parentlist2 = parentlist2->next; + parentlist = parentlist2; + } + } + + } + } + fclose(outfileshp); + } } tmplist = tmplist->next; } } - diff --git a/dia2code/generate_code_sql.c b/dia2code/generate_code_sql.c index 803ef16..0e3e5f1 100644 --- a/dia2code/generate_code_sql.c +++ b/dia2code/generate_code_sql.c @@ -39,7 +39,6 @@ void generate_code_sql(batch *b) { */ umlclasslist tmplist; umlattrlist umla; - int tmpv; char *tmpname; char outfilename[256]; FILE * outfilesql, *dummyfile; @@ -53,7 +52,12 @@ void generate_code_sql(batch *b) { tmpdirlgth = strlen(b->outdir); tmplist = b->classlist; - + + if (tmplist == NULL) { + fprintf(stderr, "Sorry, no class found in your file.\n"); + exit(4); + } + tmpname = strtolower(tmplist->key->name); /* This prevents buffer overflows */ @@ -90,7 +94,7 @@ void generate_code_sql(batch *b) { if (tmplist->key->isabstract) { tmplist = tmplist->next; - continue; + continue; } /* Class (table) */ @@ -98,17 +102,15 @@ void generate_code_sql(batch *b) { /* Attributes (columns) */ fprintf(outfilesql, "-- Attributes --\n"); - tmpv = -1; umla = tmplist->key->attributes; inherit_attributes (tmplist->parents, umla); while ( umla != NULL) { - fprintf(outfilesql, "%s %s", umla->key.name, umla->key.type); + fprintf(outfilesql, " %s %s", umla->key.name, umla->key.type); if (umla->next != NULL) { fprintf(outfilesql, ",\n"); } umla = umla->next; } - fprintf(outfilesql, ");\n\n"); /* IsStatic attribute (Primary Key) */ umla = tmplist->key->attributes; @@ -116,19 +118,18 @@ void generate_code_sql(batch *b) { if( umla->key.isstatic ) { if( !seenFirst ) { seenFirst = 1; - fprintf(outfilesql, "ALTER TABLE %s ADD\n", tmplist->key->name); - fprintf(outfilesql, " CONSTRAINT PK_%s PRIMARY KEY\n (\n", tmplist->key->name); + fprintf(outfilesql, ",\n PRIMARY KEY (\n"); } - fprintf(outfilesql, " %s", umla->key.name); + fprintf(outfilesql, " %s", umla->key.name); if (umla->next != NULL && umla->next->key.isstatic) { - fprintf(outfilesql, ","); + fprintf(outfilesql, ",\n"); } - fprintf(outfilesql, "\n"); } umla = umla->next; } - if( seenFirst ) - fprintf(outfilesql, " );\n\n\n"); + if (seenFirst) fprintf(outfilesql, ")\n"); + + fprintf(outfilesql, ");\n\n"); } tmplist = tmplist->next; @@ -142,17 +143,16 @@ void generate_code_sql(batch *b) { while( temp != NULL ) { fprintf( outfilesql, "\n\nALTER TABLE %s ADD\n", temp->key->name ); - fprintf( outfilesql, " CONSTRAINT FK_%s_%s FOREIGN KEY(%s) REFERENCES %s (%s);\n", - temp->key->name, - tmplist->key->name, - temp->name, - tmplist->key->name, + fprintf( outfilesql, " CONSTRAINT FK_%s_%s FOREIGN KEY(%s) REFERENCES %s (%s);\n", + temp->key->name, + tmplist->key->name, + temp->name, + tmplist->key->name, temp->name ); temp = temp->next; } tmplist = tmplist->next; } - fprintf(stderr, "Finished!"); + fprintf(stderr, "Finished!\n"); fclose(outfilesql); } - diff --git a/dia2code/main.c b/dia2code/main.c index 592fa51..f449805 100644 --- a/dia2code/main.c +++ b/dia2code/main.c @@ -39,6 +39,12 @@ find_dia2code_module(const char *lang) { else homedir = strdup("."); + // handle strdup fail + if (homedir == NULL) { + fprintf(stderr, "Memory error, aborting"); + exit(4); + } + modulename = (char*)malloc(strlen(DSO_PREFIX) + strlen(lang) + 1); sprintf(modulename, "%s%s", DSO_PREFIX, lang); @@ -254,7 +260,7 @@ parameter = -1; /* error */ #else strcpy(inifile, "~/.dia2code/dia2code.ini"); #endif - process_initialization_file(inifile, 0); + process_initialization_file(inifile, 0); } } @@ -379,7 +385,7 @@ int process_initialization_file(char *filename, int exit_if_not_found) int line = 0; int slen; char s[HUGE_BUFFER]; - + if (f == NULL) if (exit_if_not_found) { @@ -415,6 +421,6 @@ int process_initialization_file(char *filename, int exit_if_not_found) parse_command(name, param); } fclose(f); - + return 1; } diff --git a/dia2code/parse_diagram.c b/dia2code/parse_diagram.c index 611afbe..38ed26a 100644 --- a/dia2code/parse_diagram.c +++ b/dia2code/parse_diagram.c @@ -194,7 +194,9 @@ void parse_attribute(xmlNodePtr node, umlattribute *tmp) { free(attrval); } else if ( ! strcmp("abstract", nodename)) { tmp->isabstract = parse_boolean(node->xmlChildrenNode); - } else if ( ! strcmp("class_scope", nodename)) { + } else if ( ! strcmp("class_scope", nodename) || + ! strcmp("primary_key", nodename)) { + // the SQL code generator defines static attributes as primary keys tmp->isstatic = parse_boolean(node->xmlChildrenNode); } free(nodename); @@ -408,6 +410,7 @@ umlclasslist parse_class(xmlNodePtr class) { myself = (umlclass*) my_malloc (sizeof(umlclass)); myself->package = NULL; + myself->isabstract = 0; listmyself->key = myself; listmyself->parents = NULL; @@ -468,7 +471,7 @@ umlclasslist parse_class(xmlNodePtr class) { */ void lolipop_implementation(umlclasslist classlist, xmlNodePtr object) { xmlNodePtr attribute; - xmlChar *id = NULL, *name = NULL; + xmlChar *id = NULL, *name = ""; xmlChar *attrname; umlclasslist interface, implementator; @@ -481,8 +484,6 @@ void lolipop_implementation(umlclasslist classlist, xmlNodePtr object) { if ( ! strcmp("text", attrname) && attribute->xmlChildrenNode != NULL && attribute->xmlChildrenNode->xmlChildrenNode != NULL ){ name = attribute->xmlChildrenNode->xmlChildrenNode->content; - } else { - name = ""; } free(attrname); } @@ -583,7 +584,7 @@ umlclasslist parse_diagram(char *diafile) { while (object != NULL) { objtype = xmlGetProp(object, "type"); /* Here we have a Dia object */ - if ( !strcmp("UML - Class", objtype) ) { + if ( !strcmp("UML - Class", objtype) || !strcmp("Database - Table", objtype)) { /* Here we have a class definition */ tmplist = parse_class(object); if (tmplist != NULL) { diff --git a/dia2code/parse_diagram.h b/dia2code/parse_diagram.h index f6bf277..4a7a19c 100644 --- a/dia2code/parse_diagram.h +++ b/dia2code/parse_diagram.h @@ -18,4 +18,4 @@ #include "dia2code.h" umlclasslist parse_diagram(char *diafile); - +umlattrlist insert_attribute(umlattrlist n, umlattrlist l);