-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstr.c
More file actions
118 lines (107 loc) · 1.94 KB
/
Copy pathstr.c
File metadata and controls
118 lines (107 loc) · 1.94 KB
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char *str;
size_t len;
size_t size;
} str_t;
str_t *strNew(char *str)
{
str_t *s;
if(!(s = malloc(sizeof(str_t)))) {
perror("malloc");
return NULL;
}
s->len = str ? strlen(str) : 0;
s->size = s->len+1;
if(!(s->str = malloc(s->size))) {
perror("malloc");
free(s);
return NULL;
}
if(str) strcpy(s->str, str);
s->str[s->len] = 0;
return s;
}
int bads;
void strDel(void *str)
{
str_t *s = str;
if(!str) {
bads++;
printf("strDel: bptr %d", bads);
return;
}
if(s->str) {
free(s->str);
}
free(s);
}
static void strExpand(str_t *str, unsigned int len)
{
char *s;
if(len <= str->size) {
printf("str_expand: len < str->size\n");
}
if(!(s = realloc(str->str, len))) {
perror("realloc");
return;
}
str->str = s;
str->len = len;
str->size = len;
}
char *strCat(str_t *dst, str_t *src)
{
if(dst->size < dst->len + src->len + 1) {
strExpand(dst, dst->len + src->len + 1);
}
return strcat(dst->str, src->str);
}
char *strCpy(str_t *dst, str_t *src)
{
char *str;
if(dst->size < src->len + 1) {
strExpand(dst, src->len + 1);
}
str = strcpy(dst->str, src->str);
dst->len = strlen(dst->str);
return str;
}
str_t *strDup(str_t *src)
{
return strNew(src->str);
}
char *strAppend(str_t *str, char *s)
{
int len = strlen(s);
if(str->size < str->len + len + 1) {
strExpand(str, str->len + len + 1);
}
return strcat(str->str, s);
}
int strCmp(str_t *s1, str_t *s2)
{
if(s1->len != s2->len) {
return s1->len - s2->len;
}
return strcmp(s1->str, s2->str);
}
#ifdef TEST
int main()
{
str_t *s = strNew("Testing");
str_t *s2 = strNew(" this thing \n");
str_t *s3 = strNew(NULL);
strCat(s, s2);
strCpy(s3, s);
strAppend(s3, "aaaaa");
printf("%lu, %lu, %lu %s\n", s->len, s->size, strlen(s->str), s->str);
printf("%lu, %lu, %lu %s\n", s3->len, s3->size, strlen(s3->str), s3->str);
strDel(s);
strDel(s2);
strDel(s3);
return 0;
}
#endif