|  | /* Copyright (c) 2015 Google Inc | 
|  | * Davide Libenzi <dlibenzi@google.com> | 
|  | * See LICENSE for details. | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <ros/common.h> | 
|  | #include <sys/types.h> | 
|  | #include <sys/stat.h> | 
|  | #include <stdint.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <stdlib.h> | 
|  | #include <unistd.h> | 
|  | #include <fcntl.h> | 
|  |  | 
|  | #define min(a, b)							\ | 
|  | ({ __typeof__(a) _a = (a);					\ | 
|  | __typeof__(b) _b = (b);					\ | 
|  | _a < _b ? _a : _b; }) | 
|  | #define max(a, b)							\ | 
|  | ({ __typeof__(a) _a = (a);					\ | 
|  | __typeof__(b) _b = (b);					\ | 
|  | _a > _b ? _a : _b; }) | 
|  | #define always_assert(c)						\ | 
|  | do {									\ | 
|  | if (!(c))							\ | 
|  | fprintf(stderr, "%s: %d: Assertion failed: " #c "\n",	\ | 
|  | __FILE__, __LINE__);			\ | 
|  | } while (0) | 
|  |  | 
|  | int xopen(const char *path, int flags, mode_t mode); | 
|  | void xwrite(int fd, const void *data, size_t size); | 
|  | void xread(int fd, void *data, size_t size); | 
|  | void xpwrite(int fd, const void *data, size_t size, off_t off); | 
|  | void xpread(int fd, void *data, size_t size, off_t off); | 
|  | FILE *xfopen(const char *path, const char *mode); | 
|  | FILE *xfdopen(int fd, const char *mode); | 
|  | off_t xfsize(FILE *file); | 
|  | void xfwrite(const void *data, size_t size, FILE *file); | 
|  | void xfseek(FILE *file, off_t offset, int whence); | 
|  | void *xmalloc(size_t size); | 
|  | void *xzmalloc(size_t size); | 
|  | char *xstrdup(const char *str); | 
|  | const char *vb_decode_uint64(const char *data, uint64_t *pval); | 
|  | int vb_fdecode_uint64(FILE *file, uint64_t *pval); | 
|  | uint8_t nibble_to_num(char c); | 
|  |  | 
|  | static inline void cpuid(uint32_t ieax, uint32_t iecx, uint32_t *eaxp, | 
|  | uint32_t *ebxp, uint32_t *ecxp, uint32_t *edxp) | 
|  | { | 
|  | uint32_t eax, ebx, ecx, edx; | 
|  |  | 
|  | asm volatile("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) | 
|  | : "a" (ieax), "c" (iecx)); | 
|  | if (eaxp) | 
|  | *eaxp = eax; | 
|  | if (ebxp) | 
|  | *ebxp = ebx; | 
|  | if (ecxp) | 
|  | *ecxp = ecx; | 
|  | if (edxp) | 
|  | *edxp = edx; | 
|  | } | 
|  |  | 
|  | static inline void set_bitno(void *data, size_t bitno) | 
|  | { | 
|  | ((char *) data)[bitno / 8] |= 1 << (bitno % 8); | 
|  | } |