Code

Add a warning to sp-object.h to not use some of the new methods
[inkscape.git] / src / deptool.cpp
index cf58a7902544fd723e9fdfc84871b866f51049a4..45a01c4e7517e5e619dd9376fc605c700870d119 100644 (file)
@@ -159,10 +159,14 @@ public:
     std::map<String, FileRec *> files;
 
 
+    bool checked;
+
 private:
 
     void init()
         {
+        type    = UNKNOWN;
+        checked = false;
         }
 
     void assign(const FileRec &other)
@@ -172,6 +176,7 @@ private:
         baseName = other.baseName;
         suffix   = other.suffix;
         files    = other.files;
+        checked  = other.checked;
         }
 
 };
@@ -282,7 +287,12 @@ private:
     /**
      *
      */
-    bool saveDepFile();
+    bool saveDepFile(bool doXml);
+
+    /**
+     *
+     */
+    bool saveCmakeFile();
 
     /**
      *
@@ -353,6 +363,9 @@ private:
 
     char *fileBuf;
     int   fileSize;
+    
+    static const int readBufLen = 8192;
+    char readBuf[8193];
 
 
 };
@@ -484,7 +497,7 @@ void DepTool::parseName(const String &fullname,
     if (fullname.size() < 2)
         return;
 
-    unsigned int pos = fullname.find_last_of('/');
+    String::size_type pos = fullname.find_last_of('/');
     if (pos != fullname.npos && pos<fullname.size()-1)
         {
         path = fullname.substr(0, pos);
@@ -516,7 +529,7 @@ String DepTool::getSuffix(const String &fname)
 {
     if (fname.size() < 2)
         return "";
-    unsigned int pos = fname.find_last_of('.');
+    String::size_type pos = fname.find_last_of('.');
     if (pos == fname.npos)
         return "";
     pos++;
@@ -792,12 +805,11 @@ bool DepTool::scanFile(const String &fname, FileRec *frec)
         return false;
         }
     String buf;
-    while (true)
+    while (!feof(f))
         {
-        int ch = fgetc(f);
-        if (ch < 0)
-            break;
-        buf.push_back((char)ch);
+        int len = fread(readBuf, 1, readBufLen, f);
+        readBuf[len] = '\0';
+        buf.append(readBuf);
         }
     fclose(f);
 
@@ -967,6 +979,7 @@ bool DepTool::generateDependencies()
 
             processDependency(ofile, include, 0);
             }
+        /*
         else if (include->type == FileRec::HFILE)
             {
             String fname     = iter->first;
@@ -979,6 +992,7 @@ bool DepTool::generateDependencies()
 
             processReference(hfile, fname, 0);
             }
+        */
         }
 
       
@@ -996,8 +1010,9 @@ bool DepTool::run()
         return false;
     if (!generateDependencies())
         return false;
-    saveDepFile();
-    saveRefFile(true);
+    saveDepFile(false);
+    saveCmakeFile();
+    //saveRefFile(true);
     return true;
 }
 
@@ -1076,7 +1091,7 @@ bool DepTool::saveFileList()
  *   This is the main product.  This file lists the Include directives,
  *   the Object list, and the dependency list.
  */
