Line data Source code
1 : /*
2 : * libpino - common.h
3 : *
4 : * This file is part of libpino.
5 : *
6 : * Author: Go Kudo <zeriyoshi@gmail.com>
7 : * SPDX-License-Identifier: MIT
8 : */
9 :
10 : #ifndef PINO_INTERNAL_COMMON_H
11 : #define PINO_INTERNAL_COMMON_H
12 :
13 : #include <stdbool.h>
14 : #include <stdint.h>
15 : #include <stdlib.h>
16 : #include <string.h>
17 :
18 : #include <pino.h>
19 : #include <pino/endianness.h>
20 : #include <pino/handler.h>
21 :
22 : #if PINO_USE_SIMD
23 : #include "simd.h"
24 : #endif
25 :
26 : #define HANDLER_STEP 8
27 : #define MM_STEP 16
28 :
29 : #define PINO_VERSION_ID 10000000
30 :
31 : #ifndef PINO_BUILDTIME
32 : #define PINO_BUILDTIME 0
33 : #endif
34 :
35 : #define pmemcpy(dest, src, size) memcpy(dest, src, size)
36 : #define pmemcpy_n2l(dest, src, size) pino_endianness_memcpy_native2le(dest, src, size)
37 : #define pmemcpy_n2b(dest, src, size) pino_endianness_memcpy_native2be(dest, src, size)
38 : #define pmemcpy_l2n(dest, src, size) pino_endianness_memcpy_le2native(dest, src, size)
39 : #define pmemcpy_b2n(dest, src, size) pino_endianness_memcpy_be2native(dest, src, size)
40 : #define pmemmove(dest, src, size) memmove(dest, src, size)
41 : #define pmemcmp(s1, s2, size) memcmp(s1, s2, size)
42 : #define pmalloc(size) malloc(size)
43 : #define pcalloc(count, size) calloc(count, size)
44 : #define prealloc(ptr, size) realloc(ptr, size)
45 : #define pfree(ptr) free(ptr)
46 :
47 : typedef struct {
48 : size_t usage;
49 : size_t capacity;
50 : void **ptrs;
51 : } mm_t;
52 :
53 : typedef struct {
54 : pino_magic_t magic;
55 : mm_t mm;
56 : pino_handler_t *handler;
57 : } handler_entry_t;
58 :
59 1056 : static inline bool validate_magic(pino_magic_safe_t magic)
60 : {
61 : size_t i;
62 1056 : const char *valid_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
63 :
64 1056 : if (!magic) {
65 1 : return false;
66 : }
67 :
68 1055 : if (strlen((const char *)magic) != sizeof(pino_magic_t)) {
69 5 : return false;
70 : }
71 :
72 5250 : for (i = 0; i < sizeof(pino_magic_t); i++) {
73 4200 : if (strchr(valid_chars, magic[i]) == NULL) {
74 0 : return false;
75 : }
76 : }
77 :
78 1050 : return true;
79 : }
80 :
81 501557 : static inline bool magic_equal(pino_magic_t magic, pino_magic_safe_t smagic)
82 : {
83 501557 : return strncmp(magic, smagic, sizeof(pino_magic_t)) == 0;
84 : }
85 :
86 : bool pino_handler_init(size_t initialize_size);
87 : void pino_handler_free(void);
88 : pino_handler_t *pino_handler_find(pino_magic_safe_t magic);
89 :
90 : bool pino_memory_manager_obj_init(mm_t *mm, size_t initialize_size);
91 : void pino_memory_manager_obj_free(mm_t *mm);
92 :
93 : #endif /* PINO_INTERNAL_COMMON_H */
|