1 /* Utility functions definitions */
13 #define SYSTEM_H_BEGIN_ extern "C" {
14 #define SYSTEM_H_END_ }
16 #define SYSTEM_H_BEGIN_
23 #define DGEN_BASEDIR ".dgen"
24 #define DGEN_RC "dgenrc"
25 #define DGEN_AUTORC "dgenrc.auto"
26 #define DGEN_DIRSEP "/"
28 #define DGEN_BASEDIR "DGen"
29 #define DGEN_RC "dgen.cfg"
30 #define DGEN_AUTORC "dgen_auto.cfg"
31 #define DGEN_DIRSEP "\\/"
34 #define elemof(a) (sizeof(a) / sizeof((a)[0]))
35 #define containerof(p, s, m) (s *)((uintptr_t)(p) - offsetof(s, m))
37 #define BITS_TO_BYTES(v) ((((v) + 7u) & ~7u) >> 3)
40 #define DGEN_WRITE 0x2
41 #define DGEN_APPEND 0x4
42 #define DGEN_CURRENT 0x8
43 #define DGEN_TEXT 0x10
45 #define dgen_fopen_rc(mode) dgen_fopen(NULL, DGEN_RC, ((mode) | DGEN_TEXT))
46 #define dgen_fopen_autorc(mode) \
47 dgen_fopen(NULL, DGEN_AUTORC, ((mode) | DGEN_TEXT))
48 extern FILE *dgen_fopen(const char *relative
, const char *file
,
50 extern FILE *dgen_freopen(const char *relative
, const char *file
,
51 unsigned int mode
, FILE *f
);
52 extern const char *dgen_basename(const char *path
);
53 extern char *dgen_dir(char *buf
, size_t *size
, const char *sub
);
54 extern char *dgen_userdir(char *buf
, size_t *size
);
56 #define le2h16(v) h2le16(v)
57 static inline uint16_t h2le16(uint16_t v
)
59 #ifdef WORDS_BIGENDIAN
60 return ((v
>> 8) | (v
<< 8));
66 #define be2h16(v) h2be16(v)
67 static inline uint16_t h2be16(uint16_t v
)
69 #ifdef WORDS_BIGENDIAN
72 return ((v
>> 8) | (v
<< 8));
76 #define le2h32(v) h2le32(v)
77 static inline uint32_t h2le32(uint32_t v
)
79 #ifdef WORDS_BIGENDIAN
80 return (((v
& 0xff000000) >> 24) | ((v
& 0x00ff0000) >> 8) |
81 ((v
& 0x0000ff00) << 8) | ((v
& 0x000000ff) << 24));
87 #define be2h32(v) h2be32(v)
88 static inline uint32_t h2be32(uint32_t v
)
90 #ifdef WORDS_BIGENDIAN
93 return (((v
& 0xff000000) >> 24) | ((v
& 0x00ff0000) >> 8) |
94 ((v
& 0x0000ff00) << 8) | ((v
& 0x000000ff) << 24));
98 typedef uint8_t uint24_t
[3];
100 static inline uint24_t
*u24cpy(uint24_t
*dst
, const uint24_t
*src
)
102 /* memcpy() is sometimes faster. */
104 memcpy(*dst
, *src
, sizeof(*dst
));
106 (*dst
)[0] = (*src
)[0];
107 (*dst
)[1] = (*src
)[1];
108 (*dst
)[2] = (*src
)[2];
113 extern uint8_t *load(void **context
,
114 size_t *file_size
, FILE *file
, size_t max_size
);
115 extern void load_finish(void **context
);
116 extern void unload(uint8_t *data
);
118 extern char **complete_path(const char *prefix
, size_t len
,
119 const char *relative
);
120 extern void complete_path_free(char **cp
);
122 static inline size_t strcommon(const char *s1
, const char *s2
)
126 for (i
= 0; ((s1
[i
] != '\0') && (s2
[i
] != '\0')); ++i
)
132 #define BACKSLASHIFY_NOQUOTES 0x0001
134 extern char *backslashify(const uint8_t *src
, size_t size
, unsigned int flags
,
137 extern size_t utf8u32(uint32_t *u32
, const uint8_t *u8
);
138 extern size_t utf32u8(uint8_t *u8
, uint32_t u32
);
140 extern int prefix_casematch(const char *str
, const char *argv
[]);
141 extern size_t prefix_getuint(const char *str
, unsigned int *num
);
145 #endif /* SYSTEM_H_ */