jeremybanks (owner)

Revisions

gist: 56692 Download_button fork
public
Description:
Experimenting with a string substitution function.
Public Clone URL: git://gist.github.com/56692.git
Embed All Files: show embed
strsub.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
//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";cc -o "$x" "$0")&&"$x" $*;exit
 
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
 
typedef struct strpart {
char* start;
int len;
struct strpart* next;
} strpart;
 
strpart* new_strpart(char* start, int len) {
strpart* new = malloc(sizeof(strpart));
 
new->start = start;
new->len = len;
new->next = NULL;
 
return(new);
}
 
// Given the tail of a strpart list, adds an element and returns the
// new tail address.
strpart* strpart_append(strpart* tail, char* start, int len) {
strpart* new_tail = new_strpart(start, len);
 
tail->next = new_tail;
 
return new_tail;
}
 
char* strpart_compile(strpart* head) {
int len_result = 0;
char* result;
strpart* current;
 
for(current = head; current; current = current->next) {
len_result += current->len;
current = current->next;
}
 
result = malloc(sizeof(char) * len_result + 1);
 
int result_index = 0;
int current_index = 0;
 
for(current = head; current; current = current->next) {
for(current_index = 0; current_index < current->len; current_index++) {
result[result_index++] = current->start[current_index];
}
}
 
result[result_index] = '\x00';
 
return(result);
}
 
void strpart_free(strpart* head) {
strpart* current;
strpart* next;
 
for(current = head; current; current = current->next) {
next = current->next;
free(current);
current = next;
}
}
 
char* strsub(char* subject, char* old, char* new) {
int len_subject = strlen(subject);
int len_old = strlen(old);
int len_new = strlen(new);
 
strpart* head = new_strpart(NULL, 0);
strpart* tail = head;
 
int index_subject;
int index_old;
int index_added = 0;
 
for(index_subject = 0; index_subject < len_subject;) {
for(index_old = 0; index_old < len_old &&
index_old + index_subject < len_subject &&
old[index_old]; index_old++);
 
printf("subject/added = %i/%i\n", index_subject, index_added);
printf("head->next = %p\n", head->next);
printf("%s\n", strpart_compile(head));
 
if(index_old == len_old) {
if(index_added < index_subject - 1) {
tail = strpart_append(tail, &subject[index_added + 1], index_subject - index_added);
}
 
tail = strpart_append(tail, new, len_new);
 
index_added = index_subject = index_subject + len_old;
} else {
index_subject++;
}
}
 
if(index_added < index_subject - 1) {
tail = strpart_append(tail, &subject[index_added + 1], index_subject - index_added);
}
 
char* result = strpart_compile(head);
 
strpart_free(head);
 
return(result);
}
 
int main(int argc, char* argv[]) {
printf("%s\n", strsub("Ha ha ham ha!", "ham", "pork"));
 
return 0;
}