fehQlibs 28
Qlibs
Loading...
Searching...
No Matches
scan.c
Go to the documentation of this file.
1#include "scan.h"
2
10
11unsigned int scan_plusminus(const char *s,int *sign)
12{
13 if (*s == '+') { *sign = 1; return 1; }
14 if (*s == '-') { *sign = -1; return 1; }
15 *sign = 1; return 0;
16}
17
18// Octal input
19
20unsigned int scan_8long(const char *s,unsigned long *u)
21{
22 unsigned int pos = 0;
23 unsigned long result = 0;
24 unsigned long c;
25
26 while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 8) {
27 result = result * 8 + c;
28 ++pos;
29 }
30 *u = result;
31 return pos;
32}
33
34// Decimal unsigned input -> _Generic: scan_dnum
35
36unsigned int scan_ulong(const char *s,unsigned long *u)
37{
38 unsigned int pos = 0;
39 unsigned long result = 0;
40 unsigned long c;
41
42 while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 10) {
43 result = result * 10 + c;
44 ++pos;
45 }
46 *u = result;
47 return pos;
48}
49
50unsigned int scan_uint(const char *s,unsigned int *u)
51{
52 unsigned int pos;
53 unsigned long result;
54
55 pos = scan_ulong(s,&result);
56 *u = result;
57 return pos;
58}
59
60// Decimal signed input -> _Generic: scan_dnum
61
62unsigned int scan_long(const char *s,long *i)
63{
64 int sign;
65 unsigned long u;
66 unsigned int len;
67
68 len = scan_plusminus(s,&sign); s += len;
69 len += scan_ulong(s,&u);
70 if (sign < 0) *i = -u; else *i = u;
71 return len;
72}
73
74// Hexadecimal unsigned input -> _Generic scan_xnum
75
76static long int fromhex(unsigned char c)
77{
78 if (c>='0' && c<='9')
79 return c-'0';
80 else if (c>='A' && c<='F')
81 return c-'A'+10;
82 else if (c>='a' && c<='f')
83 return c-'a'+10;
84 return -1;
85}
86
87unsigned int scan_0x(const char *s,unsigned int *u)
88{
89 unsigned int pos = 0;
90 unsigned long result = 0;
91 long int c;
92
93 while ((c = fromhex((unsigned char) (s[pos]))) >= 0) {
94 result = (result << 4) + c;
95 ++pos;
96 }
97 *u = result;
98 return pos;
99}
100
101unsigned int scan_xint(const char *s,unsigned int *i)
102{
103 const char *t = s;
104 unsigned int l = 0;
105 unsigned char c;
106
107 while ((l >> (sizeof(l)*8 - 4)) == 0
108 && (c = (unsigned char)fromhex((unsigned char) *t))<16) {
109 l= (l << 4) + c;
110 ++t;
111 }
112 *i = l;
113 return (unsigned int)(t-s);
114}
115
116unsigned int scan_xlong(const char *s,unsigned long *u)
117{
118 const char *t = s;
119 int l = 0;
120 unsigned char c;
121
122 while ((c = fromhex(*t)) < 16) {
123 l = (l<<4)+c;
124 ++t;
125 }
126 *u=l;
127 return t-s;
128}
int fromhex(unsigned char)
Definition fmt.c:79
unsigned int scan_xlong(const char *s, unsigned long *u)
Definition scan.c:116
unsigned int scan_uint(const char *s, unsigned int *u)
Definition scan.c:50
unsigned int scan_ulong(const char *s, unsigned long *u)
Definition scan.c:36
unsigned int scan_plusminus(const char *s, int *sign)
Definition scan.c:11
unsigned int scan_xint(const char *s, unsigned int *i)
Definition scan.c:101
unsigned int scan_long(const char *s, long *i)
Definition scan.c:62
unsigned int scan_8long(const char *s, unsigned long *u)
Definition scan.c:20
unsigned int scan_0x(const char *s, unsigned int *u)
Definition scan.c:87