added tests, simplified some functions, added functions

AuthorKonata <konata@posteo.jp>
Date
Commit58a7aabe74430c0a0fd34bc341cbf7f52671aea8
Parent76f64f8
7 files changed, 209 insertions(+), 51 deletions(-)
M.gitignore
@@ -1,6 +1,9 @@
11 # Prerequisites
22 *.d
33
4+#binaries
5+test
6+
47 # Object files
58 *.o
69 *.ko
MMakefile
@@ -1,3 +1,9 @@
11 all:
2- gcc -Og -g -march=native -shared -fPIC -fstrict-aliasing vector.c dyn_string.c -o cutils.so -flto \
3- -Wall -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter
2+ gcc -Og -g -march=native -shared -fPIC -fstrict-aliasing vector.c dyn_string.c -o libcutils.so -flto \
3+ -Wall -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \
4+ -fsanitize=undefined
5+
6+test:
7+ gcc -Og -g -march=native -fPIC -fstrict-aliasing vector.c dyn_string.c test.c -o test -flto \
8+ -Wall -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \
9+ -fsanitize=undefined
Mdyn_string.c
@@ -1,28 +1,30 @@
11 #include "dyn_string.h"
22
33 String* new_string(void)
4+{
5+ return string_with_capacity(STRING_DEFAULT_SIZE);
6+}
7+
8+String* string_with_capacity(size_t capacity)
49 {
510 String* string = malloc(sizeof(*string));
611 if(!string)
712 return NULL;
8- string->chars = calloc(sizeof(*string->chars)*STRING_DEFAULT_SIZE,1);
13+ string->chars = calloc(capacity,sizeof(*string->chars));
914 if(!string->chars)
1015 {
1116 free(string);
1217 return NULL;
1318 }
1419 string->length = 0;
15- string->capacity = STRING_DEFAULT_SIZE;
20+ string->capacity = capacity;
1621
1722 return string;
1823 }
1924
2025 bool string_append(String* string, char character)
2126 {
22- if(!string_adjust_size(string, ++string->length))
23- return false;
24- string->chars[string->length-1] = character;
25- return true;
27+ return string_insert(string, string->length, character);
2628 }
2729
2830 void string_remove(String* string, size_t index)
@@ -36,7 +38,7 @@ void string_remove(String* string, size_t index)
3638
3739 bool string_insert(String* string, size_t index, char character)
3840 {
39- if(!string_adjust_size(string, string->length))
41+ if(index > string->length || !string_adjust_size(string, string->length))
4042 return false;
4143
4244 memmove(string->chars+index+1, string->chars+index, (string->length-index)*sizeof(*string->chars));
@@ -53,11 +55,12 @@ char string_at(const String* string, size_t index)
5355 return string->chars[index];
5456 }
5557
56-bool string_concat(String* string, String* other)
58+bool string_concat(String* string, const String* other)
5759 {
5860 if(!string_adjust_size(string,string->length+other->length-1))
5961 return false;
6062 memcpy(string->chars+string->length,other->chars,other->length);
63+ string->length += other->length;
6164 return true;
6265 }
6366
@@ -89,16 +92,36 @@ bool string_adjust_size(String* string, size_t size)
8992 }
9093 string->capacity *= 2;
9194 }
92- while(string->capacity > (size*2))
95+ return true;
96+}
97+
98+
99+
100+void delete_string(String* string)
101+{
102+ free(string->chars);
103+ free(string);
104+}
105+
106+String* from_cstring(const char* cstring)
107+{
108+ String* string = string_with_capacity(strlen(cstring));
109+ if(!string)
93110 {
94- char* tmp = string->chars;
95- string->chars = realloc(string->chars, string->capacity/2*(sizeof(*string->chars)));
96- if(!string->chars)
97- {
98- string->chars = tmp;
99- return false;
100- }
101- string->capacity /= 2;
111+ return NULL;
112+ } else {
113+ memcpy(string->chars, cstring, strlen(cstring));
114+ string->length = strlen(cstring);
115+ return string;
102116 }
103- return true;
117+
118+}
119+
120+char* to_cstring(const String* string)
121+{
122+ char* cstring = malloc(string->length+1);
123+ memcpy(cstring, string->chars, string->length);
124+ cstring[string->length] = '\0';
125+
126+ return cstring;
104127 }
Mdyn_string.h
@@ -14,13 +14,22 @@ typedef struct String
1414 } String;
1515
1616 String* new_string(void);
17+String* string_with_capacity(size_t capacity);
18+void delete_string(String* string);
19+
1720 char string_at(const String* string, size_t index);
18-bool string_append(String* string, char item);
21+
22+bool string_append(String* string, char character);
23+bool string_insert(String* string, size_t index, char character);
24+
1925 void string_remove(String* string, size_t index);
26+
2027 bool string_adjust_size(String* string, size_t size);
2128 size_t* string_find_char(const String* haystack, const char needle);
22-bool string_insert(String* string, size_t index, char character);
23-bool string_concat(String* string, String* other);
29+bool string_concat(String* string, const String* other);
30+
31+String* from_cstring(const char* cstring);
32+char* to_cstring(const String* string);
2433
2534
2635 #endif //DYN_STRING_H
Atest.c
@@ -0,0 +1,101 @@
1+#include "cutils.h"
2+#include <stdio.h>
3+
4+struct test
5+{
6+ int a;
7+ int b;
8+};
9+
10+int cmp_str(const void* str1, const void* str2)
11+{
12+ const struct test* str1_s = str1;
13+ const struct test* str2_s = str2;
14+ return !((str1_s->a == str2_s->a) && (str1_s->b == str2_s->b));
15+}
16+
17+void test1(void)
18+{
19+ Vector* test = new_vector();
20+
21+ struct test* my_struct = malloc(sizeof(*my_struct));
22+ my_struct->a = 5;
23+ my_struct->b = 5;
24+ vector_push(test, my_struct);
25+
26+ my_struct = malloc(sizeof(*my_struct));
27+ my_struct->a = 6;
28+ my_struct->b = 6;
29+ vector_push(test, my_struct);
30+
31+ my_struct = malloc(sizeof(*my_struct));
32+ my_struct->a = 7;
33+ my_struct->b = 7;
34+ vector_push(test, my_struct);
35+ printf("%ld\n", test->length);
36+
37+ vector_remove(test, 0,free);
38+ printf("%ld\n", test->length);
39+
40+ my_struct = malloc(sizeof(*my_struct));
41+ my_struct->a = 8;
42+ my_struct->b = 8;
43+ vector_insert(test, 2, my_struct);
44+ printf("%ld\n", test->length);
45+
46+ my_struct = malloc(sizeof(*my_struct));
47+ my_struct->a = 8;
48+ my_struct->b = 8;
49+
50+ size_t* find = vector_find(test, my_struct, cmp_str);
51+ printf("pos: %lu\n", *find);
52+ free(find);
53+
54+ free(my_struct);
55+ my_struct = vector_pop(test);
56+ printf("struct a: %d, b: %d\n", my_struct->a, my_struct->b);
57+ free(my_struct);
58+
59+ delete_vector(test,free);
60+}
61+
62+void test2(void)
63+{
64+ String* test = new_string();
65+ string_append(test, 'a');
66+ string_append(test, 'b');
67+ string_append(test, 'c');
68+ string_append(test, 'd');
69+ printf("%ld\n", test->length);
70+
71+ char* cstring = to_cstring(test);
72+ printf("%s\n", cstring);
73+ free(cstring);
74+
75+ string_remove(test, 3);
76+ cstring = to_cstring(test);
77+ printf("%s\n", cstring);
78+ free(cstring);
79+ printf("%ld\n", test->length);
80+
81+ string_insert(test, 0,'a');
82+ cstring = to_cstring(test);
83+ printf("%s\n", cstring);
84+ free(cstring);
85+
86+ String* test2 = from_cstring("xyz");
87+
88+ string_concat(test,test2);
89+ cstring = to_cstring(test);
90+ printf("%s\n", cstring);
91+ free(cstring);
92+
93+ delete_string(test2);
94+ delete_string(test);
95+}
96+
97+int main(int argc, char** argv)
98+{
99+ test1();
100+ test2();
101+}
Mvector.c
@@ -1,18 +1,23 @@
11 #include "vector.h"
22
33 Vector* new_vector(void)
4+{
5+ return vector_with_capacity(VECTOR_DEFAULT_SIZE);
6+}
7+
8+Vector* vector_with_capacity(size_t capacity)
49 {
510 Vector* vector = malloc(sizeof(*vector));
611 if(!vector)
712 return NULL;
8- vector->items = malloc(sizeof(*vector->items)*VECTOR_DEFAULT_SIZE);
13+ vector->items = malloc(sizeof(*vector->items)*capacity);
914 if(!vector->items)
1015 {
1116 free(vector);
1217 return NULL;
1318 }
1419 vector->length = 0;
15- vector->capacity = VECTOR_DEFAULT_SIZE;
20+ vector->capacity = capacity;
1621
1722 return vector;
1823 }
@@ -25,27 +30,30 @@ void* vector_at(const Vector* vector, size_t index)
2530 return vector->items[index];
2631 }
2732
28-void* vector_pop(Vector* vector, size_t index)
33+void* vector_pop(Vector* vector)
2934 {
30- if(index >= vector->length)
31- return NULL;
32- else
35+ return vector_pop_at(vector, vector->length-1);
36+}
37+
38+void* vector_pop_at(Vector* vector, size_t index)
39+{
40+ void* tmp = vector_at(vector, index);
41+ if(!tmp)
3342 {
34- void* tmp = vector->items[index];
35- memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
36- vector->length--;
43+ return NULL;
44+ } else {
45+ vector_remove(vector, index, NULL);
3746 return tmp;
3847 }
3948 }
4049
50+
4151 void vector_remove(Vector* vector, size_t index, void (*rmv)(void*))
4252 {
4353 if(index < vector->length)
4454 {
4555 if(rmv)
4656 rmv(vector->items[index]);
47- else
48- free(vector->items[index]);
4957 memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
5058 vector->length--;
5159 }
@@ -53,18 +61,15 @@ void vector_remove(Vector* vector, size_t index, void (*rmv)(void*))
5361
5462 bool vector_push(Vector* vector, void* item)
5563 {
56- if(!vector_adjust_size(vector, ++vector->length))
57- return false;
58- vector->items[vector->length-1] = item;
59- return true;
64+ return vector_insert(vector, vector->length, item);
6065 }
6166
62-size_t* vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*))
67+size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*))
6368 {
6469 size_t* ret;
6570 for(size_t i = 0; i < haystack->length; i++)
6671 {
67- if(cmp ? cmp(haystack->items[i],needle) : haystack->items[i] == needle)
72+ if(cmp ? cmp(haystack->items[i],needle) == 0 : haystack->items[i] == needle)
6873 {
6974 ret = malloc(sizeof(*ret));
7075 *ret = i;
@@ -76,12 +81,12 @@ size_t* vector_find(const Vector* haystack, const void* needle, bool (*cmp)(cons
7681
7782 bool vector_insert(Vector* vector, size_t index, void* item)
7883 {
79- if(!vector_adjust_size(vector, vector->length))
84+ if(index > vector->length || !vector_adjust_size(vector, vector->length+1))
8085 return false;
8186
8287 memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));
8388 vector->items[index] = item;
84- vector->length++;
89+ ++vector->length;
8590 return true;
8691 }
8792
@@ -90,7 +95,7 @@ bool vector_adjust_size(Vector* vector, size_t size)
9095 while(vector->capacity < size)
9196 {
9297 void** tmp = vector->items;
93- vector->items = realloc(vector->items, vector->capacity*2*(sizeof(*vector->items)));
98+ vector->items = realloc(vector->items, vector->capacity*2*sizeof(*vector->items));
9499 if(!vector->items)
95100 {
96101 vector->items = tmp;
@@ -98,10 +103,15 @@ bool vector_adjust_size(Vector* vector, size_t size)
98103 }
99104 vector->capacity *= 2;
100105 }
101- while(vector->capacity > (size*2))
106+ return true;
107+}
108+
109+bool vector_shrink(Vector* vector)
110+{
111+ while(vector->capacity > (vector->length*2))
102112 {
103113 void** tmp = vector->items;
104- vector->items = realloc(vector->items, vector->capacity/2*(sizeof(*vector->items)));
114+ vector->items = realloc(vector->items, vector->capacity/2*sizeof(*vector->items));
105115 if(!vector->items)
106116 {
107117 vector->items = tmp;
@@ -118,8 +128,7 @@ void delete_vector(Vector* vector, void (*rmv)(void*))
118128 {
119129 if(rmv)
120130 rmv(vector->items[i]);
121- else
122- free(vector->items[i]);
123131 }
132+ free(vector->items);
124133 free(vector);
125134 }
Mvector.h
@@ -14,14 +14,21 @@ typedef struct Vector
1414 } Vector;
1515
1616 Vector* new_vector(void);
17+Vector* vector_with_capacity(size_t capacity);
18+void delete_vector(Vector* vector, void(*rmv) (void*));
19+
1720 void* vector_at(const Vector* vector, size_t index);
18-void* vector_pop(Vector* vector, size_t index);
21+void* vector_pop(Vector* vector);
22+void* vector_pop_at(Vector* vector, size_t index);
23+
24+bool vector_insert(Vector* vector, size_t index, void* item);
1925 bool vector_push(Vector* vector, void* item);
2026 void vector_remove(Vector* vector, size_t index, void (*rmv)(void*));
21-void delete_vector(Vector* vector, void(*rmv) (void*));
27+
2228 bool vector_adjust_size(Vector* vector, size_t size);
23-size_t* vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*));
24-bool vector_insert(Vector* vector, size_t index, void* item);
29+bool vector_shrink(Vector* vector);
30+size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*));
31+
2532
2633
2734 #endif //VECTOR_H