-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprefix.c
135 lines (99 loc) · 3.4 KB
/
prefix.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "unitsystem.h"
#include <stdlib.h>
#include <string.h>
enum {
PREFIX_ERR_NULL_BASE,
PREFIX_ERR_SYMBOL_TO_LONG,
PREFIX_ERR_TEXT_TO_LONG,
};
err_t us_prefix_set(us_prefix_t prefix, const char symbol[], const char text[], const uint8_t base, const int8_t power)
{
check_in_ptr(prefix, 0);
check_in_string(symbol, 0);
check_in_string(text, 0);
if (base == 0)
return construct_error(ERR_MAJ_INVALID, ERR_MIN_IN_INVALID, PREFIX_ERR_NULL_BASE);
if (strlen(symbol) > US_MAX_PREFIX_SYMBOL_LENGTH)
return construct_error(ERR_MAJ_INVALID, ERR_MIN_IN_INVALID, PREFIX_ERR_SYMBOL_TO_LONG);
if (strlen(text) > US_MAX_PREFIX_TEXT_LENGTH)
return construct_error(ERR_MAJ_INVALID, ERR_MIN_IN_INVALID, PREFIX_ERR_TEXT_TO_LONG);
err_t err = {0};
prefix->base = base;
prefix->power = power;
strncpy(prefix->symbol, symbol, US_MAX_PREFIX_SYMBOL_LENGTH);
strncpy(prefix->text, text, US_MAX_PREFIX_TEXT_LENGTH);
return err;
}
err_t us_prefix_copy(us_prefix_t prefix, const us_prefix_t source)
{
check_in_ptr(prefix, 0);
check_in_ptr(source, 0);
err_t err = {0};
/* TODO: checks */
*prefix = *source;
return err;
}
err_t us_prefix_tostring(const us_prefix_t prefix, size_t length, char buffer[])
{
check_in_ptr(prefix, 0);
check_in_ptr(buffer, 0);
snprintf(buffer, length, "%s", prefix->symbol);
err_t err = {0};
return err;
}
err_t us_prefix_totext(const us_prefix_t prefix, size_t length, char buffer[])
{
check_in_ptr(prefix, 0);
check_in_ptr(buffer, 0);
snprintf(buffer, length, "%s", prefix->text);
err_t err = {0};
return err;
}
err_t us_prefix_equal(const us_prefix_t left, const us_prefix_t right, bool * result)
{
check_in_ptr(left, 0);
check_in_ptr(right, 0);
*result =
(left->base == right->base) &&
(left->power == right->power) &&
(strncmp(left->symbol, right->symbol, US_MAX_PREFIX_SYMBOL_LENGTH) == 0) &&
(strncmp(left->text, right->text, US_MAX_PREFIX_TEXT_LENGTH) == 0);
err_t err = {0};
return err;
}
#ifdef TEST
/*****************************************************************************/
/**************##########***##########***##########***##########**************/
/******************##*******##***********##***************##******************/
/******************##*******##########***##########*******##******************/
/******************##*******##*******************##*******##******************/
/******************##*******##########***##########*******##******************/
/*****************************************************************************/
BT_SUITE_DEF(us_prefix,"us_prefix tests");
BT_TEST_DEF(us_prefix, tostring, "tostring")
{
err_t err = {0};
us_prefix_t prefix;
char buffer[US_MAX_PREFIX_SYMBOL_LENGTH + 1];
UNUSED_PARAM(object);
err = us_prefix_set(prefix, "k", "\\siprefix{k}", 10, 3);
bt_assert_int_equal(err.composite, 0);
err = us_prefix_tostring(prefix, US_MAX_PREFIX_SYMBOL_LENGTH + 1, buffer);
bt_assert_int_equal(err.composite, 0);
bt_assert_str_equal(buffer, "k");
return BT_RESULT_OK;
}
BT_TEST_DEF(us_prefix, tostext, "totext")
{
err_t err = {0};
us_prefix_t prefix;
char buffer[US_MAX_PREFIX_TEXT_LENGTH + 1];
UNUSED_PARAM(object);
err = us_prefix_set(prefix, "k", "\\siprefix{k}", 10, 3);
bt_assert_int_equal(err.composite, 0);
err = us_prefix_totext(prefix, US_MAX_PREFIX_TEXT_LENGTH + 1, buffer);
bt_assert_int_equal(err.composite, 0);
bt_assert_str_equal(prefix->text, "\\siprefix{k}");
return BT_RESULT_OK;
}
#endif