add win32 (msvc) support

This commit is contained in:
2024-11-14 16:56:12 +00:00
parent c14c2e5500
commit d614e110df
35 changed files with 454 additions and 280 deletions

View File

@@ -0,0 +1,10 @@
#ifndef BLUELIB_CORE_BITOP_H_
#define BLUELIB_CORE_BITOP_H_
#include <blue/core/misc.h>
BLUE_API int b_popcountl(long v);
BLUE_API int b_ctzl(long v);
BLUE_API int b_clzl(long v);
#endif

View File

@@ -267,34 +267,34 @@ typedef struct b_btree_iterator {
@param tree the tree to re-balance.
@param node the node that was just inserted into the tree.
*/
extern void b_btree_insert_fixup(b_btree *tree, b_btree_node *node);
BLUE_API void b_btree_insert_fixup(b_btree *tree, b_btree_node *node);
/* delete a node from a binary tree and re-balance the tree afterwards.
@param tree the tree to delete from
@param node the node to delete.
*/
extern void b_btree_delete(b_btree *tree, b_btree_node *node);
BLUE_API void b_btree_delete(b_btree *tree, b_btree_node *node);
/* get the first node in a binary tree.
this will be the node with the smallest key (i.e. the node that is
furthest-left from the root)
*/
extern b_btree_node *b_btree_first(const b_btree *tree);
BLUE_API b_btree_node *b_btree_first(const b_btree *tree);
/* get the last node in a binary tree.
this will be the node with the largest key (i.e. the node that is
furthest-right from the root)
*/
extern b_btree_node *b_btree_last(const b_btree *tree);
BLUE_API b_btree_node *b_btree_last(const b_btree *tree);
/* for any binary tree node, this function returns the node with the
* next-largest key value */
extern b_btree_node *b_btree_next(const b_btree_node *node);
BLUE_API b_btree_node *b_btree_next(const b_btree_node *node);
/* for any binary tree node, this function returns the node with the
* next-smallest key value */
extern b_btree_node *b_btree_prev(const b_btree_node *node);
BLUE_API b_btree_node *b_btree_prev(const b_btree_node *node);
/* return true if the btree is empty, false otherwise */
static inline bool b_btree_empty(const b_btree *tree)
{
@@ -345,10 +345,10 @@ static inline unsigned short b_btree_height(b_btree_node *node)
return node->b_height;
}
extern int b_btree_iterator_begin(const b_btree *tree, b_btree_iterator *it);
extern bool b_btree_iterator_next(b_btree_iterator *it);
extern b_status b_btree_iterator_erase(b_btree_iterator *it);
extern bool b_btree_iterator_is_valid(const b_btree_iterator *it);
BLUE_API int b_btree_iterator_begin(const b_btree *tree, b_btree_iterator *it);
BLUE_API bool b_btree_iterator_next(b_btree_iterator *it);
BLUE_API b_status b_btree_iterator_erase(b_btree_iterator *it);
BLUE_API bool b_btree_iterator_is_valid(const b_btree_iterator *it);
#ifdef __cplusplus
}

View File

@@ -12,7 +12,7 @@
}; \
static f##_t_ f##_; \
static void f(void)
#elif defined(_MSB_VER)
#elif defined(_MSC_VER)
#pragma section(".CRT$XCU", read)
#define B_INIT2_(f, p) \
static void f(void); \

View File

@@ -2,6 +2,7 @@
#define BLUELIB_CORE_ITERATOR_H_
#include <blue/core/status.h>
#include <blue/core/misc.h>
#include <stdbool.h>
struct b_iterator;
@@ -17,9 +18,9 @@ typedef struct b_iterator {
const b_iterator_ops *it_ops;
} b_iterator;
extern b_status b_iterator_close(b_iterator *it);
extern bool b_iterator_next(b_iterator *it);
extern b_status b_iterator_erase(b_iterator *it);
extern bool b_iterator_is_valid(const b_iterator *it);
BLUE_API b_status b_iterator_close(b_iterator *it);
BLUE_API bool b_iterator_next(b_iterator *it);
BLUE_API b_status b_iterator_erase(b_iterator *it);
BLUE_API bool b_iterator_is_valid(const b_iterator *it);
#endif

View File

@@ -14,4 +14,14 @@
#define z__b_numargs(arg_type, ...) \
(sizeof((arg_type[]) {__VA_ARGS__}) / sizeof(arg_type))
#ifdef _MSC_VER
#ifdef BLUELIB_EXPORT
#define BLUE_API extern __declspec(dllexport)
#else
#define BLUE_API extern __declspec(dllimport)
#endif
#else
#define BLUE_API extern
#endif
#endif // B_MISB_H_

View File

