]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/error.cc
This is realloc, not reallocf: be more careful :/.
[apt.git] / apt-pkg / contrib / error.cc
index 18810d2a47f6234dbcbf2c90f3eb0678224fa567..7d397d2c696b8de2610fccc5f1dc335fdfcdb527 100644 (file)
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
+#include <config.h>
+
 #include <apt-pkg/error.h>
 
+#include <stdarg.h>
+#include <stddef.h>
+#include <list>
 #include <iostream>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-
 #include <string>
 #include <cstring>
+#include <algorithm>
 
-#include "config.h"
-                                                                       /*}}}*/
+                                                                       /*}}}*/
 
 // Global Error Object                                                 /*{{{*/
 /* If the implementation supports posix threads then the accessor function
@@ -64,12 +68,12 @@ bool GlobalError::NAME (const char *Function, const char *Description,...) { \
        va_list args; \
        size_t msgSize = 400; \
        int const errsv = errno; \
-       while (true) { \
+       bool retry; \
+       do { \
                va_start(args,Description); \
-               if (InsertErrno(TYPE, Function, Description, args, errsv, msgSize) == false) \
-                       break; \
+               retry = InsertErrno(TYPE, Function, Description, args, errsv, msgSize); \
                va_end(args); \
-       } \
+       } while (retry); \
        return false; \
 }
 GEMessage(FatalE, FATAL)
@@ -85,12 +89,12 @@ bool GlobalError::InsertErrno(MsgType const &type, const char *Function,
        va_list args;
        size_t msgSize = 400;
        int const errsv = errno;
-       while (true) {
+       bool retry;
+       do {
                va_start(args,Description);
-               if (InsertErrno(type, Function, Description, args, errsv, msgSize) == false)
-                       break;
+               retry = InsertErrno(type, Function, Description, args, errsv, msgSize);
                va_end(args);
-       }
+       } while (retry);
        return false;
 }
                                                                        /*}}}*/
@@ -121,12 +125,12 @@ bool GlobalError::InsertErrno(MsgType type, const char* Function,
 bool GlobalError::NAME (const char *Description,...) { \
        va_list args; \
        size_t msgSize = 400; \
-       while (true) { \
+       bool retry; \
+       do { \
                va_start(args,Description); \
-               if (Insert(TYPE, Description, args, msgSize) == false) \
-                       break; \
+               retry = Insert(TYPE, Description, args, msgSize); \
                va_end(args); \
-       } \
+       } while (retry); \
        return false; \
 }
 GEMessage(Fatal, FATAL)
@@ -141,12 +145,12 @@ bool GlobalError::Insert(MsgType const &type, const char *Description,...)
 {
        va_list args;
        size_t msgSize = 400;
-       while (true) {
+       bool retry;
+       do {
                va_start(args,Description);
-               if (Insert(type, Description, args, msgSize) == false)
-                       break;
+               retry = Insert(type, Description, args, msgSize);
                va_end(args);
-       }
+       } while (retry);
        return false;
 }
                                                                        /*}}}*/
@@ -193,7 +197,7 @@ bool GlobalError::PopMessage(std::string &Text) {
 
        // check if another error message is pending
        for (std::list<Item>::const_iterator m = Messages.begin();
-            m != Messages.end(); m++)
+            m != Messages.end(); ++m)
                if (m->Type == ERROR || m->Type == FATAL)
                        return Ret;
 
@@ -207,12 +211,13 @@ void GlobalError::DumpErrors(std::ostream &out, MsgType const &threshold,
        if (mergeStack == true)
                for (std::list<MsgStack>::const_reverse_iterator s = Stacks.rbegin();
                     s != Stacks.rend(); ++s)
-                       Messages.insert(Messages.begin(), s->Messages.begin(), s->Messages.end());
+                       std::copy(s->Messages.begin(), s->Messages.end(), std::front_inserter(Messages));
+
+       std::for_each(Messages.begin(), Messages.end(), [&threshold, &out](Item const &m) {
+               if (m.Type >= threshold)
+                       out << m << std::endl;
+       });
 
-       for (std::list<Item>::const_iterator m = Messages.begin();
-            m != Messages.end(); m++)
-               if (m->Type >= threshold)
-                       out << (*m) << std::endl;
        Discard();
 }
                                                                        /*}}}*/
@@ -220,28 +225,33 @@ void GlobalError::DumpErrors(std::ostream &out, MsgType const &threshold,
 void GlobalError::Discard() {
        Messages.clear();
        PendingFlag = false;
-};
+}
+                                                                       /*}}}*/
+// GlobalError::ReturnError - convert a stored error to a return code          /*{{{*/
+bool GlobalError::ReturnError() {
+       for (auto &message : Messages)
+               if (message.Type == ERROR)
+                       message.Type = WARNING;
+       PendingFlag = false;
+       return false;
+}
                                                                        /*}}}*/
 // GlobalError::empty - does our error list include anything?          /*{{{*/
-bool GlobalError::empty(MsgType const &trashhold) const {
+bool GlobalError::empty(MsgType const &threshold) const {
        if (PendingFlag == true)
                return false;
 
        if (Messages.empty() == true)
                return true;
 
-       for (std::list<Item>::const_iterator m = Messages.begin();
-            m != Messages.end(); m++)
-               if (m->Type >= trashhold)
-                       return false;
-
-       return true;
+       return std::find_if(Messages.begin(), Messages.end(), [&threshold](Item const &m) {
+               return m.Type >= threshold;
+       }) == Messages.end();
 }
                                                                        /*}}}*/
 // GlobalError::PushToStack                                            /*{{{*/
 void GlobalError::PushToStack() {
-       MsgStack pack(Messages, PendingFlag);
-       Stacks.push_back(pack);
+       Stacks.emplace_back(Messages, PendingFlag);
        Discard();
 }
                                                                        /*}}}*/
@@ -257,7 +267,7 @@ void GlobalError::RevertToStack() {
 // GlobalError::MergeWithStack                                         /*{{{*/
 void GlobalError::MergeWithStack() {
        MsgStack pack = Stacks.back();
-       Messages.insert(Messages.begin(), pack.Messages.begin(), pack.Messages.end());
+       Messages.splice(Messages.begin(), pack.Messages);
        PendingFlag = PendingFlag || pack.PendingFlag;
        Stacks.pop_back();
 }