Skip to content

Commit 179c159

Browse files
author
Nate Fisher
committed
Move more logic from main to smlr; handle newlines; add unit tests
1 parent c02c9fc commit 179c159

File tree

4 files changed

+250
-52
lines changed

4 files changed

+250
-52
lines changed

src/main.c

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,24 @@ int main(int argc, char** argv) {
7171
return EXIT_FAILURE;
7272
}
7373

74-
while (1) {
75-
char c = getc(stdin);
76-
77-
if (c == EOF) {
78-
if (smlr_get_buf(smlr, buf, size + 1)) {
79-
fprintf(stderr, "Error: Could not populate output buffer\n");
80-
free(buf);
81-
return EXIT_FAILURE;
82-
}
83-
printf("%s\n", buf);
84-
break;
85-
} else if (c == '\n') {
86-
continue;
87-
}
88-
89-
if (smlr_push(smlr, c)) {
74+
uint8_t is_end = 0;
75+
while(!is_end) {
76+
if (smlr_push(smlr, getc(stdin), &is_end)) {
77+
fprintf(stderr, "Error: Could not push character\n");
78+
smlr_delete(smlr);
9079
free(buf);
9180
return EXIT_FAILURE;
9281
}
9382
}
9483

95-
if (smlr_delete(smlr)) {
96-
fprintf(stderr, "Error: Could not delete smlr_t\n");
97-
free(buf);
84+
if (!smlr_get_buf(smlr, buf, size + 1)) {
85+
fprintf(stdout, "%s\n", buf);
86+
} else {
87+
fprintf(stderr, "Error: Could not populate output buffer\n");
9888
return EXIT_FAILURE;
9989
}
10090

91+
smlr_delete(smlr);
10192
free(buf);
10293

10394
} else {

src/smlr.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ const char ellipsis_str[ELLIPSIS_LEN + 1] = "...";
1818
smlr_t* smlr_new(size_t output_size, smlr_alignment_t alignment) {
1919

2020
// check input preconditions
21-
if (!output_size)
21+
if (!output_size) {
2222
return NULL;
23+
}
2324

2425
smlr_t* smlr = NULL;
2526
char* p_buf = NULL;
@@ -72,9 +73,17 @@ int8_t smlr_delete(smlr_t* self) {
7273
return EXIT_SUCCESS;
7374
}
7475

75-
int8_t smlr_push(smlr_t* self, const char c) {
76-
if (!self)
76+
int8_t smlr_push(smlr_t* self, const char c, uint8_t* p_is_end) {
77+
if (!self || !p_is_end) {
7778
return EXIT_FAILURE;
79+
}
80+
81+
if (c == EOF) {
82+
*p_is_end = 1;
83+
return EXIT_SUCCESS;
84+
} else if (c == '\n') {
85+
return EXIT_SUCCESS;
86+
}
7887

7988
if ((self->align == ALIGN_LEFT) && (self->input_bytes >= self->buf_bytes)) {
8089
self->input_bytes++;

src/smlr.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ typedef enum { ALIGN_MIDDLE, ALIGN_LEFT, ALIGN_RIGHT } smlr_alignment_t;
2222

2323
int8_t smlr_delete(smlr_t* self);
2424
int8_t smlr_get_buf(smlr_t* self, char* dst, size_t dst_bytes);
25-
int8_t smlr_push(smlr_t* self, const char c);
26-
smlr_t *smlr_new(size_t output_size, smlr_alignment_t alignment);
25+
int8_t smlr_push(smlr_t* self, const char c, uint8_t* p_is_end);
26+
smlr_t* smlr_new(size_t output_size, smlr_alignment_t alignment);
2727

2828
#ifdef __cplusplus
2929
}

tests/smlr_ut.cc

Lines changed: 226 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,79 +6,277 @@
66
#include "smlr.h"
77
#include "smlr_internal.h"
88

9+
void dump_smlr(smlr_t* p_smlr) {
10+
if (!p_smlr) return;
11+
char buf[p_smlr->buf_bytes + 1];
12+
memcpy(buf, p_smlr->p_buf, p_smlr->buf_bytes);
13+
buf[p_smlr->buf_bytes] = '\0';
14+
printf("\tp_buf:\t\t%s\n", buf);
15+
printf("\tindex:\t\t%zu\n", p_smlr->index);
16+
printf("\tinput_bytes:\t%zu\n", p_smlr->input_bytes);
17+
printf("\tbuf_bytes:\t%zu\n", p_smlr->buf_bytes);
18+
printf("\tleft_bytes:\t%zu\n", p_smlr->left_bytes);
19+
printf("\tright_bytes:\t%zu\n", p_smlr->right_bytes);
20+
printf("\tbuf_base:\t%zu\n", p_smlr->buf_base);
21+
printf("\talign:\t\t%u\n", p_smlr->align);
22+
}
23+
924
TEST(SmlrTest, valid_new_delete_test) {
1025
smlr_t *p_smlr;
1126
EXPECT_NE(nullptr, p_smlr = smlr_new(20, ALIGN_LEFT));
27+
if (HasFailure()) dump_smlr(p_smlr);
1228
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
29+
1330
}
1431

1532
TEST(SmlrTest, invalid_ptr_new_delete_test) {
1633
smlr_t *p_smlr;
1734
EXPECT_EQ(nullptr, p_smlr = smlr_new(0, ALIGN_LEFT));
35+
if (HasFailure()) dump_smlr(p_smlr);
1836
EXPECT_NE(EXIT_SUCCESS, smlr_delete(p_smlr));
37+
1938
}
2039

2140
TEST(SmlrTest, invalid_alignment_new_delete_test) {
2241
smlr_t *p_smlr;
2342
EXPECT_EQ(nullptr, p_smlr = smlr_new(10, (smlr_alignment_t)10));
43+
if (HasFailure()) dump_smlr(p_smlr);
2444
EXPECT_NE(EXIT_SUCCESS, smlr_delete(p_smlr));
45+
2546
}
2647

2748
TEST(SmlrTest, smlr_push) {
2849
smlr_t *p_smlr;
29-
size_t prefix_sz;
50+
uint8_t is_end = 0;
3051
EXPECT_NE(nullptr, p_smlr = smlr_new(7, ALIGN_LEFT));
52+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1', &is_end));
53+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2', &is_end));
54+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3', &is_end));
55+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4', &is_end));
56+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5', &is_end));
57+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6', &is_end));
58+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7', &is_end));
59+
60+
if (HasFailure()) dump_smlr(p_smlr);
61+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
62+
63+
}
64+
65+
TEST(SmlrTest, smlr_push_RIGHT) {
66+
smlr_t *p_smlr;
67+
size_t buf_sz = 5;
68+
uint8_t is_end = 0;
69+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_RIGHT));
70+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1', &is_end));
71+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2', &is_end));
72+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3', &is_end));
73+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4', &is_end));
74+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5', &is_end));
75+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6', &is_end));
76+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7', &is_end));
77+
char truth[] = "67345";
3178

32-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1'));
33-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2'));
34-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3'));
35-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4'));
36-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5'));
37-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6'));
38-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7'));
79+
EXPECT_EQ(0, memcmp(p_smlr->p_buf, truth, buf_sz));
3980

81+
if (HasFailure()) dump_smlr(p_smlr);
4082
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
4183
}
4284

43-
TEST(SmlrTest, smlr_push_wrap) {
85+
TEST(SmlrTest, smlr_push_MIDDLE) {
4486
smlr_t *p_smlr;
45-
size_t prefix_sz;
46-
EXPECT_NE(nullptr, p_smlr = smlr_new(5, ALIGN_LEFT));
87+
size_t buf_sz = 5;
88+
uint8_t is_end = 0;
89+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_MIDDLE));
90+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1', &is_end));
91+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2', &is_end));
92+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3', &is_end));
93+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4', &is_end));
94+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5', &is_end));
95+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6', &is_end));
96+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7', &is_end));
97+
char truth[] = "16745";
98+
99+
EXPECT_EQ(0, memcmp(p_smlr->p_buf, truth, buf_sz));
100+
101+
if (HasFailure()) dump_smlr(p_smlr);
102+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
103+
104+
}
47105

48-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1'));
49-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2'));
50-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3'));
51-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4'));
52-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5'));
53-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6'));
54-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7'));
106+
TEST(SmlrTest, smlr_push_LEFT) {
107+
smlr_t *p_smlr;
108+
size_t buf_sz = 5;
109+
uint8_t is_end = 0;
110+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_LEFT));
111+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '1', &is_end));
112+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '2', &is_end));
113+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '3', &is_end));
114+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '4', &is_end));
115+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '5', &is_end));
116+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '6', &is_end));
117+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, '7', &is_end));
118+
char truth[] = "12345";
55119

