Преглед на файлове

use a std::vector instead of hardcoded array

Arrays with predefined lengths are very fragile as they are
likely forgotten in future changes and the size in this case
is dynamic making it even more dangerous.

Git-Dch: Ignore
David Kalnischkies преди 12 години
родител
ревизия
eb0d90f08d
променени са 1 файла, в които са добавени 39 реда и са изтрити 41 реда
  1. 39 41
      ftparchive/writer.cc

+ 39 - 41
ftparchive/writer.cc

@@ -54,14 +54,15 @@ FTWScanner *FTWScanner::Owner;
 // SetTFRewriteData - Helper for setting rewrite lists			/*{{{*/
 // SetTFRewriteData - Helper for setting rewrite lists			/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
-inline void SetTFRewriteData(struct TFRewriteData &tfrd,
-			     const char *tag,
+static inline TFRewriteData SetTFRewriteData(const char *tag,
 			     const char *rewrite,
 			     const char *rewrite,
 			     const char *newtag = 0)
 			     const char *newtag = 0)
 {
 {
-    tfrd.Tag = tag;
-    tfrd.Rewrite = rewrite;
-    tfrd.NewTag = newtag;
+   TFRewriteData tfrd;
+   tfrd.Tag = tag;
+   tfrd.Rewrite = rewrite;
+   tfrd.NewTag = newtag;
+   return tfrd;
 }
 }
 									/*}}}*/
 									/*}}}*/
 
 
@@ -454,30 +455,28 @@ bool PackagesWriter::DoPackage(string FileName)
    }
    }
 
 
    // This lists all the changes to the fields we are going to make.
    // This lists all the changes to the fields we are going to make.
-   // (7 hardcoded + maintainer + suggests + end marker)
-   TFRewriteData Changes[6+2+OverItem->FieldOverride.size()+1+1];
+   std::vector<TFRewriteData> Changes;
 
 
-   unsigned int End = 0;
-   SetTFRewriteData(Changes[End++], "Size", Size);
+   Changes.push_back(SetTFRewriteData("Size", Size));
    if (DoMD5 == true)
    if (DoMD5 == true)
-      SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str());
+      Changes.push_back(SetTFRewriteData("MD5sum", Db.MD5Res.c_str()));
    if (DoSHA1 == true)
    if (DoSHA1 == true)
-      SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str());
+      Changes.push_back(SetTFRewriteData("SHA1", Db.SHA1Res.c_str()));
    if (DoSHA256 == true)
    if (DoSHA256 == true)
-      SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str());
+      Changes.push_back(SetTFRewriteData("SHA256", Db.SHA256Res.c_str()));
    if (DoSHA512 == true)
    if (DoSHA512 == true)
-      SetTFRewriteData(Changes[End++], "SHA512", Db.SHA512Res.c_str());
-   SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str());
-   SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str());
-   SetTFRewriteData(Changes[End++], "Status", 0);
-   SetTFRewriteData(Changes[End++], "Optional", 0);
+      Changes.push_back(SetTFRewriteData("SHA512", Db.SHA512Res.c_str()));
+   Changes.push_back(SetTFRewriteData("Filename", NewFileName.c_str()));
+   Changes.push_back(SetTFRewriteData("Priority", OverItem->Priority.c_str()));
+   Changes.push_back(SetTFRewriteData("Status", 0));
+   Changes.push_back(SetTFRewriteData("Optional", 0));
 
 
    string DescriptionMd5;
    string DescriptionMd5;
    if (LongDescription == false) {
    if (LongDescription == false) {
       MD5Summation descmd5;
       MD5Summation descmd5;
       descmd5.Add(desc.c_str());
       descmd5.Add(desc.c_str());
       DescriptionMd5 = descmd5.Result().Value();
       DescriptionMd5 = descmd5.Result().Value();
-      SetTFRewriteData(Changes[End++], "Description-md5", DescriptionMd5.c_str());
+      Changes.push_back(SetTFRewriteData("Description-md5", DescriptionMd5.c_str()));
       if (TransWriter != NULL)
       if (TransWriter != NULL)
 	 TransWriter->DoPackage(Package, desc, DescriptionMd5);
 	 TransWriter->DoPackage(Package, desc, DescriptionMd5);
    }
    }
@@ -492,12 +491,12 @@ bool PackagesWriter::DoPackage(string FileName)
 	 NewLine(1);
 	 NewLine(1);
 	 ioprintf(c1out, _("  %s maintainer is %s not %s\n"),
 	 ioprintf(c1out, _("  %s maintainer is %s not %s\n"),
 	       Package.c_str(), Tags.FindS("Maintainer").c_str(), OverItem->OldMaint.c_str());
 	       Package.c_str(), Tags.FindS("Maintainer").c_str(), OverItem->OldMaint.c_str());
