Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- lib/Utils/strbuf.c | 4 +++- lib/Utils/strbuf.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/Utils/strbuf.c b/lib/Utils/strbuf.c index 4c9bdda..0206233 100644 --- a/lib/Utils/strbuf.c +++ b/lib/Utils/strbuf.c @@ -41,9 +41,11 @@ void strbuf_free(struct strbuf *strbuf) free(strbuf); }
-void strbuf_free_nobuf(struct strbuf *strbuf) +char* strbuf_free_nobuf(struct strbuf *strbuf) { + char *ret = strbuf->buf; free(strbuf); + return ret; }
diff --git a/lib/Utils/strbuf.h b/lib/Utils/strbuf.h index bc843f9..3f3ba51 100644 --- a/lib/Utils/strbuf.h +++ b/lib/Utils/strbuf.h @@ -36,7 +36,7 @@ struct strbuf extern struct strbuf *strbuf_new(); extern void strbuf_free(struct strbuf *strbuf); /* Releases strbuf, but not the internal buffer. */ -extern void strbuf_free_nobuf(struct strbuf *strbuf); +extern char* strbuf_free_nobuf(struct strbuf *strbuf); extern void strbuf_clear(struct strbuf *strbuf); extern struct strbuf *strbuf_append_char(struct strbuf *strbuf, char c); extern struct strbuf *strbuf_append_str(struct strbuf *strbuf, const char *str);
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com --- inc/abrtlib.h | 2 +- lib/Plugins/Bugzilla.cpp | 19 ++++++++++----- lib/Plugins/Catcut.cpp | 12 +++++---- lib/Utils/parse_release.cpp | 52 ++++++++++++++++++++++++------------------- 4 files changed, 49 insertions(+), 36 deletions(-)
diff --git a/inc/abrtlib.h b/inc/abrtlib.h index 6303f75..4c4aa6b 100644 --- a/inc/abrtlib.h +++ b/inc/abrtlib.h @@ -230,6 +230,6 @@ std::string to_string(T x) }
void parse_args(const char *psArgs, vector_string_t& pArgs, int quote = -1); -void parse_release(const char *pRelease, std::string& pProduct, std::string& pVersion); +void parse_release(const char *pRelease, char **product, char **version);
#endif diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp index b7c15de..94fd383 100644 --- a/lib/Plugins/Bugzilla.cpp +++ b/lib/Plugins/Bugzilla.cpp @@ -300,8 +300,10 @@ void ctx::get_bug_cc(xmlrpc_value* result_xml, struct bug_info* bz)
xmlrpc_value* ctx::call_quicksearch_duphash(const char* component, const char* duphash) { - std::string query = ssprintf("ALL component:"%s" statuswhiteboard:"%s"", component, duphash); - return call("Bug.search", "({s:s})", "quicksearch", query.c_str()); + char *query = xasprintf("ALL component:"%s" statuswhiteboard:"%s"", component, duphash); + xmlrpc_value *ret = call("Bug.search", "({s:s})", "quicksearch", query); + free(query); + return ret; }
xmlrpc_int32 ctx::get_bug_id(xmlrpc_value* result_xml) @@ -373,19 +375,22 @@ xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData) std::string description = "abrt version: "VERSION"\n"; description += make_description_bz(pCrashData);
- std::string product; - std::string version; - parse_release(release.c_str(), product, version); + char *product = NULL; + char *version = NULL; + parse_release(release.c_str(), &product, &version);
xmlrpc_value* result = call("Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s})", - "product", product.c_str(), + "product", product, "component", component.c_str(), - "version", version.c_str(), + "version", version, "summary", summary.c_str(), "description", description.c_str(), "status_whiteboard", status_whiteboard.c_str(), "platform", arch.c_str() ); + free(product); + free(version); + if (!result) return -1;
diff --git a/lib/Plugins/Catcut.cpp b/lib/Plugins/Catcut.cpp index 6c655f2..05a93bb 100644 --- a/lib/Plugins/Catcut.cpp +++ b/lib/Plugins/Catcut.cpp @@ -290,20 +290,22 @@ ctx::new_bug(const char *auth_cookie, const map_crash_data_t& pCrashData)
string description = make_description_catcut(pCrashData);
- string product; - string version; - parse_release(release.c_str(), product, version); + char *product = NULL; + char *version = NULL; + parse_release(release.c_str(), &product, &version);
xmlrpc_value *param = xmlrpc_build_value(&env, "(s{s:s,s:s,s:s,s:s,s:s,s:s,s:s})", auth_cookie, - "product", product.c_str(), + "product", product, "component", component.c_str(), - "version", version.c_str(), + "version", version, "summary", summary.c_str(), "description", description.c_str(), "status_whiteboard", status_whiteboard.c_str(), "platform", arch.c_str() ); + free(product); + free(version); throw_if_xml_fault_occurred(&env);
xmlrpc_value *result; diff --git a/lib/Utils/parse_release.cpp b/lib/Utils/parse_release.cpp index 4f7d76e..3d6b572 100644 --- a/lib/Utils/parse_release.cpp +++ b/lib/Utils/parse_release.cpp @@ -21,38 +21,44 @@ # include "config.h" #endif
-using namespace std; +#include "strbuf.h"
-void parse_release(const char *pRelease, string& pProduct, string& pVersion) +// caller is reposible for freeing *product* and *version* +void parse_release(const char *release, char** product, char** version) { - if (strstr(pRelease, "Rawhide")) + if (strstr(release, "Rawhide")) { - pProduct = "Fedora"; - pVersion = "rawhide"; - VERB3 log("%s: version:'%s' product:'%s'", __func__, pVersion.c_str(), pProduct.c_str()); + *product = xstrdup("Fedora"); + *version = xstrdup("rawhide"); + VERB3 log("%s: version:'%s' product:'%s'", __func__, *version, *product); return; } - if (strstr(pRelease, "Fedora")) - { - pProduct = "Fedora"; - } - else if (strstr(pRelease, "Red Hat Enterprise Linux")) - { - pProduct = "Red Hat Enterprise Linux "; - }
- const char *release = strstr(pRelease, "release"); - const char *space = release ? strchr(release, ' ') : NULL; + struct strbuf *buf_product = strbuf_new(); + if (strstr(release, "Fedora")) + strbuf_append_str(buf_product, "Fedora"); + else if (strstr(release, "Red Hat Enterprise Linux")) + strbuf_append_str(buf_product, "Red Hat Enterprise Linux ");
- if (space++) while (*space != '\0' && *space != ' ') + const char *r = strstr(release, "release"); + const char *space = r ? strchr(r, ' ') : NULL; + + struct strbuf *buf_version = strbuf_new(); + if (space++) { - /* Eat string like "5.2" */ - pVersion += *space; - if (pProduct == "Red Hat Enterprise Linux ") + while (*space != '\0' && *space != ' ') { - pProduct += *space; + /* Eat string like "5.2" */ + strbuf_append_char(buf_version, *space); + if ((strcmp(buf_product->buf, "Red Hat Enterprise Linux ") == 0)) + strbuf_append_char(buf_product, *space); + + space++; } - space++; } - VERB3 log("%s: version:'%s' product:'%s'", __func__, pVersion.c_str(), pProduct.c_str()); + + *version = strbuf_free_nobuf(buf_version); + *product = strbuf_free_nobuf(buf_product); + + VERB3 log("%s: version:'%s' product:'%s'", __func__, *version, *product); }
On Mon, 2010-05-17 at 15:19 +0200, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com
I like the direction of these patches!
On Mon, 2010-05-17 at 15:19 +0200, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com
inc/abrtlib.h | 2 +- lib/Plugins/Bugzilla.cpp | 19 ++++++++++----- lib/Plugins/Catcut.cpp | 12 +++++---- lib/Utils/parse_release.cpp | 52 ++++++++++++++++++++++++------------------- 4 files changed, 49 insertions(+), 36 deletions(-)
+// caller is reposible for freeing *product* and *version* +void parse_release(const char *release, char** product, char** version)
Duplicate this comment in .h file too.
- const char *space = r ? strchr(r, ' ') : NULL;
- struct strbuf *buf_version = strbuf_new();
- if (space++)
I would write this if() as:
if (space) { space++; ...
Patch looks ok, please apply it.
crash-catcher@lists.fedorahosted.org