xref: /qemu/util/cutils.c (revision 33577b47)
1 /*
2  * Simple C functions to supplement the C library
3  *
4  * Copyright (c) 2006 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "qemu/osdep.h"
25 #include "qemu-common.h"
26 #include "qemu/host-utils.h"
27 #include <math.h>
28 
29 #include "qemu/sockets.h"
30 #include "qemu/iov.h"
31 #include "net/net.h"
32 
33 void strpadcpy(char *buf, int buf_size, const char *str, char pad)
34 {
35     int len = qemu_strnlen(str, buf_size);
36     memcpy(buf, str, len);
37     memset(buf + len, pad, buf_size - len);
38 }
39 
40 void pstrcpy(char *buf, int buf_size, const char *str)
41 {
42     int c;
43     char *q = buf;
44 
45     if (buf_size <= 0)
46         return;
47 
48     for(;;) {
49         c = *str++;
50         if (c == 0 || q >= buf + buf_size - 1)
51             break;
52         *q++ = c;
53     }
54     *q = '\0';
55 }
56 
57 /* strcat and truncate. */
58 char *pstrcat(char *buf, int buf_size, const char *s)
59 {
60     int len;
61     len = strlen(buf);
62     if (len < buf_size)
63         pstrcpy(buf + len, buf_size - len, s);
64     return buf;
65 }
66 
67 int strstart(const char *str, const char *val, const char **ptr)
68 {
69     const char *p, *q;
70     p = str;
71     q = val;
72     while (*q != '\0') {
73         if (*p != *q)
74             return 0;
75         p++;
76         q++;
77     }
78     if (ptr)
79         *ptr = p;
80     return 1;
81 }
82 
83 int stristart(const char *str, const char *val, const char **ptr)
84 {
85     const char *p, *q;
86     p = str;
87     q = val;
88     while (*q != '\0') {
89         if (qemu_toupper(*p) != qemu_toupper(*q))
90             return 0;
91         p++;
92         q++;
93     }
94     if (ptr)
95         *ptr = p;
96     return 1;
97 }
98 
99 /* XXX: use host strnlen if available ? */
100 int qemu_strnlen(const char *s, int max_len)
101 {
102     int i;
103 
104     for(i = 0; i < max_len; i++) {
105         if (s[i] == '\0') {
106             break;
107         }
108     }
109     return i;
110 }
111 
112 char *qemu_strsep(char **input, const char *delim)
113 {
114     char *result = *input;
115     if (result != NULL) {
116         char *p;
117 
118         for (p = result; *p != '\0'; p++) {
119             if (strchr(delim, *p)) {
120                 break;
121             }
122         }
123         if (*p == '\0') {
124             *input = NULL;
125         } else {
126             *p = '\0';
127             *input = p + 1;
128         }
129     }
130     return result;
131 }
132 
133 time_t mktimegm(struct tm *tm)
134 {
135     time_t t;
136     int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
137     if (m < 3) {
138         m += 12;
139         y--;
140     }
141     t = 86400ULL * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 +
142                  y / 400 - 719469);
143     t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
144     return t;
145 }
146 
147 /*
148  * Make sure data goes on disk, but if possible do not bother to
149  * write out the inode just for timestamp updates.
150  *
151  * Unfortunately even in 2009 many operating systems do not support
152  * fdatasync and have to fall back to fsync.
153  */
154 int qemu_fdatasync(int fd)
155 {
156 #ifdef CONFIG_FDATASYNC
157     return fdatasync(fd);
158 #else
159     return fsync(fd);
160 #endif
161 }
162 
163 static bool
164 can_use_buffer_find_nonzero_offset_inner(const void *buf, size_t len)
165 {
166     return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR
167                    * sizeof(VECTYPE)) == 0
168             && ((uintptr_t) buf) % sizeof(VECTYPE) == 0);
169 }
170 
171 /*
172  * Searches for an area with non-zero content in a buffer
173  *
174  * Attention! The len must be a multiple of
175  * BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR * sizeof(VECTYPE)
176  * and addr must be a multiple of sizeof(VECTYPE) due to
177  * restriction of optimizations in this function.
178  *
179  * can_use_buffer_find_nonzero_offset_inner() can be used to
180  * check these requirements.
181  *
182  * The return value is the offset of the non-zero area rounded
183  * down to a multiple of sizeof(VECTYPE) for the first
184  * BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR chunks and down to
185  * BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR * sizeof(VECTYPE)
186  * afterwards.
187  *
188  * If the buffer is all zero the return value is equal to len.
189  */
190 
191 static size_t buffer_find_nonzero_offset_inner(const void *buf, size_t len)
192 {
193     const VECTYPE *p = buf;
194     const VECTYPE zero = (VECTYPE){0};
195     size_t i;
196 
197     assert(can_use_buffer_find_nonzero_offset_inner(buf, len));
198 
199     if (!len) {
200         return 0;
201     }
202 
203     for (i = 0; i < BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR; i++) {
204         if (!ALL_EQ(p[i], zero)) {
205             return i * sizeof(VECTYPE);
206         }
207     }
208 
209     for (i = BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR;
210          i < len / sizeof(VECTYPE);
211          i += BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR) {
212         VECTYPE tmp0 = VEC_OR(p[i + 0], p[i + 1]);
213         VECTYPE tmp1 = VEC_OR(p[i + 2], p[i + 3]);
214         VECTYPE tmp2 = VEC_OR(p[i + 4], p[i + 5]);
215         VECTYPE tmp3 = VEC_OR(p[i + 6], p[i + 7]);
216         VECTYPE tmp01 = VEC_OR(tmp0, tmp1);
217         VECTYPE tmp23 = VEC_OR(tmp2, tmp3);
218         if (!ALL_EQ(VEC_OR(tmp01, tmp23), zero)) {
219             break;
220         }
221     }
222 
223     return i * sizeof(VECTYPE);
224 }
225 
226 /*
227  * GCC before version 4.9 has a bug which will cause the target
228  * attribute work incorrectly and failed to compile in some case,
229  * restrict the gcc version to 4.9+ to prevent the failure.
230  */
231 
232 #if defined CONFIG_AVX2_OPT && QEMU_GNUC_PREREQ(4, 9)
233 #pragma GCC push_options
234 #pragma GCC target("avx2")
235 #include <cpuid.h>
236 #include <immintrin.h>
237 
238 #define AVX2_VECTYPE        __m256i
239 #define AVX2_SPLAT(p)       _mm256_set1_epi8(*(p))
240 #define AVX2_ALL_EQ(v1, v2) \
241     (_mm256_movemask_epi8(_mm256_cmpeq_epi8(v1, v2)) == 0xFFFFFFFF)
242 #define AVX2_VEC_OR(v1, v2) (_mm256_or_si256(v1, v2))
243 
244 static bool
245 can_use_buffer_find_nonzero_offset_avx2(const void *buf, size_t len)
246 {
247     return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR
248                    * sizeof(AVX2_VECTYPE)) == 0
249             && ((uintptr_t) buf) % sizeof(AVX2_VECTYPE) == 0);
250 }
251 
252 static size_t buffer_find_nonzero_offset_avx2(const void *buf, size_t len)
253 {
254     const AVX2_VECTYPE *p = buf;
255     const AVX2_VECTYPE zero = (AVX2_VECTYPE){0};
256     size_t i;
257 
258     assert(can_use_buffer_find_nonzero_offset_avx2(buf, len));
259 
260     if (!len) {
261         return 0;
262     }
263 
264     for (i = 0; i < BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR; i++) {
265         if (!AVX2_ALL_EQ(p[i], zero)) {
266             return i * sizeof(AVX2_VECTYPE);
267         }
268     }
269 
270     for (i = BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR;
271          i < len / sizeof(AVX2_VECTYPE);
272          i += BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR) {
273         AVX2_VECTYPE tmp0 = AVX2_VEC_OR(p[i + 0], p[i + 1]);
274         AVX2_VECTYPE tmp1 = AVX2_VEC_OR(p[i + 2], p[i + 3]);
275         AVX2_VECTYPE tmp2 = AVX2_VEC_OR(p[i + 4], p[i + 5]);
276         AVX2_VECTYPE tmp3 = AVX2_VEC_OR(p[i + 6], p[i + 7]);
277         AVX2_VECTYPE tmp01 = AVX2_VEC_OR(tmp0, tmp1);
278         AVX2_VECTYPE tmp23 = AVX2_VEC_OR(tmp2, tmp3);
279         if (!AVX2_ALL_EQ(AVX2_VEC_OR(tmp01, tmp23), zero)) {
280             break;
281         }
282     }
283 
284     return i * sizeof(AVX2_VECTYPE);
285 }
286 
287 static bool avx2_support(void)
288 {
289     int a, b, c, d;
290 
291     if (__get_cpuid_max(0, NULL) < 7) {
292         return false;
293     }
294 
295     __cpuid_count(7, 0, a, b, c, d);
296 
297     return b & bit_AVX2;
298 }
299 
300 bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len) \
301          __attribute__ ((ifunc("can_use_buffer_find_nonzero_offset_ifunc")));
302 size_t buffer_find_nonzero_offset(const void *buf, size_t len) \
303          __attribute__ ((ifunc("buffer_find_nonzero_offset_ifunc")));
304 
305 static void *buffer_find_nonzero_offset_ifunc(void)
306 {
307     typeof(buffer_find_nonzero_offset) *func = (avx2_support()) ?
308         buffer_find_nonzero_offset_avx2 : buffer_find_nonzero_offset_inner;
309 
310     return func;
311 }
312 
313 static void *can_use_buffer_find_nonzero_offset_ifunc(void)
314 {
315     typeof(can_use_buffer_find_nonzero_offset) *func = (avx2_support()) ?
316         can_use_buffer_find_nonzero_offset_avx2 :
317         can_use_buffer_find_nonzero_offset_inner;
318 
319     return func;
320 }
321 #pragma GCC pop_options
322 #else
323 bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
324 {
325     return can_use_buffer_find_nonzero_offset_inner(buf, len);
326 }
327 
328 size_t buffer_find_nonzero_offset(const void *buf, size_t len)
329 {
330     return buffer_find_nonzero_offset_inner(buf, len);
331 }
332 #endif
333 
334 /*
335  * Checks if a buffer is all zeroes
336  *
337  * Attention! The len must be a multiple of 4 * sizeof(long) due to
338  * restriction of optimizations in this function.
339  */
340 bool buffer_is_zero(const void *buf, size_t len)
341 {
342     /*
343      * Use long as the biggest available internal data type that fits into the
344      * CPU register and unroll the loop to smooth out the effect of memory
345      * latency.
346      */
347 
348     size_t i;
349     long d0, d1, d2, d3;
350     const long * const data = buf;
351 
352     /* use vector optimized zero check if possible */
353     if (can_use_buffer_find_nonzero_offset(buf, len)) {
354         return buffer_find_nonzero_offset(buf, len) == len;
355     }
356 
357     assert(len % (4 * sizeof(long)) == 0);
358     len /= sizeof(long);
359 
360     for (i = 0; i < len; i += 4) {
361         d0 = data[i + 0];
362         d1 = data[i + 1];
363         d2 = data[i + 2];
364         d3 = data[i + 3];
365 
366         if (d0 || d1 || d2 || d3) {
367             return false;
368         }
369     }
370 
371     return true;
372 }
373 
374 #ifndef _WIN32
375 /* Sets a specific flag */
376 int fcntl_setfl(int fd, int flag)
377 {
378     int flags;
379 
380     flags = fcntl(fd, F_GETFL);
381     if (flags == -1)
382         return -errno;
383 
384     if (fcntl(fd, F_SETFL, flags | flag) == -1)
385         return -errno;
386 
387     return 0;
388 }
389 #endif
390 
391 static int64_t suffix_mul(char suffix, int64_t unit)
392 {
393     switch (qemu_toupper(suffix)) {
394     case QEMU_STRTOSZ_DEFSUFFIX_B:
395         return 1;
396     case QEMU_STRTOSZ_DEFSUFFIX_KB:
397         return unit;
398     case QEMU_STRTOSZ_DEFSUFFIX_MB:
399         return unit * unit;
400     case QEMU_STRTOSZ_DEFSUFFIX_GB:
401         return unit * unit * unit;
402     case QEMU_STRTOSZ_DEFSUFFIX_TB:
403         return unit * unit * unit * unit;
404     case QEMU_STRTOSZ_DEFSUFFIX_PB:
405         return unit * unit * unit * unit * unit;
406     case QEMU_STRTOSZ_DEFSUFFIX_EB:
407         return unit * unit * unit * unit * unit * unit;
408     }
409     return -1;
410 }
411 
412 /*
413  * Convert string to bytes, allowing either B/b for bytes, K/k for KB,
414  * M/m for MB, G/g for GB or T/t for TB. End pointer will be returned
415  * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on
416  * other error.
417  */
418 int64_t qemu_strtosz_suffix_unit(const char *nptr, char **end,
419                             const char default_suffix, int64_t unit)
420 {
421     int64_t retval = -EINVAL;
422     char *endptr;
423     unsigned char c;
424     int mul_required = 0;
425     double val, mul, integral, fraction;
426 
427     errno = 0;
428     val = strtod(nptr, &endptr);
429     if (isnan(val) || endptr == nptr || errno != 0) {
430         goto fail;
431     }
432     fraction = modf(val, &integral);
433     if (fraction != 0) {
434         mul_required = 1;
435     }
436     c = *endptr;
437     mul = suffix_mul(c, unit);
438     if (mul >= 0) {
439         endptr++;
440     } else {
441         mul = suffix_mul(default_suffix, unit);
442         assert(mul >= 0);
443     }
444     if (mul == 1 && mul_required) {
445         goto fail;
446     }
447     if ((val * mul >= INT64_MAX) || val < 0) {
448         retval = -ERANGE;
449         goto fail;
450     }
451     retval = val * mul;
452 
453 fail:
454     if (end) {
455         *end = endptr;
456     }
457 
458     return retval;
459 }
460 
461 int64_t qemu_strtosz_suffix(const char *nptr, char **end,
462                             const char default_suffix)
463 {
464     return qemu_strtosz_suffix_unit(nptr, end, default_suffix, 1024);
465 }
466 
467 int64_t qemu_strtosz(const char *nptr, char **end)
468 {
469     return qemu_strtosz_suffix(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB);
470 }
471 
472 /**
473  * Helper function for qemu_strto*l() functions.
474  */
475 static int check_strtox_error(const char *p, char *endptr, const char **next,
476                               int err)
477 {
478     /* If no conversion was performed, prefer BSD behavior over glibc
479      * behavior.
480      */
481     if (err == 0 && endptr == p) {
482         err = EINVAL;
483     }
484     if (!next && *endptr) {
485         return -EINVAL;
486     }
487     if (next) {
488         *next = endptr;
489     }
490     return -err;
491 }
492 
493 /**
494  * QEMU wrappers for strtol(), strtoll(), strtoul(), strotull() C functions.
495  *
496  * Convert ASCII string @nptr to a long integer value
497  * from the given @base. Parameters @nptr, @endptr, @base
498  * follows same semantics as strtol() C function.
499  *
500  * Unlike from strtol() function, if @endptr is not NULL, this
501  * function will return -EINVAL whenever it cannot fully convert
502  * the string in @nptr with given @base to a long. This function returns
503  * the result of the conversion only through the @result parameter.
504  *
505  * If NULL is passed in @endptr, then the whole string in @ntpr
506  * is a number otherwise it returns -EINVAL.
507  *
508  * RETURN VALUE
509  * Unlike from strtol() function, this wrapper returns either
510  * -EINVAL or the errno set by strtol() function (e.g -ERANGE).
511  * If the conversion overflows, -ERANGE is returned, and @result
512  * is set to the max value of the desired type
513  * (e.g. LONG_MAX, LLONG_MAX, ULONG_MAX, ULLONG_MAX). If the case
514  * of underflow, -ERANGE is returned, and @result is set to the min
515  * value of the desired type. For strtol(), strtoll(), @result is set to
516  * LONG_MIN, LLONG_MIN, respectively, and for strtoul(), strtoull() it
517  * is set to 0.
518  */
519 int qemu_strtol(const char *nptr, const char **endptr, int base,
520                 long *result)
521 {
522     char *p;
523     int err = 0;
524     if (!nptr) {
525         if (endptr) {
526             *endptr = nptr;
527         }
528         err = -EINVAL;
529     } else {
530         errno = 0;
531         *result = strtol(nptr, &p, base);
532         err = check_strtox_error(nptr, p, endptr, errno);
533     }
534     return err;
535 }
536 
537 /**
538  * Converts ASCII string to an unsigned long integer.
539  *
540  * If string contains a negative number, value will be converted to
541  * the unsigned representation of the signed value, unless the original
542  * (nonnegated) value would overflow, in this case, it will set @result
543  * to ULONG_MAX, and return ERANGE.
544  *
545  * The same behavior holds, for qemu_strtoull() but sets @result to
546  * ULLONG_MAX instead of ULONG_MAX.
547  *
548  * See qemu_strtol() documentation for more info.
549  */
550 int qemu_strtoul(const char *nptr, const char **endptr, int base,
551                  unsigned long *result)
552 {
553     char *p;
554     int err = 0;
555     if (!nptr) {
556         if (endptr) {
557             *endptr = nptr;
558         }
559         err = -EINVAL;
560     } else {
561         errno = 0;
562         *result = strtoul(nptr, &p, base);
563         /* Windows returns 1 for negative out-of-range values.  */
564         if (errno == ERANGE) {
565             *result = -1;
566         }
567         err = check_strtox_error(nptr, p, endptr, errno);
568     }
569     return err;
570 }
571 
572 /**
573  * Converts ASCII string to a long long integer.
574  *
575  * See qemu_strtol() documentation for more info.
576  */
577 int qemu_strtoll(const char *nptr, const char **endptr, int base,
578                  int64_t *result)
579 {
580     char *p;
581     int err = 0;
582     if (!nptr) {
583         if (endptr) {
584             *endptr = nptr;
585         }
586         err = -EINVAL;
587     } else {
588         errno = 0;
589         *result = strtoll(nptr, &p, base);
590         err = check_strtox_error(nptr, p, endptr, errno);
591     }
592     return err;
593 }
594 
595 /**
596  * Converts ASCII string to an unsigned long long integer.
597  *
598  * See qemu_strtol() documentation for more info.
599  */
600 int qemu_strtoull(const char *nptr, const char **endptr, int base,
601                   uint64_t *result)
602 {
603     char *p;
604     int err = 0;
605     if (!nptr) {
606         if (endptr) {
607             *endptr = nptr;
608         }
609         err = -EINVAL;
610     } else {
611         errno = 0;
612         *result = strtoull(nptr, &p, base);
613         /* Windows returns 1 for negative out-of-range values.  */
614         if (errno == ERANGE) {
615             *result = -1;
616         }
617         err = check_strtox_error(nptr, p, endptr, errno);
618     }
619     return err;
620 }
621 
622 /**
623  * parse_uint:
624  *
625  * @s: String to parse
626  * @value: Destination for parsed integer value
627  * @endptr: Destination for pointer to first character not consumed
628  * @base: integer base, between 2 and 36 inclusive, or 0
629  *
630  * Parse unsigned integer
631  *
632  * Parsed syntax is like strtoull()'s: arbitrary whitespace, a single optional
633  * '+' or '-', an optional "0x" if @base is 0 or 16, one or more digits.
634  *
635  * If @s is null, or @base is invalid, or @s doesn't start with an
636  * integer in the syntax above, set *@value to 0, *@endptr to @s, and
637  * return -EINVAL.
638  *
639  * Set *@endptr to point right beyond the parsed integer (even if the integer
640  * overflows or is negative, all digits will be parsed and *@endptr will
641  * point right beyond them).
642  *
643  * If the integer is negative, set *@value to 0, and return -ERANGE.
644  *
645  * If the integer overflows unsigned long long, set *@value to
646  * ULLONG_MAX, and return -ERANGE.
647  *
648  * Else, set *@value to the parsed integer, and return 0.
649  */
650 int parse_uint(const char *s, unsigned long long *value, char **endptr,
651                int base)
652 {
653     int r = 0;
654     char *endp = (char *)s;
655     unsigned long long val = 0;
656 
657     if (!s) {
658         r = -EINVAL;
659         goto out;
660     }
661 
662     errno = 0;
663     val = strtoull(s, &endp, base);
664     if (errno) {
665         r = -errno;
666         goto out;
667     }
668 
669     if (endp == s) {
670         r = -EINVAL;
671         goto out;
672     }
673 
674     /* make sure we reject negative numbers: */
675     while (isspace((unsigned char)*s)) {
676         s++;
677     }
678     if (*s == '-') {
679         val = 0;
680         r = -ERANGE;
681         goto out;
682     }
683 
684 out:
685     *value = val;
686     *endptr = endp;
687     return r;
688 }
689 
690 /**
691  * parse_uint_full:
692  *
693  * @s: String to parse
694  * @value: Destination for parsed integer value
695  * @base: integer base, between 2 and 36 inclusive, or 0
696  *
697  * Parse unsigned integer from entire string
698  *
699  * Have the same behavior of parse_uint(), but with an additional check
700  * for additional data after the parsed number. If extra characters are present
701  * after the parsed number, the function will return -EINVAL, and *@v will
702  * be set to 0.
703  */
704 int parse_uint_full(const char *s, unsigned long long *value, int base)
705 {
706     char *endp;
707     int r;
708 
709     r = parse_uint(s, value, &endp, base);
710     if (r < 0) {
711         return r;
712     }
713     if (*endp) {
714         *value = 0;
715         return -EINVAL;
716     }
717 
718     return 0;
719 }
720 
721 int qemu_parse_fd(const char *param)
722 {
723     long fd;
724     char *endptr;
725 
726     errno = 0;
727     fd = strtol(param, &endptr, 10);
728     if (param == endptr /* no conversion performed */                    ||
729         errno != 0      /* not representable as long; possibly others */ ||
730         *endptr != '\0' /* final string not empty */                     ||
731         fd < 0          /* invalid as file descriptor */                 ||
732         fd > INT_MAX    /* not representable as int */) {
733         return -1;
734     }
735     return fd;
736 }
737 
738 /*
739  * Implementation of  ULEB128 (http://en.wikipedia.org/wiki/LEB128)
740  * Input is limited to 14-bit numbers
741  */
742 int uleb128_encode_small(uint8_t *out, uint32_t n)
743 {
744     g_assert(n <= 0x3fff);
745     if (n < 0x80) {
746         *out++ = n;
747         return 1;
748     } else {
749         *out++ = (n & 0x7f) | 0x80;
750         *out++ = n >> 7;
751         return 2;
752     }
753 }
754 
755 int uleb128_decode_small(const uint8_t *in, uint32_t *n)
756 {
757     if (!(*in & 0x80)) {
758         *n = *in++;
759         return 1;
760     } else {
761         *n = *in++ & 0x7f;
762         /* we exceed 14 bit number */
763         if (*in & 0x80) {
764             return -1;
765         }
766         *n |= *in++ << 7;
767         return 2;
768     }
769 }
770 
771 /*
772  * helper to parse debug environment variables
773  */
774 int parse_debug_env(const char *name, int max, int initial)
775 {
776     char *debug_env = getenv(name);
777     char *inv = NULL;
778     long debug;
779 
780     if (!debug_env) {
781         return initial;
782     }
783     errno = 0;
784     debug = strtol(debug_env, &inv, 10);
785     if (inv == debug_env) {
786         return initial;
787     }
788     if (debug < 0 || debug > max || errno != 0) {
789         fprintf(stderr, "warning: %s not in [0, %d]", name, max);
790         return initial;
791     }
792     return debug;
793 }
794 
795 /*
796  * Helper to print ethernet mac address
797  */
798 const char *qemu_ether_ntoa(const MACAddr *mac)
799 {
800     static char ret[18];
801 
802     snprintf(ret, sizeof(ret), "%02x:%02x:%02x:%02x:%02x:%02x",
803              mac->a[0], mac->a[1], mac->a[2], mac->a[3], mac->a[4], mac->a[5]);
804 
805     return ret;
806 }
807