-bool DepTool::saveDepFile()
+bool DepTool::saveDepFile(bool doXml)
 {
     time_t tim;
     time(&tim);
@@ -1086,76 +1101,168 @@ bool DepTool::saveDepFile()
         {
         trace("cannot open 'make.dep' for writing");
         }
-    fprintf(f, "########################################################\n");
-    fprintf(f, "## File: make.dep\n");
-    fprintf(f, "## Generated by DepTool at :%s", ctime(&tim));
-    fprintf(f, "########################################################\n");
+    if (doXml)
+        {
+        fprintf(f, "<?xml version='1.0'?>\n");
+        fprintf(f, "<deptool>\n");
+        fprintf(f, "\n");
+        fprintf(f, "<!--\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## File: make.dep\n");
+        fprintf(f, "## Generated by DepTool at :%s", ctime(&tim));
+        fprintf(f, "########################################################\n");
+        fprintf(f, "-->\n");
 
-    fprintf(f, "\n\n");
+        fprintf(f, "\n\n");
     
-    fprintf(f, "########################################################\n");
-    fprintf(f, "## I N C L U D E\n");
-    fprintf(f, "########################################################\n");
-    fprintf(f, "DEPTOOL_INCLUDE =");
+        fprintf(f, "\n");
+        fprintf(f, "<!--\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## I N C L U D E\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "-->\n");
+        fprintf(f, "<includes>\n");
     
-    std::vector<String>::iterator inciter;
-    for (inciter=directories.begin() ; inciter!=directories.end() ; inciter++)
-        {
-        fprintf(f, " \\\n");
-        String dirname = *inciter;
-        fprintf(f, "-I%s", dirname.c_str());
-        }
+        std::vector<String>::iterator inciter;
+        for (inciter=directories.begin() ; inciter!=directories.end() ; inciter++)
+            {
+            String dirname = *inciter;
+            fprintf(f, "    <inc name='%s'/>\n", dirname.c_str());
+            }
 
-    fprintf(f, "\n\n\n");
-    fprintf(f, "########################################################\n");
-    fprintf(f, "## O B J E C T S\n");
-    fprintf(f, "########################################################\n");
-    fprintf(f, "DEPTOOL_OBJECTS =");
+        fprintf(f, "</includes>\n");
+        fprintf(f, "\n\n\n");
+        fprintf(f, "<!--\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## O B J E C T S\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "-->\n");
+        fprintf(f, "<objects>\n");
     
-    std::map<String, FileRec *>::iterator oiter;
-    for (oiter=allFiles.begin() ; oiter!=allFiles.end() ; oiter++)
-        {
-        FileRec *frec = oiter->second;
-        if (frec->type == FileRec::CFILE)
+        std::map<String, FileRec *>::iterator oiter;
+        for (oiter=allFiles.begin() ; oiter!=allFiles.end() ; oiter++)
             {
-            fprintf(f, " \\\n");
-            String fname = frec->path;
-            if (fname.size()>0)
-                fname.append("/");
-            fname.append(frec->baseName);
-            fname.append(".o");
-            fprintf(f, "%s", fname.c_str());
+            FileRec *frec = oiter->second;
+            if (frec->type == FileRec::CFILE)
+                {
+                String fname = frec->path;
+                if (fname.size()>0)
+                    fname.append("/");
+                fname.append(frec->baseName);
+                fname.append(".o");
+                fprintf(f, "   <obj name='%s'/>\n", fname.c_str());
+                }
             }
-        }
 
 
-    fprintf(f, "\n\n\n");
-    fprintf(f, "########################################################\n");
-    fprintf(f, "## D E P E N D E N C I E S\n");
-    fprintf(f, "########################################################\n");
-    std::map<String, FileRec *>::iterator iter;
-    for (iter=depFiles.begin() ; iter!=depFiles.end() ; iter++)
+        fprintf(f, "</objects>\n");
+        fprintf(f, "\n\n\n");
+        fprintf(f, "<!--\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## D E P E N D E N C I E S\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "-->\n");
+        fprintf(f, "<dependencies>\n\n");
+        std::map<String, FileRec *>::iterator iter;
+        for (iter=depFiles.begin() ; iter!=depFiles.end() ; iter++)
+            {
+            FileRec *frec = iter->second;
+            if (frec->type == FileRec::OFILE)
+                {
+                String fname = iter->first;
+                fprintf(f, "<file name='%s'>\n", fname.c_str());
+                std::map<String, FileRec *>::iterator citer;
+                for (citer=frec->files.begin() ; citer!=frec->files.end() ; citer++)
+                    {
+                    String cfname = citer->first;
+                    fprintf(f, "    <dep name='%s'/>\n", cfname.c_str());
+                    }
+                fprintf(f, "</file>\n\n");
+                }
+            }
+
+        fprintf(f, "</dependencies>\n");
+        fprintf(f, "\n\n\n");
+        fprintf(f, "</deptool>\n");
+        fprintf(f, "<!--\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## E N D\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "-->\n");
+        }
+    else // ######### !XML
         {
-        FileRec *frec = iter->second;
-        if (frec->type == FileRec::OFILE)
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## File: make.dep\n");
+        fprintf(f, "## Generated by DepTool at :%s", ctime(&tim));
+        fprintf(f, "########################################################\n");
+
+        fprintf(f, "\n\n");
+    
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## I N C L U D E\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "DEPTOOL_INCLUDE =");
+    
+        std::vector<String>::iterator inciter;
+        for (inciter=directories.begin() ; inciter!=directories.end() ; inciter++)
+            {
+            fprintf(f, " \\\n");
+            String dirname = *inciter;
+            fprintf(f, "-I%s", dirname.c_str());
+            }
+
+        fprintf(f, "\n\n\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## O B J E C T S\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "DEPTOOL_OBJECTS =");
+    
+        std::map<String, FileRec *>::iterator oiter;
+        for (oiter=allFiles.begin() ; oiter!=allFiles.end() ; oiter++)
             {
-            String fname = iter->first;
-            fprintf(f, "%s:", fname.c_str());
-            std::map<String, FileRec *>::iterator citer;
-            for (citer=frec->files.begin() ; citer!=frec->files.end() ; citer++)
+            FileRec *frec = oiter->second;
+            if (frec->type == FileRec::CFILE)
                 {
-                String cfname = citer->first;
                 fprintf(f, " \\\n");
-                fprintf(f, "\t%s", cfname.c_str());
+                String fname = frec->path;
+                if (fname.size()>0)
+                    fname.append("/");
+                fname.append(frec->baseName);
+                fname.append(".o");
+                fprintf(f, "%s", fname.c_str());
                 }
-            fprintf(f, "\n\n\n");
             }
-        }
 
-    fprintf(f, "\n\n\n");
-    fprintf(f, "########################################################\n");
-    fprintf(f, "## E N D\n");
-    fprintf(f, "########################################################\n");
+
+        fprintf(f, "\n\n\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## D E P E N D E N C I E S\n");
+        fprintf(f, "########################################################\n");
+        std::map<String, FileRec *>::iterator iter;
+        for (iter=depFiles.begin() ; iter!=depFiles.end() ; iter++)
+            {
+            FileRec *frec = iter->second;
+            if (frec->type == FileRec::OFILE)
+                {
+                String fname = iter->first;
+                fprintf(f, "%s:", fname.c_str());
+                std::map<String, FileRec *>::iterator citer;
+                for (citer=frec->files.begin() ; citer!=frec->files.end() ; citer++)
+                    {
+                    String cfname = citer->first;
+                    fprintf(f, " \\\n");
+                    fprintf(f, "\t%s", cfname.c_str());
+                    }
+                fprintf(f, "\n\n\n");
+                }
+            }
+
+        fprintf(f, "\n\n\n");
+        fprintf(f, "########################################################\n");
+        fprintf(f, "## E N D\n");
+        fprintf(f, "########################################################\n");
+        }
 
     fclose(f);
 
@@ -1188,7 +1295,7 @@ bool DepTool::saveRefFile(bool doXml)
         fprintf(f, "## Note: The metric is the 'distance' of inclusion from\n");
         fprintf(f, "##    the given file.\n");
         fprintf(f, "########################################################\n");
-        fprintf(f, "--!>\n");
+        fprintf(f, "-->\n");
         fprintf(f, "\n\n");
     
 
@@ -1216,7 +1323,7 @@ bool DepTool::saveRefFile(bool doXml)
         fprintf(f, "########################################################\n");
         fprintf(f, "## E N D\n");
         fprintf(f, "########################################################\n");
-        fprintf(f, "--!>\n");
+        fprintf(f, "-->\n");
         }
 
     else //######### not xml
@@ -1261,6 +1368,69 @@ bool DepTool::saveRefFile(bool doXml)
 }
 
 
+/**
+ *   This is a new thing.  It creates a cmake file that should be able to
+ *   build the entire thing. 
+ */
+bool DepTool::saveCmakeFile()
+{
+    time_t tim;
+    time(&tim);
+
+    FILE *f = fopen("CMakeLists.txt", "w");
+    if (!f)
+        {
+        trace("cannot open 'CMakeLists.txt' for writing");
+        }
+    fprintf(f, "########################################################\n");
+    fprintf(f, "## File: CMakeLists.txt\n");
+    fprintf(f, "## Generated by DepTool at :%s", ctime(&tim));
+    fprintf(f, "########################################################\n");
+
+    fprintf(f, "\n\n");
+    
+    fprintf(f, "\n\n\n");
+    fprintf(f, "########################################################\n");
+    fprintf(f, "## P R O J E C T\n");
+    fprintf(f, "########################################################\n");
+    fprintf(f, "project (INKSCAPE)\n");
+    fprintf(f, "\n\n\n");
+    fprintf(f, "########################################################\n");
+    fprintf(f, "## O B J E C T S\n");
+    fprintf(f, "########################################################\n");
+    fprintf(f, "set (INKSCAPE_SRCS\n");
+    
+    std::map<String, FileRec *>::iterator oiter;
+    for (oiter=allFiles.begin() ; oiter!=allFiles.end() ; oiter++)
+        {
+        FileRec *frec = oiter->second;
+        if (frec->type == FileRec::CFILE)
+            {
+            //fprintf(f, " \\\n");
+            String fname = frec->path;
+            if (fname.size()>0)
+                fname.append("/");
+            fname.append(frec->baseName);
+            fname.append(".");
+            fname.append(frec->suffix);
+            fprintf(f, "%s\n", fname.c_str());
+            }
+        }
+    fprintf(f, ")\n\n");
+
+    fprintf(f, "add_executable (inkscape ${INKSCAPE_SRCS})\n");
+
+    fprintf(f, "\n\n\n");
+    fprintf(f, "########################################################\n");
+    fprintf(f, "## E N D\n");
+    fprintf(f, "########################################################\n");
+
+    fclose(f);
+
+    return true;
+}
+
+