-
Notifications
You must be signed in to change notification settings - Fork 7
/
lsys.h
84 lines (75 loc) · 1.68 KB
/
lsys.h
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
typedef struct _lsys_char_t {
char c;
struct _lsys_char_t* prev;
struct _lsys_char_t* next;
} lsys_char_t;
typedef struct{
lsys_char_t* head;
lsys_char_t* tail;
} lsys_str_t;
typedef struct{
char lhs;
char* rhs;
} lsys_rule_t;
lsys_str_t* lsys_make_str(char* s) {
lsys_str_t* ss = (lsys_str_t*)malloc(sizeof(lsys_str_t));
ss->head = NULL;
ss->tail = NULL;
int sl = strlen(s);
for (int i = 0; i < sl; i++){
lsys_char_t* cc = (lsys_char_t*) malloc(sizeof(lsys_char_t));
cc->c = s[i];
cc->prev = ss->tail;
cc->next = NULL;
if (ss->tail == NULL){
ss->head = cc;
}else{
ss->tail->next = cc;
}
ss->tail = cc;
}
return ss;
}
void lsys_print_str(lsys_str_t* state){
lsys_char_t* it = state->head;
while (it != NULL) {
lsys_char_t*jt = it->next;
printf("%c",it->c);
it = jt;
}
printf("\n");
}
void lsys_destroy_str(lsys_str_t* state){
lsys_char_t* it = state->head;
while (it != NULL) {
lsys_char_t*jt = it->next;
free(it);
it = jt;
}
free(state);
}
void lsys_step(lsys_str_t* state, lsys_rule_t* rules, int n_rules){
lsys_char_t* it = state->head;
while (it != NULL){
lsys_char_t* jt = it->next;
for (int i = 0; i < n_rules; i++ ){
if (it->c == rules[i].lhs) {
lsys_str_t* ss = lsys_make_str(rules[i].rhs);
if (it->prev != NULL){
it->prev->next = ss->head;
}else{
state->head = ss->head;
}
if (it->next != NULL){
it->next->prev = ss->tail;
}else{
state->tail = ss->tail;
}
ss->head->prev = it->prev;
ss->tail->next = it->next;
free(it);
}
}
it = jt;
}
}