120+
EXPECT_EQ(0, memcmp(p_smlr->p_buf, truth, buf_sz));
121+
if (HasFailure()) dump_smlr(p_smlr);
56122
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
123+
57124
}
58125

59126
TEST(SmlrTest, smlr_push_invalid) {
127+
uint8_t is_end = 0;
128+
EXPECT_NE(EXIT_SUCCESS, smlr_push(NULL, '1', &is_end));
129+
}
130+
131+
TEST(SmlrTest, smlr_push_eof) {
132+
smlr_t *p_smlr;
133+
uint8_t is_end = 0;
134+
EXPECT_NE(nullptr, p_smlr = smlr_new(5, ALIGN_LEFT));
135+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, EOF, &is_end));
136+
EXPECT_NE(0, is_end);
137+
if (HasFailure()) dump_smlr(p_smlr);
138+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
139+
140+
}
141+
142+
TEST(SmlrTest, smlr_push_not_eof) {
60143
smlr_t *p_smlr;
61-
size_t prefix_sz;
144+
uint8_t is_end = 0;
62145
EXPECT_NE(nullptr, p_smlr = smlr_new(5, ALIGN_LEFT));
63-
EXPECT_NE(EXIT_SUCCESS, smlr_push(NULL, '1'));
146+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'a', &is_end));
147+
EXPECT_EQ(0, is_end);
148+
if (HasFailure()) dump_smlr(p_smlr);
64149
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
150+
65151
}
66152

