/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * versionstr.cc * * Wed Jul 22 11:41:32 CEST 2009 * Copyright 2009 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Pracro is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "versionstr.h" #include #include // Workaround - major, minor and patch are defined as macros when using _GNU_SOURCES #ifdef major #undef major #endif #ifdef minor #undef minor #endif #ifdef patch #undef patch #endif VersionStr::VersionStr(std::string v) { memset(version, 0, sizeof(version)); set(v); } void VersionStr::set(std::string v) { std::string num; size_t idx = 0; for(size_t i = 0; i < v.length(); i++) { if(v[i] == '.') { if(idx > 2) printf("Too long\n"); version[idx] = atoi(num.c_str()); idx++; num = ""; } else if(v[i] >= '0' && v[i] <= '9') { num.append(1, v[i]); } else { printf("Illigal character: [%c]\n", v[i]); } } if(idx > 2) printf("Too long\n"); version[idx] = atoi(num.c_str()); } VersionStr::operator std::string() const { std::string v; char *buf; if(patch()) asprintf(&buf, "%d.%d.%d", major(), minor(), patch()); else asprintf(&buf, "%d.%d", major(), minor()); v = buf; free(buf); return v; } void VersionStr::operator=(std::string v) { set(v); } bool VersionStr::operator<(const VersionStr &other) const { if(other.major() < major()) return true; if(other.major() > major()) return false; if(other.minor() < minor()) return true; if(other.minor() > minor()) return false; if(other.patch() < patch()) return true; if(other.patch() > patch()) return false; return false; } size_t VersionStr::major() const { return version[0]; } size_t VersionStr::minor() const { return version[1]; } size_t VersionStr::patch() const { return version[2]; } #ifdef TEST_VERSIONSTR #include int main() { VersionStr v1("1.2.3"); printf("VersionStr: %s\n", ((std::string)v1).c_str()); if((std::string)v1 != "1.2.3") return 1; VersionStr v2("1.2"); printf("VersionStr: %s\n", ((std::string)v2).c_str()); if((std::string)v2 != "1.2") return 1; VersionStr v3("1"); printf("VersionStr: %s\n", ((std::string)v3).c_str()); if((std::string)v3 != "1.0") return 1; VersionStr v4("1.2.3.4"); // too long printf("VersionStr: %s\n", ((std::string)v4).c_str()); if((std::string)v4 != "1.2.3") return 1; VersionStr v5("1.2.a"); // illigal character printf("VersionStr: %s\n", ((std::string)v5).c_str()); if((std::string)v5 != "1.2") return 1; std::set versions; versions.insert(VersionStr("1.0")); versions.insert(VersionStr("1.0.0")); versions.insert(VersionStr("2.0")); versions.insert(VersionStr("1.1")); versions.insert(VersionStr("0.1")); versions.insert(VersionStr("1.0.1")); versions.insert(VersionStr("1.0.3")); versions.insert(VersionStr("1.0.2")); std::set::iterator i = versions.begin(); while(i != versions.end()) { printf("%s\n", ((std::string)*i).c_str()); i++; } return 0; } #endif/*TEST_VERSIONSTR*/