--- embedaddon/smartmontools/utility.h 2012/02/21 16:32:16 1.1 +++ embedaddon/smartmontools/utility.h 2013/07/22 01:17:36 1.1.1.3 @@ -4,7 +4,7 @@ * Home page of code is: http://smartmontools.sourceforge.net * * Copyright (C) 2002-11 Bruce Allen - * Copyright (C) 2008-11 Christian Franke + * Copyright (C) 2008-12 Christian Franke * Copyright (C) 2000 Michael Cornwell * * This program is free software; you can redistribute it and/or modify @@ -13,8 +13,7 @@ * any later version. * * You should have received a copy of the GNU General Public License - * (for example COPYING); if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * (for example COPYING); If not, see . * * This code was originally developed as a Senior Thesis by Michael Cornwell * at the Concurrent Systems Laboratory (now part of the Storage Systems @@ -26,7 +25,7 @@ #ifndef UTILITY_H_ #define UTILITY_H_ -#define UTILITY_H_CVSID "$Id: utility.h,v 1.1 2012/02/21 16:32:16 misho Exp $" +#define UTILITY_H_CVSID "$Id: utility.h,v 1.1.1.3 2013/07/22 01:17:36 misho Exp $" #include #include // for regex.h (according to POSIX) @@ -36,8 +35,14 @@ #include #include -#if !defined(__GNUC__) && !defined(__attribute__) -#define __attribute__(x) /**/ +#ifndef __GNUC__ +#define __attribute_format_printf(x, y) /**/ +#elif defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO +// Check format of __mingw_*printf() instead of MSVCRT.DLL:*printf() +#define __attribute_format_printf(x, y) __attribute__((format (gnu_printf, x, y))) +#define HAVE_WORKING_SNPRINTF 1 +#else +#define __attribute_format_printf(x, y) __attribute__((format (printf, x, y))) #endif // Make version information string @@ -45,13 +50,20 @@ std::string format_version_info(const char * prog_name // return (v)sprintf() formated std::string std::string strprintf(const char * fmt, ...) - __attribute__ ((format (printf, 1, 2))); + __attribute_format_printf(1, 2); std::string vstrprintf(const char * fmt, va_list ap); +// Return true if STR starts with PREFIX +inline bool str_starts_with(const char * str, const char * prefix) + { return !strncmp(str, prefix, strlen(prefix)); } + +inline bool str_starts_with(const std::string & str, const char * prefix) + { return !strncmp(str.c_str(), prefix, strlen(prefix)); } + #ifndef HAVE_WORKING_SNPRINTF // Substitute by safe replacement functions int safe_snprintf(char *buf, int size, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute_format_printf(3, 4); int safe_vsnprintf(char *buf, int size, const char *fmt, va_list ap); #define snprintf safe_snprintf #define vsnprintf safe_vsnprintf @@ -75,15 +87,13 @@ void dateandtimezoneepoch(char *buffer, time_t tval); // itself is defined differently in smartctl and smartd. So the // function definition(s) are in smartd.c and in smartctl.c. void pout(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); + __attribute_format_printf(1, 2); // replacement for perror() with redirected output. void syserror(const char *message); // Function for processing -r option in smartctl and smartd int split_report_arg(char *s, int *i); -// Function for processing -c option in smartctl and smartd -int split_report_arg2(char *s, int *i); // Function for processing -t selective... option in smartctl int split_selective_arg(char *s, uint64_t *start, uint64_t *stop, int *mode); @@ -169,9 +179,6 @@ bool nonempty(const void * data, int size); // needed to fix glibc bug void FixGlibcTimeZoneBug(); - -// convert time in msec to a text string -void MsecToText(unsigned int msec, char *txt); // Format integer with thousands separator const char * format_with_thousands_sep(char * str, int strsize, uint64_t val,