67153
TEST(SmlrTest, smlr_get_buf_left_nominal_short) {
68154
smlr_t *p_smlr;
69155
const size_t buf_sz = 10;
156+
uint8_t is_end = 0;
70157
char buf[buf_sz];
71-
72158
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_LEFT));
73-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'a'));
74-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'b'));
75-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'c'));
76-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'd'));
77-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'e'));
78-
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'f'));
159+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'a', &is_end));
160+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'b', &is_end));
161+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'c', &is_end));
162+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'd', &is_end));
163+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'e', &is_end));
164+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'f', &is_end));
79165
EXPECT_EQ(EXIT_SUCCESS, smlr_get_buf(p_smlr, buf, buf_sz));
80166

81-
EXPECT_EQ(0, strcmp(buf, "abcdef"));
167+
EXPECT_STREQ(buf, "abcdef");
82168

169+
if (HasFailure()) dump_smlr(p_smlr);
83170
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
171+
172+
}
173+
174+
TEST(SmlrTest, smlr_internals_5) {
175+
smlr_t *p_smlr;
176+
size_t buf_sz = 5;
177+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_MIDDLE));
178+
179+
EXPECT_EQ(0, p_smlr->index);
180+
EXPECT_EQ(0, p_smlr->input_bytes);
181+
EXPECT_EQ(5, p_smlr->buf_bytes);
182+
EXPECT_EQ(1, p_smlr->left_bytes);
183+
EXPECT_EQ(1, p_smlr->right_bytes);
184+
EXPECT_EQ(0, p_smlr->buf_base);
185+
186+
if (HasFailure()) dump_smlr(p_smlr);
187+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
188+
189+
}
190+
191+
TEST(SmlrTest, smlr_internals_10) {
192+
smlr_t *p_smlr;
193+
size_t buf_sz = 10;
194+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_MIDDLE));
195+
196+
EXPECT_EQ(0, p_smlr->index);
197+
EXPECT_EQ(0, p_smlr->input_bytes);
198+
EXPECT_EQ(10, p_smlr->buf_bytes);
199+
EXPECT_EQ(4, p_smlr->left_bytes);
200+
EXPECT_EQ(3, p_smlr->right_bytes);
201+
EXPECT_EQ(0, p_smlr->buf_base);
202+
203+
if (HasFailure()) dump_smlr(p_smlr);
204+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
205+
206+
}
207+
208+
TEST(SmlrTest, smlr_left_alphabet) {
209+
smlr_t *p_smlr;
210+
const size_t buf_sz = 12;
211+
uint8_t is_end = 0;
212+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_MIDDLE));
213+
214+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'a', &is_end));
215+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'b', &is_end));
216+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'c', &is_end));
217+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'd', &is_end));
218+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'e', &is_end));
219+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'f', &is_end));
220+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'g', &is_end));
221+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'h', &is_end));
222+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'i', &is_end));
223+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'j', &is_end));
224+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'k', &is_end));
225+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'l', &is_end));
226+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, EOF, &is_end));
227+
228+
EXPECT_EQ(12, p_smlr->index);
229+
EXPECT_EQ(12, p_smlr->input_bytes);
230+
EXPECT_EQ(12, p_smlr->buf_bytes);
231+
EXPECT_EQ(5, p_smlr->left_bytes);
232+
EXPECT_EQ(4, p_smlr->right_bytes);
233+
EXPECT_EQ(0, p_smlr->buf_base);
234+
EXPECT_NE(0, is_end);
235+
236+
char buf_true[buf_sz+1] = "abcdefghijkl";
237+
char buf_out[buf_sz+1];
238+
EXPECT_EQ(EXIT_SUCCESS, smlr_get_buf(p_smlr, buf_out, buf_sz+1));
239+
EXPECT_STREQ(buf_true, buf_out);
240+
241+
if (HasFailure()) dump_smlr(p_smlr);
242+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
243+
244+
}
245+
246+
TEST(SmlrTest, smlr_left_alphabet_trunc) {
247+
smlr_t *p_smlr;
248+
const size_t buf_sz = 11;
249+
uint8_t is_end = 0;
250+
EXPECT_NE(nullptr, p_smlr = smlr_new(buf_sz, ALIGN_MIDDLE));
251+
252+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'a', &is_end));
253+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'b', &is_end));
254+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'c', &is_end));
255+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'd', &is_end));
256+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'e', &is_end));
257+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'f', &is_end));
258+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'g', &is_end));
259+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'h', &is_end));
260+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'i', &is_end));
261+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'j', &is_end));
262+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'k', &is_end));
263+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, 'l', &is_end));
264+
EXPECT_EQ(EXIT_SUCCESS, smlr_push(p_smlr, EOF, &is_end));
265+
266+
EXPECT_EQ(5, p_smlr->index);
267+
EXPECT_EQ(12, p_smlr->input_bytes);
268+
EXPECT_EQ(11, p_smlr->buf_bytes);
269+
EXPECT_EQ(4, p_smlr->left_bytes);
270+
EXPECT_EQ(4, p_smlr->right_bytes);
271+
EXPECT_EQ(4, p_smlr->buf_base);
272+
EXPECT_NE(0, is_end);
273+
274+
char buf_true[buf_sz+1] = "abcd...ijkl";
275+
char buf_out[buf_sz+1];
276+
EXPECT_EQ(EXIT_SUCCESS, smlr_get_buf(p_smlr, buf_out, buf_sz+1));
277+
EXPECT_STREQ(buf_true, buf_out);
278+
279+
if (HasFailure()) dump_smlr(p_smlr);
280+
EXPECT_EQ(EXIT_SUCCESS, smlr_delete(p_smlr));
281+
84282
}

0 commit comments

Comments
 (0)