-      }      
+      }
    }
    }
-   
+
    if (NewMaint.empty() == false)
    if (NewMaint.empty() == false)
-      SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
-   
+      Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str()));
+
    /* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that
    /* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that
       dpkg-scanpackages does. Well sort of. dpkg-scanpackages just does renaming
       dpkg-scanpackages does. Well sort of. dpkg-scanpackages just does renaming
       but dpkg does this append bit. So we do the append bit, at least that way the
       but dpkg does this append bit. So we do the append bit, at least that way the
@@ -508,17 +507,17 @@ bool PackagesWriter::DoPackage(string FileName)
    {
    {
       if (Tags.FindS("Suggests").empty() == false)
       if (Tags.FindS("Suggests").empty() == false)
 	 OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr;
 	 OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr;
-      SetTFRewriteData(Changes[End++], "Suggests", OptionalStr.c_str());
+      Changes.push_back(SetTFRewriteData("Suggests", OptionalStr.c_str()));
    }
    }
 
 
-   for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin(); 
+   for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin();
         I != OverItem->FieldOverride.end(); ++I)
         I != OverItem->FieldOverride.end(); ++I)
-      SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+      Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str()));
 
 
-   SetTFRewriteData(Changes[End++], 0, 0);
+   Changes.push_back(SetTFRewriteData( 0, 0));
 
 
    // Rewrite and store the fields.
    // Rewrite and store the fields.
-   if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes) == false)
+   if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes.data()) == false)
       return false;
       return false;
    fprintf(Output,"\n");
    fprintf(Output,"\n");
 
 
@@ -820,22 +819,21 @@ bool SourcesWriter::DoPackage(string FileName)
 
 
    // This lists all the changes to the fields we are going to make.
    // This lists all the changes to the fields we are going to make.
    // (5 hardcoded + checksums + maintainer + end marker)
    // (5 hardcoded + checksums + maintainer + end marker)
-   TFRewriteData Changes[5+2+1+SOverItem->FieldOverride.size()+1];
+   std::vector<TFRewriteData> Changes;
 
 
-   unsigned int End = 0;
-   SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package");
+   Changes.push_back(SetTFRewriteData("Source",Package.c_str(),"Package"));
    if (Files.empty() == false)
    if (Files.empty() == false)
-      SetTFRewriteData(Changes[End++],"Files",Files.c_str());
+      Changes.push_back(SetTFRewriteData("Files",Files.c_str()));
    if (ChecksumsSha1.empty() == false)
    if (ChecksumsSha1.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha1",ChecksumsSha1.c_str()));
    if (ChecksumsSha256.empty() == false)
    if (ChecksumsSha256.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha256",ChecksumsSha256.c_str()));
    if (ChecksumsSha512.empty() == false)
    if (ChecksumsSha512.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha512",ChecksumsSha512.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha512",ChecksumsSha512.c_str()));
    if (Directory != "./")
    if (Directory != "./")
-      SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
-   SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
-   SetTFRewriteData(Changes[End++],"Status",0);
+      Changes.push_back(SetTFRewriteData("Directory",Directory.c_str()));
+   Changes.push_back(SetTFRewriteData("Priority",BestPrio.c_str()));
+   Changes.push_back(SetTFRewriteData("Status",0));
 
 
    // Rewrite the maintainer field if necessary
    // Rewrite the maintainer field if necessary
    bool MaintFailed;
    bool MaintFailed;
@@ -850,16 +848,16 @@ bool SourcesWriter::DoPackage(string FileName)
       }      
       }      
    }
    }
    if (NewMaint.empty() == false)
    if (NewMaint.empty() == false)
-      SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
+      Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str()));
    
    
    for (map<string,string>::const_iterator I = SOverItem->FieldOverride.begin(); 
    for (map<string,string>::const_iterator I = SOverItem->FieldOverride.begin(); 
         I != SOverItem->FieldOverride.end(); ++I)
         I != SOverItem->FieldOverride.end(); ++I)
-      SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+      Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str()));
 
 
-   SetTFRewriteData(Changes[End++], 0, 0);
+   Changes.push_back(SetTFRewriteData(0, 0));
       
       
    // Rewrite and store the fields.
    // Rewrite and store the fields.
-   if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes) == false)
+   if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes.data()) == false)
       return false;
       return false;
    fprintf(Output,"\n");
    fprintf(Output,"\n");