summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-06-12 12:19:09 +0200
committerSven Eden <yamakuzure@gmx.net>2017-06-16 10:12:58 +0200
commita3b86c20543b69c165d1aa52178d72710f5c853e (patch)
tree0f82f801918aa7509d18f0c5d58bba87519a86e2 /src/shared
parentea4ffd91b825d5caab2fba81ee578dee932fe9cb (diff)
Prep v229.5: Move parse-printf-format.? back to src/basic it is needed there.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/parse-printf-format.c275
-rw-r--r--src/shared/parse-printf-format.h56
2 files changed, 0 insertions, 331 deletions
diff --git a/src/shared/parse-printf-format.c b/src/shared/parse-printf-format.c
deleted file mode 100644
index a99952b70..000000000
--- a/src/shared/parse-printf-format.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/***
- This file is part of systemd.
-
- Copyright 2014 Emil Renner Berthing <systemd@esmil.dk>
-
- With parts from the musl C library
- Copyright 2005-2014 Rich Felker, et al.
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
-
-#include <stddef.h>
-#include <string.h>
-
-#include "parse-printf-format.h"
-
-#ifndef HAVE_PRINTF_H
-
-static const char *consume_nonarg(const char *fmt)
-{
- do {
- if (*fmt == '\0')
- return fmt;
- } while (*fmt++ != '%');
- return fmt;
-}
-
-static const char *consume_num(const char *fmt)
-{
- for (;*fmt >= '0' && *fmt <= '9'; fmt++)
- /* do nothing */;
- return fmt;
-}
-
-static const char *consume_argn(const char *fmt, size_t *arg)
-{
- const char *p = fmt;
- size_t val = 0;
-
- if (*p < '1' || *p > '9')
- return fmt;
- do {
- val = 10*val + (*p++ - '0');
- } while (*p >= '0' && *p <= '9');
-
- if (*p != '$')
- return fmt;
- *arg = val;
- return p+1;
-}
-
-static const char *consume_flags(const char *fmt)
-{
- while (1) {
- switch (*fmt) {
- case '#':
- case '0':
- case '-':
- case ' ':
- case '+':
- case '\'':
- case 'I':
- fmt++;
- continue;
- }
- return fmt;
- }
-}
-
-enum state {
- BARE,
- LPRE,
- LLPRE,
- HPRE,
- HHPRE,
- BIGLPRE,
- ZTPRE,
- JPRE,
- STOP
-};
-
-enum type {
- NONE,
- PTR,
- INT,
- UINT,
- ULLONG,
- LONG,
- ULONG,
- SHORT,
- USHORT,
- CHAR,
- UCHAR,
- LLONG,
- SIZET,
- IMAX,
- UMAX,
- PDIFF,
- UIPTR,
- DBL,
- LDBL,
- MAXTYPE
-};
-
-static const short pa_types[MAXTYPE] = {
- [NONE] = PA_INT,
- [PTR] = PA_POINTER,
- [INT] = PA_INT,
- [UINT] = PA_INT,
- [ULLONG] = PA_INT | PA_FLAG_LONG_LONG,
- [LONG] = PA_INT | PA_FLAG_LONG,
- [ULONG] = PA_INT | PA_FLAG_LONG,
- [SHORT] = PA_INT | PA_FLAG_SHORT,
- [USHORT] = PA_INT | PA_FLAG_SHORT,
- [CHAR] = PA_CHAR,
- [UCHAR] = PA_CHAR,
- [LLONG] = PA_INT | PA_FLAG_LONG_LONG,
- [SIZET] = PA_INT | PA_FLAG_LONG,
- [IMAX] = PA_INT | PA_FLAG_LONG_LONG,
- [UMAX] = PA_INT | PA_FLAG_LONG_LONG,
- [PDIFF] = PA_INT | PA_FLAG_LONG_LONG,
- [UIPTR] = PA_INT | PA_FLAG_LONG,
- [DBL] = PA_DOUBLE,
- [LDBL] = PA_DOUBLE | PA_FLAG_LONG_DOUBLE
-};
-
-#define S(x) [(x)-'A']
-#define E(x) (STOP + (x))
-
-static const unsigned char states[]['z'-'A'+1] = {
- { /* 0: bare types */
- S('d') = E(INT), S('i') = E(INT),
- S('o') = E(UINT),S('u') = E(UINT),S('x') = E(UINT), S('X') = E(UINT),
- S('e') = E(DBL), S('f') = E(DBL), S('g') = E(DBL), S('a') = E(DBL),
- S('E') = E(DBL), S('F') = E(DBL), S('G') = E(DBL), S('A') = E(DBL),
- S('c') = E(CHAR),S('C') = E(INT),
- S('s') = E(PTR), S('S') = E(PTR), S('p') = E(UIPTR),S('n') = E(PTR),
- S('m') = E(NONE),
- S('l') = LPRE, S('h') = HPRE, S('L') = BIGLPRE,
- S('z') = ZTPRE, S('j') = JPRE, S('t') = ZTPRE
- }, { /* 1: l-prefixed */
- S('d') = E(LONG), S('i') = E(LONG),
- S('o') = E(ULONG),S('u') = E(ULONG),S('x') = E(ULONG),S('X') = E(ULONG),
- S('e') = E(DBL), S('f') = E(DBL), S('g') = E(DBL), S('a') = E(DBL),
- S('E') = E(DBL), S('F') = E(DBL), S('G') = E(DBL), S('A') = E(DBL),
- S('c') = E(INT), S('s') = E(PTR), S('n') = E(PTR),
- S('l') = LLPRE
- }, { /* 2: ll-prefixed */
- S('d') = E(LLONG), S('i') = E(LLONG),
- S('o') = E(ULLONG),S('u') = E(ULLONG),
- S('x') = E(ULLONG),S('X') = E(ULLONG),
- S('n') = E(PTR)
- }, { /* 3: h-prefixed */
- S('d') = E(SHORT), S('i') = E(SHORT),
- S('o') = E(USHORT),S('u') = E(USHORT),
- S('x') = E(USHORT),S('X') = E(USHORT),
- S('n') = E(PTR),
- S('h') = HHPRE
- }, { /* 4: hh-prefixed */
- S('d') = E(CHAR), S('i') = E(CHAR),
- S('o') = E(UCHAR),S('u') = E(UCHAR),
- S('x') = E(UCHAR),S('X') = E(UCHAR),
- S('n') = E(PTR)
- }, { /* 5: L-prefixed */
- S('e') = E(LDBL),S('f') = E(LDBL),S('g') = E(LDBL), S('a') = E(LDBL),
- S('E') = E(LDBL),S('F') = E(LDBL),S('G') = E(LDBL), S('A') = E(LDBL),
- S('n') = E(PTR)
- }, { /* 6: z- or t-prefixed (assumed to be same size) */
- S('d') = E(PDIFF),S('i') = E(PDIFF),
- S('o') = E(SIZET),S('u') = E(SIZET),
- S('x') = E(SIZET),S('X') = E(SIZET),
- S('n') = E(PTR)
- }, { /* 7: j-prefixed */
- S('d') = E(IMAX), S('i') = E(IMAX),
- S('o') = E(UMAX), S('u') = E(UMAX),
- S('x') = E(UMAX), S('X') = E(UMAX),
- S('n') = E(PTR)
- }
-};
-
-size_t parse_printf_format(const char *fmt, size_t n, int *types)
-{
- size_t i = 0;
- size_t last = 0;
-
- memset(types, 0, n);
-
- while (1) {
- size_t arg;
- unsigned int state;
-
- fmt = consume_nonarg(fmt);
- if (*fmt == '\0')
- break;
- if (*fmt == '%') {
- fmt++;
- continue;
- }
- arg = 0;
- fmt = consume_argn(fmt, &arg);
- /* flags */
- fmt = consume_flags(fmt);
- /* width */
- if (*fmt == '*') {
- size_t warg = 0;
- fmt = consume_argn(fmt+1, &warg);
- if (warg == 0)
- warg = ++i;
- if (warg > last)
- last = warg;
- if (warg <= n && types[warg-1] == NONE)
- types[warg-1] = INT;
- } else
- fmt = consume_num(fmt);
- /* precision */
- if (*fmt == '.') {
- fmt++;
- if (*fmt == '*') {
- size_t parg = 0;
- fmt = consume_argn(fmt+1, &parg);
- if (parg == 0)
- parg = ++i;
- if (parg > last)
- last = parg;
- if (parg <= n && types[parg-1] == NONE)
- types[parg-1] = INT;
- } else {
- if (*fmt == '-')
- fmt++;
- fmt = consume_num(fmt);
- }
- }
- /* length modifier and conversion specifier */
- state = BARE;
- do {
- unsigned char c = *fmt++;
-
- if (c < 'A' || c > 'z')
- continue;
- state = states[state]S(c);
- if (state == 0)
- continue;
- } while (state < STOP);
-
- if (state == E(NONE))
- continue;
-
- if (arg == 0)
- arg = ++i;
- if (arg > last)
- last = arg;
- if (arg <= n)
- types[arg-1] = state - STOP;
- }
-
- if (last > n)
- last = n;
- for (i = 0; i < last; i++)
- types[i] = pa_types[types[i]];
-
- return last;
-}
-
-#endif // HAVE_PRINTF_H
diff --git a/src/shared/parse-printf-format.h b/src/shared/parse-printf-format.h
deleted file mode 100644
index 5ca0fdf56..000000000
--- a/src/shared/parse-printf-format.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/***
- This file is part of systemd.
-
- Copyright 2014 Emil Renner Berthing <systemd@esmil.dk>
-
- With parts from the GNU C Library
- Copyright 1991-2014 Free Software Foundation, Inc.
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
-
-#pragma once
-
-#include "config.h"
-
-#ifdef HAVE_PRINTF_H
-#include <printf.h>
-#else
-
-#include <stddef.h>
-
-enum { /* C type: */
- PA_INT, /* int */
- PA_CHAR, /* int, cast to char */
- PA_WCHAR, /* wide char */
- PA_STRING, /* const char *, a '\0'-terminated string */
- PA_WSTRING, /* const wchar_t *, wide character string */
- PA_POINTER, /* void * */
- PA_FLOAT, /* float */
- PA_DOUBLE, /* double */
- PA_LAST
-};
-
-/* Flag bits that can be set in a type returned by `parse_printf_format'. */
-#define PA_FLAG_MASK 0xff00
-#define PA_FLAG_LONG_LONG (1 << 8)
-#define PA_FLAG_LONG_DOUBLE PA_FLAG_LONG_LONG
-#define PA_FLAG_LONG (1 << 9)
-#define PA_FLAG_SHORT (1 << 10)
-#define PA_FLAG_PTR (1 << 11)
-
-size_t parse_printf_format(const char *fmt, size_t n, int *types);
-
-#endif /* HAVE_PRINTF_H */
-