Author: sobomax
Date: Wed Mar  3 19:25:28 2010
New Revision: 204654
URL: http://svn.freebsd.org/changeset/base/204654

Log:
  Use expand_number(3) from libutil instead of home-grown function to parse
  human-friendly power-of-two numbers (i.e. 2k, 5M etc).
  
  Suggested by: many
  MFC after:    1 week

Modified:
  head/sbin/newfs/Makefile
  head/sbin/newfs/newfs.c
  head/sbin/newfs/newfs.h
  head/usr.bin/truncate/Makefile
  head/usr.bin/truncate/truncate.c

Modified: head/sbin/newfs/Makefile
==============================================================================
--- head/sbin/newfs/Makefile    Wed Mar  3 19:14:05 2010        (r204653)
+++ head/sbin/newfs/Makefile    Wed Mar  3 19:25:28 2010        (r204654)
@@ -4,8 +4,8 @@
 .PATH: ${.CURDIR}/../../sys/geom
 
 PROG=  newfs
-DPADD= ${LIBUFS}
-LDADD= -lufs
+DPADD= ${LIBUFS} ${LIBUTIL}
+LDADD= -lufs -lutil
 SRCS=  newfs.c mkfs.c geom_bsd_enc.c
 
 WARNS?=        3

Modified: head/sbin/newfs/newfs.c
==============================================================================
--- head/sbin/newfs/newfs.c     Wed Mar  3 19:14:05 2010        (r204653)
+++ head/sbin/newfs/newfs.c     Wed Mar  3 19:25:28 2010        (r204654)
@@ -77,6 +77,8 @@ __FBSDID("$FreeBSD$");
 #include <syslog.h>
 #include <unistd.h>
 
+#include <libutil.h>
+
 #include "newfs.h"
 
 int    Eflag;                  /* Erase previous disk contents */
@@ -90,19 +92,19 @@ int Jflag;                  /* enable gjournal for file
 int    lflag;                  /* enable multilabel for file system */
 int    nflag;                  /* do not create .snap directory */
 intmax_t fssize;               /* file system size */
-int    sectorsize;             /* bytes/sector */
+int64_t        sectorsize;             /* bytes/sector */
 int    realsectorsize;         /* bytes/sector in hardware */
-int    fsize = 0;              /* fragment size */
-int    bsize = 0;              /* block size */
-int    maxbsize = 0;           /* maximum clustering */
-int    maxblkspercg = MAXBLKSPERCG; /* maximum blocks per cylinder group */
+int64_t        fsize = 0;              /* fragment size */
+int64_t        bsize = 0;              /* block size */
+int64_t        maxbsize = 0;           /* maximum clustering */
+int64_t        maxblkspercg = MAXBLKSPERCG; /* maximum blocks per cylinder 
group */
 int    minfree = MINFREE;      /* free space threshold */
 int    opt = DEFAULTOPT;       /* optimization preference (space or time) */
-int    density;                /* number of bytes per inode */
-int    maxcontig = 0;          /* max contiguous blocks to allocate */
-int    maxbpg;                 /* maximum blocks per file in a cyl group */
-int    avgfilesize = AVFILESIZ;/* expected average file size */
-int    avgfilesperdir = AFPDIR;/* expected number of files per directory */
+int64_t        density;                /* number of bytes per inode */
+int64_t        maxcontig = 0;          /* max contiguous blocks to allocate */
+int64_t        maxbpg;                 /* maximum blocks per file in a cyl 
group */
+int64_t        avgfilesize = AVFILESIZ;/* expected average file size */
+int64_t        avgfilesperdir = AFPDIR;/* expected number of files per 
directory */
 u_char *volumelabel = NULL;    /* volume label for filesystem */
 struct uufsd disk;             /* libufs disk structure */
 
@@ -117,7 +119,6 @@ static void getfssize(intmax_t *, const 
 static struct disklabel *getdisklabel(char *s);
 static void rewritelabel(char *s, struct disklabel *lp);
 static void usage(void);
-static int parselength(const char *ls, int *sz);
 
 ufs2_daddr_t part_ofs; /* partition offset in blocks, used with files */
 
@@ -170,7 +171,7 @@ main(int argc, char *argv[])
                        Rflag = 1;
                        break;
                case 'S':
-                       rval = parselength(optarg, &sectorsize);
+                       rval = expand_number(optarg, &sectorsize);
                        if (rval < 0 || sectorsize <= 0)
                                errx(1, "%s: bad sector size", optarg);
                        break;
@@ -184,13 +185,13 @@ main(int argc, char *argv[])
                        Xflag++;
                        break;
                case 'a':
-                       rval = parselength(optarg, &maxcontig);
+                       rval = expand_number(optarg, &maxcontig);
                        if (rval < 0 || maxcontig <= 0)
                                errx(1, "%s: bad maximum contiguous blocks",
                                    optarg);
                        break;
                case 'b':
-                       rval = parselength(optarg, &bsize);
+                       rval = expand_number(optarg, &bsize);
                        if (rval < 0)
                                 errx(1, "%s: bad block size",
                                     optarg);
@@ -202,39 +203,39 @@ main(int argc, char *argv[])
                                    optarg, MAXBSIZE);
                        break;
                case 'c':
