Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
L
LabComm
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Redmine
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Erik Jansson
LabComm
Commits
3229d26e
Commit
3229d26e
authored
12 years ago
by
Sven Robertz
Browse files
Options
Downloads
Patches
Plain Diff
minor polishing
parent
2432621c
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
lib/c/experimental/labcomm_parser.c
+64
-50
64 additions, 50 deletions
lib/c/experimental/labcomm_parser.c
with
64 additions
and
50 deletions
lib/c/experimental/labcomm_parser.c
+
64
−
50
View file @
3229d26e
...
@@ -12,13 +12,35 @@
...
@@ -12,13 +12,35 @@
#define FALSE 0
#define FALSE 0
#define TRUE 1
#define TRUE 1
#define USER_ID_BASE 0x00000080
typedef
enum
{
TYPE_DECL
=
0x00000001
,
SAMPLE_DECL
=
0x00000002
,
ARRAY_DECL
=
0x00000010
,
STRUCT_DECL
=
0x00000011
,
TYPE_BOOLEAN
=
0x00000020
,
TYPE_BYTE
=
0x00000021
,
TYPE_SHORT
=
0x00000022
,
TYPE_INTEGER
=
0x00000023
,
TYPE_LONG
=
0x00000024
,
TYPE_FLOAT
=
0x00000025
,
TYPE_DOUBLE
=
0x00000026
,
TYPE_STRING
=
0x00000027
}
labcomm_type
;
void
error
(
char
*
s
)
{
void
error
(
char
*
s
)
{
fprintf
(
stderr
,
"%s
\n
"
,
s
);
fprintf
(
stderr
,
"%s"
,
s
);
fprintf
(
stderr
,
"
\n
exiting
\n
"
);
exit
(
1
);
exit
(
1
);
}
}
#define BUF_SIZE 1024
#define BUF_SIZE 1024
#define STACK_SIZE 16
#define STACK_SIZE 16
/* internal type: stack for the parser */
typedef
struct
{
typedef
struct
{
unsigned
char
*
c
;
unsigned
char
*
c
;
unsigned
int
size
;
unsigned
int
size
;
...
@@ -28,6 +50,15 @@ typedef struct {
...
@@ -28,6 +50,15 @@ typedef struct {
unsigned
int
top
;
unsigned
int
top
;
}
buffer
;
}
buffer
;
/* aux method for reading a big endian uint32 from a char* (i.e. ntohl but for explicit char*) */
static
int
unpack32
(
unsigned
char
*
c
,
unsigned
int
idx
)
{
unsigned
int
b0
=
(
c
[
idx
])
<<
3
;
unsigned
int
b1
=
(
c
[
idx
+
1
])
<<
2
;
unsigned
int
b2
=
(
c
[
idx
+
2
])
<<
1
;
unsigned
int
b3
=
c
[
idx
+
3
];
return
b0
|
b1
|
b2
|
b3
;
}
void
dumpStack
(
buffer
*
b
)
{
void
dumpStack
(
buffer
*
b
)
{
#ifdef DEBUG
#ifdef DEBUG
...
@@ -82,28 +113,10 @@ void advancen(buffer *b, size_t n) {
...
@@ -82,28 +113,10 @@ void advancen(buffer *b, size_t n) {
b
->
idx
+=
n
;
b
->
idx
+=
n
;
}
}
static
int
unpack32
(
unsigned
char
*
c
,
unsigned
int
idx
)
{
unsigned
int
b0
=
(
c
[
idx
])
<<
3
;
unsigned
int
b1
=
(
c
[
idx
+
1
])
<<
2
;
unsigned
int
b2
=
(
c
[
idx
+
2
])
<<
1
;
unsigned
int
b3
=
c
[
idx
+
3
];
return
b0
|
b1
|
b2
|
b3
;
}
unsigned
int
peek32
(
buffer
*
b
)
{
unsigned
int
peek32
(
buffer
*
b
)
{
#if 0
unsigned int b0=(b->c[b->idx]) << 3 ;
unsigned int b1=(b->c[b->idx+1]) << 2 ;
unsigned int b2=(b->c[b->idx+2]) << 1 ;
unsigned int b3=b->c[b->idx+3];
return b0 | b1 | b2 | b3;
#else
return
unpack32
(
b
->
c
,
b
->
idx
);
return
unpack32
(
b
->
c
,
b
->
idx
);
#endif
}
}
void
advance32
(
buffer
*
b
)
{
void
advance32
(
buffer
*
b
)
{
b
->
idx
+=
4
;
b
->
idx
+=
4
;
}
}
...
@@ -122,26 +135,13 @@ void getStr(buffer *b, char *dest, size_t size) {
...
@@ -122,26 +135,13 @@ void getStr(buffer *b, char *dest, size_t size) {
b
->
idx
+=
size
;
b
->
idx
+=
size
;
}
}
#define TYPE_DECL 0x00000001
#define SAMPLE_DECL 0x00000002
#define USER_ID_BASE 0x00000080
#define ARRAY_DECL 0x00000010
#define STRUCT_DECL 0x00000011
#define TYPE_BOOLEAN 0x00000020
#define TYPE_BYTE 0x00000021
#define TYPE_SHORT 0x00000022
#define TYPE_INTEGER 0x00000023
#define TYPE_LONG 0x00000024
#define TYPE_FLOAT 0x00000025
#define TYPE_DOUBLE 0x00000026
#define TYPE_STRING 0x00000027
//XXX experimental
//XXX experimental
unsigned
int
signatures_length
[
10
];
#define MAX_SIGNATURES 10
unsigned
char
signatures_name
[
10
][
64
];
//HERE BE DRAGONS: add range checks
#define MAX_NAME_LEN 32
unsigned
char
signatures
[
10
][
128
];
#define MAX_SIG_LEN 128
unsigned
int
signatures_length
[
MAX_SIGNATURES
];
unsigned
char
signatures_name
[
MAX_SIGNATURES
][
MAX_NAME_LEN
];
//HERE BE DRAGONS: add range checks
unsigned
char
signatures
[
MAX_SIGNATURES
][
MAX_SIG_LEN
];
unsigned
int
get_signature_len
(
unsigned
int
uid
){
unsigned
int
get_signature_len
(
unsigned
int
uid
){
return
signatures_length
[
uid
-
USER_ID_BASE
];
return
signatures_length
[
uid
-
USER_ID_BASE
];
...
@@ -156,7 +156,7 @@ unsigned char* get_signature(unsigned int uid){
...
@@ -156,7 +156,7 @@ unsigned char* get_signature(unsigned int uid){
void
dump_signature
(
unsigned
int
uid
){
void
dump_signature
(
unsigned
int
uid
){
int
i
;
int
i
;
unsigned
int
len
=
get_signature_len
(
uid
);
unsigned
int
len
=
get_signature_len
(
uid
);
printf
(
"sig %x : %s (len=%d):
\n
"
,
uid
,
get_signature_name
(
uid
),
len
);
printf
(
"sig
nature for uid
%x : %s (len=%d):
\n
"
,
uid
,
get_signature_name
(
uid
),
len
);
unsigned
char
*
sig
=
get_signature
(
uid
);
unsigned
char
*
sig
=
get_signature
(
uid
);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
for
(
i
=
0
;
i
<
len
;
i
++
)
{
printf
(
"%2.2x "
,
sig
[
i
]);
printf
(
"%2.2x "
,
sig
[
i
]);
...
@@ -269,10 +269,18 @@ int accept_sample_decl(buffer *d){
...
@@ -269,10 +269,18 @@ int accept_sample_decl(buffer *d){
unsigned
int
end
=
d
->
idx
;
unsigned
int
end
=
d
->
idx
;
unsigned
int
len
=
end
-
start
;
unsigned
int
len
=
end
-
start
;
printf
(
"signature for uid %x (start=%x,end=%x, nlen=%d,len=%d)
\n
"
,
uid
,
start
,
end
,
nlen
,
len
);
printf
(
"signature for uid %x (start=%x,end=%x, nlen=%d,len=%d)
\n
"
,
uid
,
start
,
end
,
nlen
,
len
);
if
(
len
<=
MAX_SIG_LEN
)
{
signatures_length
[
uid
-
USER_ID_BASE
]
=
len
;
signatures_length
[
uid
-
USER_ID_BASE
]
=
len
;
memcpy
(
signatures_name
[
uid
-
USER_ID_BASE
],
&
d
->
c
[
nstart
+
3
],
nlen
+
1
);
memcpy
(
signatures_name
[
uid
-
USER_ID_BASE
],
&
d
->
c
[
nstart
+
3
],
nlen
+
1
);
}
else
{
error
(
"sig longer than max length (this ought to be dynamic...)"
);
}
if
(
nlen
<
MAX_NAME_LEN
)
{
// reserve space for terminating NULL
signatures_name
[
uid
-
USER_ID_BASE
][
nlen
+
1
]
=
0
;
signatures_name
[
uid
-
USER_ID_BASE
][
nlen
+
1
]
=
0
;
memcpy
(
signatures
[
uid
-
USER_ID_BASE
],
&
d
->
c
[
start
],
len
);
memcpy
(
signatures
[
uid
-
USER_ID_BASE
],
&
d
->
c
[
start
],
len
);
}
else
{
error
(
"sig name longer than max length (this ought to be dynamic..."
);
}
return
TRUE
;
return
TRUE
;
}
else
{
}
else
{
return
FALSE
;
return
FALSE
;
...
@@ -438,7 +446,9 @@ int accept_sample_data(buffer *d){
...
@@ -438,7 +446,9 @@ int accept_sample_data(buffer *d){
accept_user_id
(
d
);
accept_user_id
(
d
);
unsigned
int
uid
=
pop
(
d
);
unsigned
int
uid
=
pop
(
d
);
printf
(
"sample data... %x
\n
"
,
uid
);
printf
(
"sample data... %x
\n
"
,
uid
);
#ifdef DEBUG
dump_signature
(
uid
);
dump_signature
(
uid
);
#endif
unsigned
int
siglen
=
get_signature_len
(
uid
);
unsigned
int
siglen
=
get_signature_len
(
uid
);
unsigned
char
*
sig
=
get_signature
(
uid
);
unsigned
char
*
sig
=
get_signature
(
uid
);
skip_packed_sample_data
(
d
,
sig
,
siglen
);
skip_packed_sample_data
(
d
,
sig
,
siglen
);
...
@@ -458,10 +468,14 @@ int skip_struct(buffer *d, unsigned char *sig, unsigned int len, unsigned int *p
...
@@ -458,10 +468,14 @@ int skip_struct(buffer *d, unsigned char *sig, unsigned int len, unsigned int *p
//skip name
//skip name
unsigned
int
namelen
=
unpack32
(
sig
,
*
pos
);
unsigned
int
namelen
=
unpack32
(
sig
,
*
pos
);
*
pos
+=
(
4
+
namelen
);
// 32bit len + actual string
*
pos
+=
(
4
+
namelen
);
// 32bit len + actual string
#ifdef DEBUG
printf
(
"namelen==%d
\n
"
,
namelen
);
printf
(
"namelen==%d
\n
"
,
namelen
);
#endif
unsigned
int
type
=
unpack32
(
sig
,
*
pos
);
unsigned
int
type
=
unpack32
(
sig
,
*
pos
);
*
pos
+=
4
;
*
pos
+=
4
;
#ifdef DEBUG
printf
(
"type == %x
\n
"
,
type
);
printf
(
"type == %x
\n
"
,
type
);
#endif
skipped
+=
skip_type
(
type
,
d
,
sig
,
len
,
pos
);
skipped
+=
skip_type
(
type
,
d
,
sig
,
len
,
pos
);
}
}
return
skipped
;
return
skipped
;
...
@@ -472,14 +486,14 @@ int skip_type(unsigned int type, buffer *d,
...
@@ -472,14 +486,14 @@ int skip_type(unsigned int type, buffer *d,
unsigned
char
*
sig
,
unsigned
int
len
,
unsigned
int
*
pos
)
unsigned
char
*
sig
,
unsigned
int
len
,
unsigned
int
*
pos
)
{
{
int
skipped
=
0
;
int
skipped
=
0
;
printf
(
"skip_type %x
\n
"
,
type
);
printf
(
"skip_type %x
:
"
,
type
);
switch
(
type
)
{
switch
(
type
)
{
case
TYPE_BOOLEAN
:
case
TYPE_BOOLEAN
:
printf
(
"boolean %d
\n
"
,
get
(
d
));
printf
(
"boolean
[
%d
]
\n
"
,
get
(
d
));
skipped
++
;
skipped
++
;
break
;
break
;
case
TYPE_BYTE
:
case
TYPE_BYTE
:
printf
(
"byte %d
\n
"
,
get
(
d
));
printf
(
"byte
[
%d
]
\n
"
,
get
(
d
));
skipped
++
;
skipped
++
;
break
;
break
;
case
TYPE_SHORT
:
case
TYPE_SHORT
:
...
@@ -488,7 +502,7 @@ int skip_type(unsigned int type, buffer *d,
...
@@ -488,7 +502,7 @@ int skip_type(unsigned int type, buffer *d,
skipped
+=
2
;
skipped
+=
2
;
break
;
break
;
case
TYPE_INTEGER
:
case
TYPE_INTEGER
:
printf
(
"integer %d
\n
"
,
get32
(
d
));
printf
(
"integer
[
%d
]
\n
"
,
get32
(
d
));
skipped
+=
4
;
skipped
+=
4
;
break
;
break
;
case
TYPE_FLOAT
:
case
TYPE_FLOAT
:
...
@@ -506,10 +520,10 @@ int skip_type(unsigned int type, buffer *d,
...
@@ -506,10 +520,10 @@ int skip_type(unsigned int type, buffer *d,
{
unsigned
int
len
=
get32
(
d
);
{
unsigned
int
len
=
get32
(
d
);
//advancen(d,len);
//advancen(d,len);
int
i
;
int
i
;
printf
(
"string "
);
printf
(
"string
[
"
);
for
(
i
=
0
;
i
<
len
;
i
++
)
for
(
i
=
0
;
i
<
len
;
i
++
)
printf
(
"%c"
,
get
(
d
));
printf
(
"%c"
,
get
(
d
));
printf
(
"
\n
"
);
printf
(
"
]
\n
"
);
skipped
+=
len
+
4
;
skipped
+=
len
+
4
;
break
;}
break
;}
case
ARRAY_DECL
:
case
ARRAY_DECL
:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment