Skip to content

Commit 6b78b51

Browse files
committed
add structs copy demo
1 parent 0006a6f commit 6b78b51

File tree

3 files changed

+245
-0
lines changed

3 files changed

+245
-0
lines changed

conditionals.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,29 @@ lval *builtin_eval(lenv *e, lval *a) {
561561
return lval_eval(e, x);
562562
}
563563

564+
lval *builtin_if(lenv *e, lval *a) {
565+
LASSERT_NUM("if", a, 3);
566+
LASSERT_TYPE("if", a, 0, LVAL_BOOL);
567+
LASSERT_TYPE("if", a, 1, LVAL_QEXPR);
568+
LASSERT_TYPE("if", a, 2, LVAL_QEXPR);
569+
570+
int cond = a->cell[0]->bool_val;
571+
572+
lval *x;
573+
574+
if (cond) {
575+
x = lval_take(a, 1);
576+
} else {
577+
x = lval_take(a, 2);
578+
}
579+
580+
lval_del(a);
581+
582+
x->type = LVAL_SEXPR;
583+
584+
return lval_eval(e, x);
585+
}
586+
564587
lval *builtin_join(lenv *e, lval *a) {
565588

566589
for (int i = 0; i < a->count; i++) {
@@ -693,6 +716,10 @@ void lenv_add_builtins(lenv *e) {
693716
lenv_add_builtin(e, "!=", builtin_uneq);
694717
lenv_add_builtin(e, ">=", builtin_ge);
695718
lenv_add_builtin(e, "<=", builtin_le);
719+
720+
/* Conditionals */
721+
722+
lenv_add_builtin(e, "if", builtin_if);
696723
}
697724

698725
/* Evaluation */

copy_structs.c

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
#include <stddef.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
6+
typedef struct {
7+
char *title;
8+
char **messages;
9+
size_t num_messages;
10+
} channel_t;
11+
12+
void remove_message(channel_t *channel, size_t index) {
13+
if (index >= channel->num_messages) {
14+
perror("Error while removing message: Invalid index");
15+
return exit(EXIT_FAILURE);
16+
}
17+
18+
free(channel->messages[index]);
19+
20+
for (size_t i = index; i < channel->num_messages - 1; i++) {
21+
channel->messages[i] = channel->messages[i + 1];
22+
}
23+
24+
channel->num_messages--;
25+
26+
if (channel->num_messages == 0) {
27+
free(channel->messages);
28+
channel->messages = NULL;
29+
} else {
30+
channel->messages =
31+
realloc(channel->messages, sizeof(char *) * channel->num_messages);
32+
}
33+
}
34+
35+
void update_message(channel_t *channel, size_t index, char *new_message) {
36+
if (index >= channel->num_messages) {
37+
perror("Error while removing message: Invalid index");
38+
return exit(EXIT_FAILURE);
39+
}
40+
41+
free(channel->messages[index]);
42+
43+
channel->messages[index] = malloc(strlen(new_message) + 1);
44+
45+
strcpy(channel->messages[index], new_message);
46+
}
47+
48+
void add_message(channel_t *channel, char *message) {
49+
printf("Adding message to the channel %s\n"
50+
"There are %lu messages at this moment.\n",
51+
channel->title, channel->num_messages);
52+
53+
channel->num_messages++;
54+
channel->messages =
55+
realloc(channel->messages, sizeof(char *) * channel->num_messages);
56+
channel->messages[channel->num_messages - 1] = malloc(strlen(message) + 1);
57+
58+
strcpy(channel->messages[channel->num_messages - 1], message);
59+
}
60+
61+
channel_t *create_channel(char *channel_title) {
62+
channel_t *channel = malloc(sizeof(channel_t));
63+
/* Até é possivel setart a string sem o malloc, mas mudar depois falha
64+
Tomei um bus error */
65+
channel->title = malloc(strlen(channel_title) + 1);
66+
channel->title = strcpy(channel->title, channel_title);
67+
68+
return channel;
69+
}
70+
71+
void print_size_struct(channel_t *channel) {
72+
size_t s = sizeof(*(channel));
73+
74+
printf("Struct size: %lu\n", s);
75+
76+
printf("Size of title: %lu\n"
77+
"Size of num_messages: %lu\n"
78+
"Size of messages: %lu\n",
79+
sizeof(channel->title), sizeof(channel->messages),
80+
sizeof(channel->num_messages));
81+
}
82+
83+
void print_channel(channel_t *channel) {
84+
printf("===== Printing channel =======\n"
85+
"[Title]: %s\n"
86+
"[N messages]: %lu\n",
87+
channel->title, channel->num_messages);
88+
89+
for (int i = 0; i < channel->num_messages; i++) {
90+
printf("Message %i\n%s\n\n", i + 1, channel->messages[i]);
91+
}
92+
}
93+
94+
channel_t *clone2(channel_t *channel) {
95+
size_t size = sizeof(*channel);
96+
97+
channel_t *new_channel = malloc(size);
98+
99+
memcpy(new_channel, channel, size);
100+
101+
return new_channel;
102+
}
103+
104+
size_t my_str_len(char *str) {
105+
size_t n = 0;
106+
107+
while (*str) {
108+
printf("Contando char '%c'\n", *str);
109+
str++;
110+
n++;
111+
}
112+
113+
return n;
114+
}
115+
116+
channel_t *clone(channel_t *channel) {
117+
printf("Cloning chanel '%s'\n\n", channel->title);
118+
119+
channel_t *new_channel = malloc(sizeof(channel_t));
120+
121+
new_channel->num_messages = channel->num_messages;
122+
new_channel->title = malloc(strlen(channel->title) + 1);
123+
new_channel->messages = malloc(sizeof(char *) * channel->num_messages);
124+
125+
stpcpy(new_channel->title, channel->title);
126+
127+
int mem = 0;
128+
129+
for (int i = 0; i < channel->num_messages; i++) {
130+
char *message = channel->messages[i];
131+
132+
mem += strlen(message) + 1;
133+
}
134+
135+
char **messages = malloc(sizeof(char *) * mem);
136+
137+
for (int i = 0; i < channel->num_messages; i++) {
138+
char *message = channel->messages[i];
139+
140+
strcpy(messages[i], message);
141+
}
142+
143+
memcpy(new_channel->messages, messages, mem);
144+
145+
/* for (int i = 0; i < channel->num_messages; i++) { */
146+
/* char *message = channel->messages[i]; */
147+
/* new_channel->messages[i] = malloc(strlen(message) + 1); */
148+
/* strcpy(new_channel->messages[i], message); */
149+
/* } */
150+
151+
return new_channel;
152+
}
153+
154+
int compare(channel_t *channel_a, channel_t *channel_b) {
155+
printf("Comparing titles '%s' to '%s'\n\n", channel_a->title,
156+
channel_b->title);
157+
158+
printf("Comparing total of messages '%lu' to '%lu'\n\n",
159+
channel_a->num_messages, channel_b->num_messages);
160+
if (channel_a->num_messages == channel_b->num_messages &&
161+
strcmp(channel_a->title, channel_b->title) == 0) {
162+
163+
return 1;
164+
}
165+
166+
return 0;
167+
}
168+
169+
void free_channel(channel_t *channel) {
170+
free(channel->title);
171+
free(channel->messages);
172+
free(channel);
173+
}
174+
175+
channel_t *copy_channel_with_memcpy(char *channel) {
176+
channel_t *new_channel = create_channel("Gotta copy this channel");
177+
178+
return new_channel;
179+
}
180+
181+
int main(void) {
182+
channel_t *channel = create_channel("This is my channel");
183+
184+
add_message(channel, "A single message");
185+
186+
print_channel(channel);
187+
188+
remove_message(channel, 0);
189+
190+
channel->title[0] = 'K';
191+
192+
/* channel_t *cloned_channel = clone2(channel); */
193+
channel_t *cloned_channel = clone(channel);
194+
195+
printf("Original title address: %u\n", *channel->title);
196+
printf("Cloned title address: %u\n", *cloned_channel->title);
197+
198+
char *new_title = "Cloned channel";
199+
200+
cloned_channel->title = realloc(cloned_channel->title, strlen(new_title) + 1);
201+
strcpy(cloned_channel->title, new_title);
202+
203+
print_channel(channel);
204+
205+
print_channel(cloned_channel);
206+
207+
printf("Are channels equal? %s\n\n",
208+
compare(channel, cloned_channel) ? "True" : "False");
209+
210+
free_channel(channel);
211+
free_channel(cloned_channel);
212+
213+
size_t string_size = my_str_len("Edy\n");
214+
215+
printf("A string tem tamanho %lu\n", string_size);
216+
217+
return 0;
218+
}

copy_structs.o

33.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)