-                       rval = parselength(optarg, &maxblkspercg);
+                       rval = expand_number(optarg, &maxblkspercg);
                        if (rval < 0 || maxblkspercg <= 0)
                                errx(1, "%s: bad blocks per cylinder group",
                                    optarg);
                        break;
                case 'd':
-                       rval = parselength(optarg, &maxbsize);
+                       rval = expand_number(optarg, &maxbsize);
                        if (rval < 0 || maxbsize < MINBSIZE)
                                errx(1, "%s: bad extent block size", optarg);
                        break;
                case 'e':
-                       rval = parselength(optarg, &maxbpg);
+                       rval = expand_number(optarg, &maxbpg);
                        if (rval < 0 || maxbpg <= 0)
                          errx(1, "%s: bad blocks per file in a cylinder group",
                                    optarg);
                        break;
                case 'f':
-                       rval = parselength(optarg, &fsize);
+                       rval = expand_number(optarg, &fsize);
                        if (rval < 0 || fsize <= 0)
                                errx(1, "%s: bad fragment size", optarg);
                        break;
                case 'g':
-                       rval = parselength(optarg, &avgfilesize);
+                       rval = expand_number(optarg, &avgfilesize);
                        if (rval < 0 || avgfilesize <= 0)
                                errx(1, "%s: bad average file size", optarg);
                        break;
                case 'h':
-                       rval = parselength(optarg, &avgfilesperdir);
+                       rval = expand_number(optarg, &avgfilesperdir);
                        if (rval < 0 || avgfilesperdir <= 0)
                               errx(1, "%s: bad average files per dir", optarg);
                        break;
                case 'i':
-                       rval = parselength(optarg, &density);
+                       rval = expand_number(optarg, &density);
                        if (rval < 0 || density <= 0)
                                errx(1, "%s: bad bytes per inode", optarg);
                        break;
@@ -495,62 +496,3 @@ usage()
        fprintf(stderr, "\t-s file system size (sectors)\n");
        exit(1);
 }
-
-/*
- * Return the numeric value of a string given in the form [+-][0-9]+[GMKT]
- * or -1 on format error or overflow.
- */
-static int
-parselength(const char *ls, int *sz)
-{
-       off_t length, oflow;
-       int lsign;
-
-       length = 0;
-       lsign = 1;
-
-       switch (*ls) {
-       case '-':
-               lsign = -1;
-       case '+':
-               ls++;
-       }
-
-#define ASSIGN_CHK_OFLOW(x, y)  if (x < y) return -1; y = x
-       /*
-        * Calculate the value of the decimal digit string, failing
-        * on overflow.
-        */
-       while (isdigit(*ls)) {
-               oflow = length * 10 + *ls++ - '0';
-               ASSIGN_CHK_OFLOW(oflow, length);
-       }
-
-       switch (*ls) {
-       case 'T':
-       case 't':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'G':
-       case 'g':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'M':
-       case 'm':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'K':
-       case 'k':
-               if (ls[1] != '\0')
-                       return -1;
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case '\0':
-               break;
-       default:
-               return -1;
-       }
-
-       *sz = length * lsign;
-       return 0;
-}

Modified: head/sbin/newfs/newfs.h
==============================================================================
--- head/sbin/newfs/newfs.h     Wed Mar  3 19:14:05 2010        (r204653)
+++ head/sbin/newfs/newfs.h     Wed Mar  3 19:25:28 2010        (r204654)
@@ -86,19 +86,19 @@ extern int  Jflag;          /* enable gjournal fo
 extern int     lflag;          /* enable multilabel MAC for file system */
 extern int     nflag;          /* do not create .snap directory */
 extern intmax_t        fssize;         /* file system size */
-extern int     sectorsize;     /* bytes/sector */
+extern int64_t sectorsize;     /* bytes/sector */
 extern int     realsectorsize; /* bytes/sector in hardware*/