@@ -60,26 +60,26 @@ static inline b_queue_entry *b_queue_prev(const b_queue_entry *entry)
return entry->qe_prev;
}
extern size_t b_queue_length(b_queue *q);
BLUE_API size_t b_queue_length(b_queue *q);
extern void b_queue_insert_before(
BLUE_API void b_queue_insert_before(
b_queue *q, b_queue_entry *entry, b_queue_entry *before);
extern void b_queue_insert_after(
BLUE_API void b_queue_insert_after(
b_queue *q, b_queue_entry *entry, b_queue_entry *after);
extern void b_queue_push_front(b_queue *q, b_queue_entry *entry);
extern void b_queue_push_back(b_queue *q, b_queue_entry *entry);
BLUE_API void b_queue_push_front(b_queue *q, b_queue_entry *entry);
BLUE_API void b_queue_push_back(b_queue *q, b_queue_entry *entry);
extern b_queue_entry *b_queue_pop_front(b_queue *q);
extern b_queue_entry *b_queue_pop_back(b_queue *q);
BLUE_API b_queue_entry *b_queue_pop_front(b_queue *q);
BLUE_API b_queue_entry *b_queue_pop_back(b_queue *q);
extern void b_queue_delete(b_queue *q, b_queue_entry *entry);
extern void b_queue_delete_all(b_queue *q);
BLUE_API void b_queue_delete(b_queue *q, b_queue_entry *entry);
BLUE_API void b_queue_delete_all(b_queue *q);
extern int b_queue_iterator_begin(const b_queue *q, b_queue_iterator *it);
extern bool b_queue_iterator_next(b_queue_iterator *it);
extern b_status b_queue_iterator_erase(b_queue_iterator *it);
extern bool b_queue_iterator_is_valid(const b_queue_iterator *it);
BLUE_API int b_queue_iterator_begin(const b_queue *q, b_queue_iterator *it);
BLUE_API bool b_queue_iterator_next(b_queue_iterator *it);
BLUE_API b_status b_queue_iterator_erase(b_queue_iterator *it);
BLUE_API bool b_queue_iterator_is_valid(const b_queue_iterator *it);
#ifdef __cplusplus
}

View File

@@ -26,12 +26,12 @@ typedef struct b_random_ctx {
};
} b_random_ctx;
extern b_random_ctx *b_random_global_ctx(void);
BLUE_API b_random_ctx *b_random_global_ctx(void);
extern b_status b_random_init(b_random_ctx *ctx, b_random_flags flags);
extern unsigned long long b_random_next_int64(b_random_ctx *ctx);
extern double b_random_next_double(b_random_ctx *ctx);
extern void b_random_next_bytes(
BLUE_API b_status b_random_init(b_random_ctx *ctx, b_random_flags flags);
BLUE_API unsigned long long b_random_next_int64(b_random_ctx *ctx);
BLUE_API double b_random_next_double(b_random_ctx *ctx);
BLUE_API void b_random_next_bytes(
b_random_ctx *ctx, unsigned char *out, size_t nbytes);
#endif

View File

@@ -1,6 +1,8 @@
#ifndef BLUELIB_CORE_STATUS_H_
#define BLUELIB_CORE_STATUS_H_
#include <blue/core/misc.h>
#define B_OK(status) ((status) == B_SUCCESS)
#define B_ERR(status) ((status) != B_SUCCESS)
@@ -18,6 +20,6 @@ typedef enum {
B_ERR_BAD_FORMAT,
} b_status;
extern const char *b_status_to_string(b_status status);
BLUE_API const char *b_status_to_string(b_status status);
#endif

View File

@@ -2,6 +2,7 @@
#define BLUELIB_CORE_STRINGSTREAM_H_
#include <blue/core/status.h>
#include <blue/core/misc.h>
#include <stddef.h>
typedef struct b_stringstream {
@@ -14,18 +15,18 @@ typedef struct b_stringstream {
size_t ss_istack_ptr, ss_istack_size;
} b_stringstream;
extern void b_stringstream_begin(b_stringstream *strv, char *buf, size_t max);
extern void b_stringstream_begin_dynamic(b_stringstream *strv);
BLUE_API void b_stringstream_begin(b_stringstream *strv, char *buf, size_t max);
BLUE_API void b_stringstream_begin_dynamic(b_stringstream *strv);
extern void b_stringstream_push_indent(b_stringstream *strv, int indent);
extern void b_stringstream_pop_indent(b_stringstream *strv);
BLUE_API void b_stringstream_push_indent(b_stringstream *strv, int indent);
BLUE_API void b_stringstream_pop_indent(b_stringstream *strv);
extern b_status b_stringstream_add(b_stringstream *strv, const char *str);
extern b_status b_stringstream_addf(b_stringstream *strv, const char *format, ...);
extern b_status b_stringstream_addv(b_stringstream *strv, const char **strs);
extern b_status b_stringstream_addvl(
BLUE_API b_status b_stringstream_add(b_stringstream *strv, const char *str);
BLUE_API b_status b_stringstream_addf(b_stringstream *strv, const char *format, ...);
BLUE_API b_status b_stringstream_addv(b_stringstream *strv, const char **strs);
BLUE_API b_status b_stringstream_addvl(
b_stringstream *strv, const char **strs, size_t count);
extern b_status b_stringstream_add_many(b_stringstream *strv, ...);
extern char *b_stringstream_end(b_stringstream *strv);
BLUE_API b_status b_stringstream_add_many(b_stringstream *strv, ...);
BLUE_API char *b_stringstream_end(b_stringstream *strv);
#endif