Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Anders Blomdell
LabComm
Commits
2d479b83
Commit
2d479b83
authored
Apr 18, 2014
by
Tommy Olofsson
Browse files
Fixed a problem with copy for strings.
parent
9fb85ef7
Changes
3
Hide whitespace changes
Inline
Side-by-side
compiler/C_CodeGen.jrag
View file @
2d479b83
...
...
@@ -743,8 +743,20 @@ aspect C_copy {
}
public void PrimType.C_emitCopy(C_env env_src, C_env env_dst) {
env_src.println(env_dst.accessor() + env_dst.qualid + " = " +
env_src.accessor() + env_src.qualid + ";");
if (C_isDynamic()) {
env_src.println(String.format(
"%s%s = labcomm_memory_alloc(mem, 1, strlen(%s%s)+1);",
env_dst.accessor(), env_dst.qualid,
env_src.accessor(), env_src.qualid));
env_src.println(String.format(
"memcpy(%s%s, %s%s, strlen(%s%s)+1);",
env_dst.accessor(), env_dst.qualid,
env_src.accessor(), env_src.qualid,
env_src.accessor(), env_src.qualid));
} else {
env_src.println(env_dst.accessor() + env_dst.qualid + " = " +
env_src.accessor() + env_src.qualid + ";");
}
}
public void UserType.C_emitCopy(C_env env_src, C_env env_dst) {
...
...
@@ -880,7 +892,7 @@ aspect C_copy {
public void PrimType.C_emitCopyDeallocation(C_env env) {
if (C_isDynamic()) {
env.println("labcomm_memory_free(mem, 1, " +
env.qualid + ");");
env.accessor() +
env.qualid + ");");
}
}
...
...
lib/c/Makefile
View file @
2d479b83
...
...
@@ -3,7 +3,7 @@ UNAME_S=$(shell uname -s)
ALL_DEPS
=
liblabcomm.a liblabcomm.so.1
ifeq
($(UNAME_S),Linux)
CFLAGS
=
-std
=
c99
-g
-Wall
-Werror
-O3
-I
.
-Itest
-Wno-unused-function
CFLAGS
=
-std
=
c99
-g
-Wall
-Werror
-O3
-I
.
-Itest
CC
=
$(CROSS_COMPILE)
gcc
LD
=
$(CROSS_COMPILE)
ld
LDFLAGS
=
-L
.
...
...
@@ -134,6 +134,7 @@ clean:
$(RM)
test
/testdata/gen/
*
.[cho]
$(RM)
test
/gen/
*
.[cho]
$(RM)
$(TEST_DIR)
/test_labcomm
$(RM)
$(TEST_DIR)
/test_labcomm_copy
distclean
:
clean
$(RM)
liblabcomm.so.1
...
...
@@ -151,7 +152,7 @@ $(TEST_DIR)/test_signature_numbers.c: $(TEST_DIR)/gen/another_encoding.h
$(TEST_DIR)/test_signature_numbers.c
:
$(TEST_DIR)/gen/generated_encoding.h
$(TEST_DIR)/test_signature_numbers
:
$(TEST_DIR)/gen/another_encoding.o
$(TEST_DIR)/test_signature_numbers
:
$(TEST_DIR)/gen/generated_encoding.o
$(TEST_DIR)/test_labcomm_copy
:
$(TEST_DIR)/gen/generated_encoding.o $(TEST_DIR)/gen/test_sample.o
$(TEST_DIR)/test_labcomm_copy
:
$(TEST_DIR)/gen/generated_encoding.o $(TEST_DIR)/gen/test_sample.o
$(TEST_DIR)/gen/more_types.o
labcomm_fd_reader.o
:
labcomm_private.h
labcomm_fd_writer.o
:
labcomm_private.h
labcomm_dynamic_buffer_writer.o
:
labcomm_private.h
lib/c/test/test_labcomm_copy.c
View file @
2d479b83
...
...
@@ -15,6 +15,7 @@
#include
"labcomm_fd_reader.h"
#include
"test/gen/generated_encoding.h"
#include
"test/gen/test_sample.h"
#include
"test/gen/more_types.h"
#define DATA_FILE "copy_test.dat"
...
...
@@ -43,6 +44,21 @@ static void handle_test_var(test_sample_test_var *v, void *context)
labcomm_copy_test_sample_test_var
(
labcomm_default_memory
,
context
,
v
);
}
static
void
handle_a
(
more_types_A
*
v
,
void
*
context
)
{
labcomm_copy_more_types_A
(
labcomm_default_memory
,
context
,
v
);
}
static
void
handle_s
(
more_types_S
*
v
,
void
*
context
)
{
labcomm_copy_more_types_S
(
labcomm_default_memory
,
context
,
v
);
}
static
void
handle_ns
(
more_types_NS
*
v
,
void
*
context
)
{
labcomm_copy_more_types_NS
(
labcomm_default_memory
,
context
,
v
);
}
int
main
(
int
argc
,
char
**
argv
)
{
struct
labcomm_encoder
*
encoder
;
...
...
@@ -58,6 +74,12 @@ int main(int argc, char **argv)
generated_encoding_P
cache_p
;
test_sample_test_var
test_var
;
test_sample_test_var
cache_test_var
;
more_types_A
a
;
more_types_A
cache_a
;
more_types_S
s
;
more_types_S
cache_s
=
NULL
;
more_types_NS
ns
;
more_types_NS
cache_ns
;
fd
=
open
(
DATA_FILE
,
O_RDWR
|
O_CREAT
|
O_TRUNC
,
0644
);
if
(
fd
==
-
1
)
...
...
@@ -100,6 +122,19 @@ int main(int argc, char **argv)
test_var
.
a
[
i
]
=
10
*
i
+
j
;
labcomm_encode_test_sample_test_var
(
encoder
,
&
test_var
);
labcomm_encoder_register_more_types_A
(
encoder
);
for
(
int
i
=
0
;
i
<
sizeof
(
a
.
a
)
/
sizeof
(
a
.
a
[
0
]);
i
++
)
a
.
a
[
i
]
=
i
;
labcomm_encode_more_types_A
(
encoder
,
&
a
);
labcomm_encoder_register_more_types_S
(
encoder
);
s
=
"this is a string"
;
labcomm_encode_more_types_S
(
encoder
,
&
s
);
labcomm_encoder_register_more_types_NS
(
encoder
);
ns
.
s
=
"this is a another string"
;
labcomm_encode_more_types_NS
(
encoder
,
&
ns
);
labcomm_encoder_free
(
encoder
);
encoder
=
NULL
;
lseek
(
fd
,
0
,
SEEK_SET
);
...
...
@@ -112,35 +147,34 @@ int main(int argc, char **argv)
labcomm_decoder_register_generated_encoding_S1
(
decoder
,
handle_s1
,
&
cache_s1
);
labcomm_decoder_register_generated_encoding_B
(
decoder
,
handle_b
,
&
cache_b
);
labcomm_decoder_register_generated_encoding_I
(
decoder
,
handle_i
,
&
cache_I
);
labcomm_decoder_register_generated_encoding_P
(
decoder
,
handle_p
,
&
cache_p
);
labcomm_decoder_register_test_sample_test_var
(
decoder
,
handle_test_var
,
&
cache_test_var
);
labcomm_decoder_register_generated_encoding_P
(
decoder
,
handle_p
,
&
cache_p
);
labcomm_decoder_decode_one
(
decoder
);
/* S1 */
labcomm_decoder_decode_one
(
decoder
);
labcomm_decoder_decode_one
(
decoder
);
/* B */
labcomm_decoder_decode_one
(
decoder
);
labcomm_decoder_decode_one
(
decoder
);
/* I */
labcomm_decoder_decode_one
(
decoder
);
labcomm_decoder_decode_one
(
decoder
);
/* P */
labcomm_decoder_decode_one
(
decoder
);
labcomm_decoder_decode_one
(
decoder
);
/* test_var */
labcomm_decoder_decode_one
(
decoder
);
labcomm_decoder_register_more_types_A
(
decoder
,
handle_a
,
&
cache_a
);
labcomm_decoder_register_more_types_S
(
decoder
,
handle_s
,
&
cache_s
);
labcomm_decoder_register_more_types_NS
(
decoder
,
handle_ns
,
&
cache_ns
);
while
(
labcomm_decoder_decode_one
(
decoder
)
>
0
)
;
assert
(
cache_s1
.
i
==
s1
.
i
);
puts
(
"S1 copied ok"
);
assert
(
cache_b
==
b
);
puts
(
"B copied ok"
);
assert
(
cache_I
.
n_0
==
I
.
n_0
);
assert
(
cache_I
.
a
[
0
]
==
I
.
a
[
0
]);
assert
(
cache_I
.
a
[
1
]
==
I
.
a
[
1
]);
assert
(
cache_I
.
a
[
2
]
==
I
.
a
[
2
]);
free
(
I
.
a
);
puts
(
"I copied ok"
);
assert
(
cache_p
.
n_0
==
p
.
n_0
);
for
(
int
i
=
0
;
i
<
p
.
n_0
;
i
++
)
assert
(
cache_p
.
a
[
i
].
i
==
p
.
a
[
i
].
i
);
free
(
p
.
a
);
puts
(
"P copied ok"
);
assert
(
cache_test_var
.
n_0
==
test_var
.
n_0
);
assert
(
cache_test_var
.
n_1
==
test_var
.
n_1
);
for
(
int
i
=
0
;
i
<
test_var
.
n_0
;
i
++
)
...
...
@@ -149,6 +183,16 @@ int main(int argc, char **argv)
free
(
test_var
.
a
);
puts
(
"test_var copied ok"
);
for
(
int
i
=
0
;
i
<
sizeof
(
a
.
a
)
/
sizeof
(
a
.
a
[
0
]);
i
++
)
assert
(
cache_a
.
a
[
i
]
==
a
.
a
[
i
]);
puts
(
"A copied ok"
);
assert
(
!
strcmp
(
cache_s
,
s
));
puts
(
"S copied ok"
);
assert
(
!
strcmp
(
cache_ns
.
s
,
ns
.
s
));
puts
(
"NS copied ok"
);
labcomm_decoder_free
(
decoder
);
close
(
fd
);
unlink
(
DATA_FILE
);
...
...
@@ -163,4 +207,10 @@ int main(int argc, char **argv)
puts
(
"P deallocated ok"
);
labcomm_copy_free_test_sample_test_var
(
labcomm_default_memory
,
&
cache_test_var
);
puts
(
"test_var deallocated ok"
);
labcomm_copy_free_more_types_A
(
labcomm_default_memory
,
&
cache_a
);
puts
(
"A deallocated ok"
);
labcomm_copy_free_more_types_S
(
labcomm_default_memory
,
&
cache_s
);
puts
(
"S deallocated ok"
);
labcomm_copy_free_more_types_NS
(
labcomm_default_memory
,
&
cache_ns
);
puts
(
"NS deallocated ok"
);
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment