X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fedit.c;h=89768f5d941d6d0f38d8dec7d197734b6e7140dd;hb=4715eed45b57fd37557fc0ccd65207c835d47080;hp=23fda7737ef35f599c8a7e7dcfbf25944bb44c8d;hpb=f4dee9277cd8d5ea589c33ae98937076b896524a;p=bacula%2Fbacula diff --git a/bacula/src/lib/edit.c b/bacula/src/lib/edit.c index 23fda7737e..89768f5d94 100644 --- a/bacula/src/lib/edit.c +++ b/bacula/src/lib/edit.c @@ -5,26 +5,33 @@ * * Version $Id$ */ - /* - Copyright (C) 2000-2005 Kern Sibbald + Bacula® - The Network Backup Solution + + Copyright (C) 2002-2006 Free Software Foundation Europe e.V. - This program 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. + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program 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 this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - */ + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ #include "bacula.h" #include @@ -98,10 +105,43 @@ char *edit_uint64_with_commas(uint64_t val, char *buf) val /= 10; } } - bstrncpy(buf, &mbuf[i+1], sizeof(buf)); + bstrncpy(buf, &mbuf[i+1], 27); return add_commas(buf, buf); } +/* + * Edit an integer into "human-readable" format with four or fewer + * significant digits followed by a suffix that indicates the scale + * factor. The buf array inherits a 27 byte minimim length + * requirement from edit_unit64_with_commas(), although the output + * string is limited to eight characters. + */ +char *edit_uint64_with_suffix(uint64_t val, char *buf) +{ + int commas = 0; + char *c, mbuf[50]; + const char *suffix[] = + { "", "K", "M", "G", "T", "P", "E", "Z", "Y", "FIX ME" }; + int suffixes = sizeof(suffix) / sizeof(*suffix); + + edit_uint64_with_commas(val, mbuf); + + if ((c = strchr(mbuf, ',')) != NULL) { + commas++; + *c++ = '.'; + while ((c = strchr(c, ',')) != NULL) { + commas++; + *c++ = '\0'; + } + mbuf[5] = '\0'; // drop this to get '123.456 TB' rather than '123.4 TB' + } + + if (commas >= suffixes) + commas = suffixes - 1; + bsnprintf(buf, 27, "%s %s", mbuf, suffix[commas]); + return buf; +} + /* * Edit an integer number, the supplied buffer * must be at least 27 bytes long. The incoming number @@ -123,7 +163,7 @@ char *edit_uint64(uint64_t val, char *buf) val /= 10; } } - strcpy(buf, &mbuf[i+1]); + bstrncpy(buf, &mbuf[i+1], 27); return buf; } @@ -151,23 +191,19 @@ char *edit_int64(int64_t val, char *buf) if (negative) { mbuf[i--] = '-'; } - strcpy(buf, &mbuf[i+1]); + bstrncpy(buf, &mbuf[i+1], 27); return buf; } /* - * Given a string "str", separate the integer part into + * Given a string "str", separate the numeric part into * str, and the modifier into mod. */ static bool get_modifier(char *str, char *num, int num_len, char *mod, int mod_len) { int i, len, num_begin, num_end, mod_begin, mod_end; - /* - * Look for modifier by walking back looking for the first - * space or digit. - */ strip_trailing_junk(str); len = strlen(str); @@ -180,7 +216,7 @@ static bool get_modifier(char *str, char *num, int num_len, char *mod, int mod_l /* Walk through integer part */ for ( ; i