[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH 4/4] lib/nolibc: adapt sscanf code for Unikraft



1) Use the right includes
2) (u_)quad_t => (u)int64_t
3) u_char => unsigned char
4) strto(u)q => strto(u)ll
5) bcopy => memmove
6) fix warnings generated by modern gcc (8.1.1)

Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
---
 lib/nolibc/Makefile.uk     |  1 +
 lib/nolibc/include/stdio.h |  3 ++
 lib/nolibc/sscanf.c        | 64 ++++++++++++++++----------------------
 lib/nolibc/stdio.c         |  1 +
 4 files changed, 32 insertions(+), 37 deletions(-)

diff --git a/lib/nolibc/Makefile.uk b/lib/nolibc/Makefile.uk
index 9186783..e7fd83d 100644
--- a/lib/nolibc/Makefile.uk
+++ b/lib/nolibc/Makefile.uk
@@ -26,6 +26,7 @@ LIBNOLIBC_SRCS-y += $(LIBNOLIBC_BASE)/ctype.c
 LIBNOLIBC_SRCS-y += $(LIBNOLIBC_BASE)/stdlib.c
 LIBNOLIBC_SRCS-y += $(LIBNOLIBC_BASE)/string.c
 LIBNOLIBC_SRCS-y += $(LIBNOLIBC_BASE)/getopt.c
+LIBNOLIBC_SRCS-y += $(LIBNOLIBC_BASE)/sscanf.c
 LIBNOLIBC_SRCS-$(CONFIG_LIBUKALLOC) += $(LIBNOLIBC_BASE)/malloc.c
 
 # Localize internal symbols (starting with __*)
diff --git a/lib/nolibc/include/stdio.h b/lib/nolibc/include/stdio.h
index 073b132..6d5652f 100644
--- a/lib/nolibc/include/stdio.h
+++ b/lib/nolibc/include/stdio.h
@@ -64,6 +64,9 @@ int   fflush(FILE *fp);
 int vprintf(const char *fmt, va_list ap);
 int  printf(const char *fmt, ...)                           __printf(1, 2);
 
+int vsscanf(const char *str, const char *fmt, va_list ap);
+int  sscanf(const char *str, const char *fmt, ...) __scanf(2, 3);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/nolibc/sscanf.c b/lib/nolibc/sscanf.c
index 5e016fa..e91c329 100644
--- a/lib/nolibc/sscanf.c
+++ b/lib/nolibc/sscanf.c
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
 /*-
  * Copyright (c) 1990, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -28,25 +29,14 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * From: Id: vfscanf.c,v 1.13 1998/09/25 12:20:27 obrien Exp 
- * From: static char sccsid[] = "@(#)strtol.c  8.1 (Berkeley) 6/4/93";
- * From: static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93";
  */
 
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/ctype.h>
-#include <sys/limits.h>
-
-/*
- * Note that stdarg.h and the ANSI style va_start macro is used for both
- * ANSI and traditional C compilers.
- */
-#include <machine/stdarg.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
 
 #define        BUF             32      /* Maximum length of numeric string. */
 
@@ -81,8 +71,8 @@ __FBSDID("$FreeBSD$");
 #define        CT_CHAR         0       /* %c conversion */
 #define        CT_CCL          1       /* %[...] conversion */
 #define        CT_STRING       2       /* %s conversion */
-#define        CT_INT          3       /* integer, i.e., strtoq or strtouq */
-typedef u_quad_t (*ccfntype)(const char *, char **, int);
+#define        CT_INT          3       /* integer, i.e., strtoll or strtoull */
+typedef uint64_t (*ccfntype)(const char *, char **, int);
 
 /*
  * Fill in the given table from the scanset at the given format
@@ -90,8 +80,8 @@ typedef u_quad_t (*ccfntype)(const char *, char **, int);
  * closing `]'.  The table has a 1 wherever characters should be
  * considered part of the scanset.
  */