-extern int     fsize;          /* fragment size */
-extern int     bsize;          /* block size */
-extern int     maxbsize;       /* maximum clustering */
-extern int     maxblkspercg;   /* maximum blocks per cylinder group */
+extern int64_t fsize;          /* fragment size */
+extern int64_t bsize;          /* block size */
+extern int64_t maxbsize;       /* maximum clustering */
+extern int64_t maxblkspercg;   /* maximum blocks per cylinder group */
 extern int     minfree;        /* free space threshold */
 extern int     opt;            /* optimization preference (space or time) */
-extern int     density;        /* number of bytes per inode */
-extern int     maxcontig;      /* max contiguous blocks to allocate */
-extern int     maxbpg;         /* maximum blocks per file in a cyl group */
-extern int     avgfilesize;    /* expected average file size */
-extern int     avgfilesperdir; /* expected number of files per directory */
+extern int64_t density;        /* number of bytes per inode */
+extern int64_t maxcontig;      /* max contiguous blocks to allocate */
+extern int64_t maxbpg;         /* maximum blocks per file in a cyl group */
+extern int64_t avgfilesize;    /* expected average file size */
+extern int64_t avgfilesperdir; /* expected number of files per directory */
 extern u_char  *volumelabel;   /* volume label for filesystem */
 extern struct uufsd disk;      /* libufs disk structure */
 

Modified: head/usr.bin/truncate/Makefile
==============================================================================
--- head/usr.bin/truncate/Makefile      Wed Mar  3 19:14:05 2010        
(r204653)
+++ head/usr.bin/truncate/Makefile      Wed Mar  3 19:25:28 2010        
(r204654)
@@ -1,5 +1,7 @@
 # $FreeBSD$
 
 PROG=          truncate
+DPADD=         ${LIBUTIL}
+LDADD=         -lutil
 
 .include <bsd.prog.mk>

Modified: head/usr.bin/truncate/truncate.c
==============================================================================
--- head/usr.bin/truncate/truncate.c    Wed Mar  3 19:14:05 2010        
(r204653)
+++ head/usr.bin/truncate/truncate.c    Wed Mar  3 19:25:28 2010        
(r204654)
@@ -40,7 +40,8 @@ static const char rcsid[] =
 #include <stdlib.h>
 #include <unistd.h>
 
-static int     parselength(char *, off_t *);
+#include <libutil.h>
+
 static void    usage(void);
 
 static int     no_create;
@@ -53,7 +54,8 @@ main(int argc, char **argv)
 {
        struct stat     sb;
        mode_t  omode;
-       off_t   oflow, rsize, sz, tsize;
+       off_t   oflow, rsize, tsize;
+       int64_t sz;
        int     ch, error, fd, oflags;
        char   *fname, *rname;
 
@@ -71,7 +73,7 @@ main(int argc, char **argv)
                        rname = optarg;
                        break;
                case 's':
-                       if (parselength(optarg, &sz) == -1)
+                       if (expand_number(optarg, &sz) == -1)
                                errx(EXIT_FAILURE,
                                    "invalid size argument `%s'", optarg);
                        if (*optarg == '+' || *optarg == '-')
@@ -148,65 +150,6 @@ main(int argc, char **argv)
        return error ? EXIT_FAILURE : EXIT_SUCCESS;
 }
 
-/*
- * Return the numeric value of a string given in the form [+-][0-9]+[GMKT]
- * or -1 on format error or overflow.
- */
-static int
-parselength(char *ls, off_t *sz)
-{
-       off_t   length, oflow;
-       int     lsign;
-
-       length = 0;
-       lsign = 1;
-
-       switch (*ls) {
-       case '-':
-               lsign = -1;
-       case '+':
-               ls++;
-       }
-
-#define        ASSIGN_CHK_OFLOW(x, y)  if (x < y) return -1; y = x
-       /*
-        * Calculate the value of the decimal digit string, failing
-        * on overflow.
-        */
-       while (isdigit(*ls)) {
-               oflow = length * 10 + *ls++ - '0';
-               ASSIGN_CHK_OFLOW(oflow, length);
-       }
-
-       switch (*ls) {
-       case 'T':
-       case 't':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'G':
-       case 'g':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'M':
-       case 'm':
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case 'K':
-       case 'k':
-               if (ls[1] != '\0')
-                       return -1;
-               oflow = length * 1024;
-               ASSIGN_CHK_OFLOW(oflow, length);
-       case '\0':
-               break;
-       default:
-               return -1;
-       }
-
-       *sz = length * lsign;
-       return 0;
-}
-
 static void
 usage(void)
 {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to