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
Erik Jansson
LabComm
Commits
fe7840b4
Commit
fe7840b4
authored
Aug 26, 2013
by
Anders Blomdell
Browse files
Fixed sizeof function.
parent
41e5bb26
Changes
5
Hide whitespace changes
Inline
Side-by-side
compiler/C_CodeGen.jrag
View file @
fe7840b4
...
...
@@ -963,7 +963,7 @@ aspect C_Sizeof {
public void SampleDecl.C_emitSizeofDeclaration(C_env env) {
env.println("extern int labcomm_sizeof_" + env.prefix + getName() +
"(
struct labcomm_signature *sig,
" + env.prefix + getName() + " *v);");
"(" + env.prefix + getName() + " *v);");
}
public int Decl.C_fixedSizeof() {
...
...
@@ -1024,16 +1024,17 @@ aspect C_Sizeof {
public void SampleDecl.C_emitSizeof(C_env env) {
env = env.nestStruct("(*v)");
env.println("int labcomm_sizeof_" + env.prefix + getName() +
"(
struct labcomm_signature *sig,
" + env.prefix + getName() + " *v)");
"(" + env.prefix + getName() + " *v)");
env.println("{");
env.indent();
env.println("int result = labcomm_size_packed32(labcomm_signature_" +
env.prefix + getName() +".index);");
if (C_isDynamic()) {
env.println("int result = 0;");
getType().C_emitSizeof(env);
env.println("return result;");
} else {
env.println("re
turn " + (0
+ C_fixedSizeof()
)
+ ";");
env.println("re
sult += "
+ C_fixedSizeof() + ";");
}
env.println("return result;");
env.unindent();
env.println("}");
}
...
...
@@ -1099,6 +1100,10 @@ aspect C_Sizeof {
env.unindent();
env.println("}");
} else {
for (int i = 0 ; i < getNumExp() ; i++) {
env.println("result += labcomm_size_packed32(" +
getExp(i).C_getLimit(env, i) + ");");
}
env.print("result += " + getType().C_fixedSizeof());
for (int i = 0 ; i < getNumExp() ; i++) {
env.print(" * " + getExp(i).C_getLimit(env, i));
...
...
lib/c/labcomm.h
View file @
fe7840b4
...
...
@@ -43,7 +43,9 @@ struct labcomm_signature {
int
size
;
unsigned
char
*
signature
;
int
index
;
#ifdef LABCOMM_EXPERIMENTAL_CACHED_ENCODED_SIZE
int
cached_encoded_size
;
// -1 if not initialized or type is variable size
#endif
};
/*
...
...
lib/c/labcomm_private.h
View file @
fe7840b4
...
...
@@ -455,6 +455,19 @@ static inline int labcomm_write_string(struct labcomm_writer *w, char *s)
return
0
;
}
/* Size of packed32 variable */
static
inline
int
labcomm_size_packed32
(
unsigned
int
data
)
{
int
result
=
0
;
int
i
;
for
(
i
=
0
;
i
==
0
||
data
;
i
++
,
data
=
(
data
>>
7
))
{
result
++
;
}
return
result
;
}
/*
* Macros for handling arrays indexed by signature index
*/
...
...
lib/c/test/test_labcomm.c
View file @
fe7840b4
...
...
@@ -102,11 +102,22 @@ static struct labcomm_reader reader = {
.
error
=
0
,
};
test_sample_test_var
encoder_var
,
decoder_var
;
static
int32_t
encoder_data
[
256
];
static
test_sample_test_var
encoder_var
=
{
.
n_0
=
1
,
.
n_1
=
1
,
.
a
=
encoder_data
,
};
static
int32_t
decoder_data
[
256
];
static
test_sample_test_var
decoder_var
=
{
.
n_0
=
1
,
.
n_1
=
1
,
.
a
=
decoder_data
,
};;
void
handle_test_var
(
test_sample_test_var
*
v
,
void
*
ctx
)
{
decoder_var
=
*
v
;
decoder_var
.
a
[
0
]
=
v
->
a
[
0
]
;
}
int
test_decode_one
(
struct
labcomm_decoder
*
decoder
)
...
...
@@ -135,9 +146,37 @@ int test_decode_one(struct labcomm_decoder *decoder)
return
result
;
}
int
main
(
void
)
static
void
test_encode_decode
(
struct
labcomm_encoder
*
encoder
,
struct
labcomm_decoder
*
decoder
,
int
expected
,
uint32_t
n_0
,
uint32_t
n_1
)
{
int
err
;
writer
.
pos
=
0
;
encoder_var
.
n_0
=
n_0
;
encoder_var
.
n_1
=
n_1
;
encoder_var
.
a
[
0
]
=
314
;
labcomm_encode_test_sample_test_var
(
encoder
,
&
encoder_var
);
err
=
test_decode_one
(
decoder
);
fprintf
(
stderr
,
"decode of sample %u * %u -> size=%d err=%d
\n
"
,
n_0
,
n_1
,
writer
.
pos
,
err
);
if
(
writer
.
pos
!=
labcomm_sizeof_test_sample_test_var
(
&
encoder_var
))
{
fprintf
(
stderr
,
"Incorrect sizeof %u * %u (%d != %d)
\n
"
,
n_0
,
n_1
,
writer
.
pos
,
labcomm_sizeof_test_sample_test_var
(
&
encoder_var
));
exit
(
1
);
}
if
(
writer
.
pos
!=
expected
)
{
fprintf
(
stderr
,
"Unexpected size %u * %u (%d != %d)
\n
"
,
n_0
,
n_1
,
writer
.
pos
,
expected
);
exit
(
1
);
}
}
int
main
(
void
)
{
int
err
,
i
;
struct
labcomm_encoder
*
encoder
=
labcomm_encoder_new
(
&
writer
,
labcomm_default_error_handler
,
...
...
@@ -153,21 +192,20 @@ int main(void)
NULL
);
labcomm_encoder_register_test_sample_test_var
(
encoder
);
err
=
test_decode_one
(
decoder
);
fprintf
(
stderr
,
"decode of register %d
\n
"
,
err
);
writer
.
pos
=
0
;
encoder_var
=
314
;
labcomm_encode_test_sample_test_var
(
encoder
,
&
encoder_var
);
err
=
test_decode_one
(
decoder
);
fprintf
(
stderr
,
"decode of sample %d -> %d
\n
"
,
err
,
decoder_var
);
if
(
decoder_var
!=
encoder_var
)
{
fprintf
(
stderr
,
"decode of register -> index %d
\n
"
,
err
);
test_encode_decode
(
encoder
,
decoder
,
7
,
1
,
1
);
if
(
decoder_var
.
a
[
0
]
!=
encoder_var
.
a
[
0
])
{
fprintf
(
stderr
,
"Failed to decode correct value %d != %d
\n
"
,
encoder_var
,
decoder_var
);
encoder_var
.
a
[
0
]
,
decoder_var
.
a
[
0
]
);
exit
(
1
);
}
fprintf
(
stderr
,
"Size: %d %d
\n
"
,
labcomm_sizeof_test_sample_test_var
(
NULL
,
NULL
),
writer
.
pos
);
// exit(1);
test_encode_decode
(
encoder
,
decoder
,
19
,
2
,
2
);
test_encode_decode
(
encoder
,
decoder
,
3
,
0
,
0
);
for
(
i
=
1
;
i
<=
4
;
i
++
)
{
test_encode_decode
(
encoder
,
decoder
,
2
+
i
,
0
,
(
1
<<
(
7
*
i
))
-
1
);
test_encode_decode
(
encoder
,
decoder
,
3
+
i
,
0
,
(
1
<<
(
7
*
i
)));
}
test_encode_decode
(
encoder
,
decoder
,
7
,
0
,
4294967295
);
return
0
;
}
...
...
lib/c/test/test_sample.lc
View file @
fe7840b4
sample int test_var;
sample int test_var
[_,_]
;
Write
Preview
Markdown
is supported
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