-static const u_char *
-__sccl(char *tab, const u_char *fmt)
+static const unsigned char *
+__sccl(char *tab, const unsigned char *fmt)
 {
        int c, n, v;
 
@@ -180,7 +170,7 @@ int
 vsscanf(const char *inp, char const *fmt0, va_list ap)
 {
        int inr;
-       const u_char *fmt = (const u_char *)fmt0;
+       const unsigned char *fmt = (const unsigned char *)fmt0;
        int c;                  /* character from format, or conversion */
        size_t width;           /* field width, or 0 */
        char *p;                /* points into all kinds of strings */
@@ -190,8 +180,8 @@ vsscanf(const char *inp, char const *fmt0, va_list ap)
        int nassigned;          /* number of fields assigned */
        int nconversions;       /* number of conversions */
        int nread;              /* number of characters consumed from fp */
-       int base;               /* base argument to strtoq/strtouq */
-       ccfntype ccfn;          /* conversion function (strtoq/strtouq) */
+       int base;               /* base argument to strtoll/strtoull */
+       ccfntype ccfn;          /* conversion function (strtoll/strtoull) */
        char ccltab[256];       /* character class table for %[...] */
        char buf[BUF];          /* buffer for numeric conversions */
 
@@ -271,32 +261,32 @@ literal:
                 */
                case 'd':
                        c = CT_INT;
-                       ccfn = (ccfntype)strtoq;
+                       ccfn = (ccfntype)strtoll;
                        base = 10;
                        break;
 
                case 'i':
                        c = CT_INT;
-                       ccfn = (ccfntype)strtoq;
+                       ccfn = (ccfntype)strtoll;
                        base = 0;
                        break;
 
                case 'o':
                        c = CT_INT;
-                       ccfn = strtouq;
+                       ccfn = (ccfntype) strtoull;
                        base = 8;
                        break;
 
                case 'u':
                        c = CT_INT;
-                       ccfn = strtouq;
+                       ccfn = (ccfntype) strtoull;
                        base = 10;
                        break;
 
                case 'x':
                        flags |= PFXOK; /* enable 0x prefixing */
                        c = CT_INT;
-                       ccfn = strtouq;
+                       ccfn = (ccfntype) strtoull;
                        base = 16;
                        break;
 
@@ -318,7 +308,7 @@ literal:
                case 'p':       /* pointer format is like hex */
                        flags |= POINTER | PFXOK;
                        c = CT_INT;
-                       ccfn = strtouq;
+                       ccfn = (ccfntype) strtoull;
                        base = 16;
                        break;
 
@@ -333,7 +323,7 @@ literal:
                        else if (flags & LONG)
                                *va_arg(ap, long *) = nread;
                        else if (flags & QUAD)
-                               *va_arg(ap, quad_t *) = nread;
+                               *va_arg(ap, int64_t *) = nread;
                        else
                                *va_arg(ap, int *) = nread;
                        continue;
@@ -377,7 +367,7 @@ literal:
                                size_t sum = 0;
 
                                for (;;) {
-                                       if ((n = inr) < width) {
+                                       if ((n = inr) < (int) width) {
                                                sum += n;
                                                width -= n;
                                                inp += n;
@@ -393,7 +383,7 @@ literal:
                                }
                                nread += sum;
                        } else {
-                               bcopy(inp, va_arg(ap, char *), width);
+                               memmove(va_arg(ap, char *), inp, width);
                                inr -= width;
                                inp += width;
                                nread += width;
@@ -476,7 +466,7 @@ literal:
                        continue;
 
                case CT_INT:
-                       /* scan an integer as if by strtoq/strtouq */
+                       /* scan an integer as if by strtoll/strtoull */
 #ifdef hardway
                        if (width == 0 || width > sizeof(buf) - 1)
                                width = sizeof(buf) - 1;
@@ -594,14 +584,14 @@ ok:
                                }
                                goto match_failure;
                        }
-                       c = ((u_char *)p)[-1];
+                       c = ((unsigned char *)p)[-1];
                        if (c == 'x' || c == 'X') {
                                --p;
                                inp--;
                                inr++;
                        }
                        if ((flags & SUPPRESS) == 0) {
-                               u_quad_t res;
+                               uint64_t res;
 
                                *p = 0;
                                res = (*ccfn)(buf, (char **)NULL, base);
@@ -615,7 +605,7 @@ ok:
                                else if (flags & LONG)
                                        *va_arg(ap, long *) = res;
                                else if (flags & QUAD)
-                                       *va_arg(ap, quad_t *) = res;
+                                       *va_arg(ap, int64_t *) = res;
                                else
                                        *va_arg(ap, int *) = res;
                                nassigned++;
diff --git a/lib/nolibc/stdio.c b/lib/nolibc/stdio.c
index 7e3d368..3a32907 100644
--- a/lib/nolibc/stdio.c
+++ b/lib/nolibc/stdio.c
@@ -289,6 +289,7 @@ reswitch:
                        goto handle_nosign;
                case 'X':
                        upper = 1;
+                       /* Fall through */
                case 'x':
                        base = 16;
                        goto handle_nosign;
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.