summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux/latest/com32/lib/vsscanf.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux/latest/com32/lib/vsscanf.c')
-rw-r--r--contrib/syslinux/latest/com32/lib/vsscanf.c374
1 files changed, 0 insertions, 374 deletions
diff --git a/contrib/syslinux/latest/com32/lib/vsscanf.c b/contrib/syslinux/latest/com32/lib/vsscanf.c
deleted file mode 100644
index 153dbbd..0000000
--- a/contrib/syslinux/latest/com32/lib/vsscanf.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * vsscanf.c
- *
- * vsscanf(), from which the rest of the scanf()
- * family is built
- */
-
-#include <ctype.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <inttypes.h>
-#include <string.h>
-#include <limits.h>
-#include <stdio.h>
-
-#ifndef LONG_BIT
-#define LONG_BIT (CHAR_BIT*sizeof(long))
-#endif
-
-enum flags {
- FL_SPLAT = 0x01, /* Drop the value, do not assign */
- FL_INV = 0x02, /* Character-set with inverse */
- FL_WIDTH = 0x04, /* Field width specified */
- FL_MINUS = 0x08, /* Negative number */
-};
-
-enum ranks {
- rank_char = -2,
- rank_short = -1,
- rank_int = 0,
- rank_long = 1,
- rank_longlong = 2,
- rank_ptr = INT_MAX /* Special value used for pointers */
-};
-
-#define MIN_RANK rank_char
-#define MAX_RANK rank_longlong
-
-#define INTMAX_RANK rank_longlong
-#define SIZE_T_RANK rank_long
-#define PTRDIFF_T_RANK rank_long
-
-enum bail {
- bail_none = 0, /* No error condition */
- bail_eof, /* Hit EOF */
- bail_err /* Conversion mismatch */
-};
-
-static inline const char *skipspace(const char *p)
-{
- while (isspace((unsigned char)*p))
- p++;
- return p;
-}
-
-#undef set_bit
-static inline void set_bit(unsigned long *bitmap, unsigned int bit)
-{
- bitmap[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
-}
-
-#undef test_bit
-static inline int test_bit(unsigned long *bitmap, unsigned int bit)
-{
- return (int)(bitmap[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1;
-}
-
-int vsscanf(const char *buffer, const char *format, va_list ap)
-{
- const char *p = format;
- char ch;
- const char *q = buffer;
- const char *qq;
- uintmax_t val = 0;
- int rank = rank_int; /* Default rank */
- unsigned int width = UINT_MAX;
- int base;
- enum flags flags = 0;
- enum {
- st_normal, /* Ground state */
- st_flags, /* Special flags */
- st_width, /* Field width */
- st_modifiers, /* Length or conversion modifiers */
- st_match_init, /* Initial state of %[ sequence */
- st_match, /* Main state of %[ sequence */
- st_match_range, /* After - in a %[ sequence */
- } state = st_normal;
- char *sarg = NULL; /* %s %c or %[ string argument */
- enum bail bail = bail_none;
- int sign;
- int converted = 0; /* Successful conversions */
- unsigned long matchmap[((1 << CHAR_BIT) + (LONG_BIT - 1)) / LONG_BIT];
- int matchinv = 0; /* Is match map inverted? */
- unsigned char range_start = 0;
-
- while ((ch = *p++) && !bail) {
- switch (state) {
- case st_normal:
- if (ch == '%') {
- state = st_flags;
- flags = 0;
- rank = rank_int;
- width = UINT_MAX;
- } else if (isspace((unsigned char)ch)) {
- q = skipspace(q);
- } else {
- if (*q == ch)
- q++;
- else
- bail = bail_err; /* Match failure */
- }
- break;
-
- case st_flags:
- switch (ch) {
- case '*':
- flags |= FL_SPLAT;
- break;
- case '0' ... '9':
- width = (ch - '0');
- state = st_width;
- flags |= FL_WIDTH;
- break;
- default:
- state = st_modifiers;
- p--; /* Process this character again */
- break;
- }
- break;
-
- case st_width:
- if (ch >= '0' && ch <= '9') {
- width = width * 10 + (ch - '0');
- } else {
- state = st_modifiers;
- p--; /* Process this character again */
- }
- break;
-
- case st_modifiers:
- switch (ch) {
- /* Length modifiers - nonterminal sequences */
- case 'h':
- rank--; /* Shorter rank */
- break;
- case 'l':
- rank++; /* Longer rank */
- break;
- case 'j':
- rank = INTMAX_RANK;
- break;
- case 'z':
- rank = SIZE_T_RANK;
- break;
- case 't':
- rank = PTRDIFF_T_RANK;
- break;
- case 'L':
- case 'q':
- rank = rank_longlong; /* long double/long long */
- break;
-
- default:
- /* Output modifiers - terminal sequences */
- state = st_normal; /* Next state will be normal */
- if (rank < MIN_RANK) /* Canonicalize rank */
- rank = MIN_RANK;
- else if (rank > MAX_RANK)
- rank = MAX_RANK;
-
- switch (ch) {
- case 'P': /* Upper case pointer */
- case 'p': /* Pointer */
-#if 0 /* Enable this to allow null pointers by name */
- q = skipspace(q);
- if (!isdigit((unsigned char)*q)) {
- static const char *const nullnames[] =
- { "null", "nul", "nil", "(null)", "(nul)", "(nil)",
-0 };
- const char *const *np;
-
- /* Check to see if it's a null pointer by name */
- for (np = nullnames; *np; np++) {
- if (!strncasecmp(q, *np, strlen(*np))) {
- val = (uintmax_t) ((void *)NULL);
- goto set_integer;
- }
- }
- /* Failure */
- bail = bail_err;
- break;
- }
- /* else */
-#endif
- rank = rank_ptr;
- base = 0;
- sign = 0;
- goto scan_int;
-
- case 'i': /* Base-independent integer */
- base = 0;
- sign = 1;
- goto scan_int;
-
- case 'd': /* Decimal integer */
- base = 10;
- sign = 1;
- goto scan_int;
-
- case 'o': /* Octal integer */
- base = 8;
- sign = 0;
- goto scan_int;
-
- case 'u': /* Unsigned decimal integer */
- base = 10;
- sign = 0;
- goto scan_int;
-
- case 'x': /* Hexadecimal integer */
- case 'X':
- base = 16;
- sign = 0;
- goto scan_int;
-
- case 'n': /* Number of characters consumed */
- val = (q - buffer);
- goto set_integer;
-
-scan_int:
- q = skipspace(q);
- if (!*q) {
- bail = bail_eof;
- break;
- }
- val = strntoumax(q, (char **)&qq, base, width);
- if (qq == q) {
- bail = bail_err;
- break;
- }
- q = qq;
- converted++;
- /* fall through */
-
-set_integer:
- if (!(flags & FL_SPLAT)) {
- switch (rank) {
- case rank_char:
- *va_arg(ap, unsigned char *) = (unsigned char)val;
- break;
- case rank_short:
- *va_arg(ap, unsigned short *) = (unsigned short)val;
- break;
- case rank_int:
- *va_arg(ap, unsigned int *) = (unsigned int)val;
- break;
- case rank_long:
- *va_arg(ap, unsigned long *) = (unsigned long)val;
- break;
- case rank_longlong:
- *va_arg(ap, unsigned long long *) =
- (unsigned long long)val;
- break;
- case rank_ptr:
- *va_arg(ap, void **) = (void *)(uintptr_t) val;
- break;
- }
- }
- break;
-
- case 'c': /* Character */
- width = (flags & FL_WIDTH) ? width : 1; /* Default width == 1 */
- sarg = va_arg(ap, char *);
- while (width--) {
- if (!*q) {
- bail = bail_eof;
- break;
- }
- *sarg++ = *q++;
- }
- if (!bail)
- converted++;
- break;
-
- case 's': /* String */
- {
- char *sp;
- sp = sarg = va_arg(ap, char *);
- while (width-- && *q && !isspace((unsigned char)*q)) {
- *sp++ = *q++;
- }
- if (sarg != sp) {
- *sp = '\0'; /* Terminate output */
- converted++;
- } else {
- bail = bail_eof;
- }
- }
- break;
-
- case '[': /* Character range */
- sarg = va_arg(ap, char *);
- state = st_match_init;
- matchinv = 0;
- memset(matchmap, 0, sizeof matchmap);
- break;
-
- case '%': /* %% sequence */
- if (*q == '%')
- q++;
- else
- bail = bail_err;
- break;
-
- default: /* Anything else */
- bail = bail_err; /* Unknown sequence */
- break;
- }
- }
- break;
-
- case st_match_init: /* Initial state for %[ match */
- if (ch == '^' && !(flags & FL_INV)) {
- matchinv = 1;
- } else {
- set_bit(matchmap, (unsigned char)ch);
- state = st_match;
- }
- break;
-
- case st_match: /* Main state for %[ match */
- if (ch == ']') {
- goto match_run;
- } else if (ch == '-') {
- range_start = (unsigned char)ch;
- state = st_match_range;
- } else {
- set_bit(matchmap, (unsigned char)ch);
- }
- break;
-
- case st_match_range: /* %[ match after - */
- if (ch == ']') {
- set_bit(matchmap, (unsigned char)'-'); /* - was last character */
- goto match_run;
- } else {
- int i;
- for (i = range_start; i < (unsigned char)ch; i++)
- set_bit(matchmap, i);
- state = st_match;
- }
- break;
-
-match_run: /* Match expression finished */
- qq = q;
- while (width && *q
- && test_bit(matchmap, (unsigned char)*q) ^ matchinv) {
- *sarg++ = *q++;
- }
- if (q != qq) {
- *sarg = '\0';
- converted++;
- } else {
- bail = *q ? bail_err : bail_eof;
- }
- break;
- }
- }
-
- if (bail == bail_eof && !converted)
- converted = -1; /* Return EOF (-1) */
-
- return converted;
-}