Skip to content
GitLab
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
moberg
Commits
672dcb89
Commit
672dcb89
authored
Feb 15, 2019
by
Anders Blomdell
Browse files
More parsing
parent
3673bb52
Changes
3
Hide whitespace changes
Inline
Side-by-side
modules/comedi/comedi.c
View file @
672dcb89
...
...
@@ -18,15 +18,17 @@ static struct moberg_driver_config parse_config(
printf
(
"PARSE_CONFIG %s
\n
"
,
__FILE__
);
printf
(
"LBRACE %d"
,
acceptsym
(
c
,
tok_LBRACE
,
&
t
));
for
(;;)
{
if
(
acceptsym
(
c
,
tok_IDENT
,
&
t
)
||
acceptsym
(
c
,
tok_CONFIG
,
&
t
))
{
if
(
acceptsym
(
c
,
tok_RBRACE
,
NULL
))
{
break
;
}
else
if
(
acceptsym
(
c
,
tok_IDENT
,
&
t
)
||
acceptsym
(
c
,
tok_CONFIG
,
&
t
))
{
const
char
*
v
=
t
.
u
.
ident
.
value
;
int
l
=
t
.
u
.
ident
.
length
;
if
(
strncmp
(
"device"
,
v
,
l
)
==
0
)
{
printf
(
"DEVICE
\n
"
);
}
else
if
(
strncmp
(
"modprobe"
,
v
,
l
)
==
0
)
{
printf
(
"MODPROBE
\n
"
);
}
else
if
(
strncmp
(
"co
medi
"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"co
nfig
"
,
v
,
l
)
==
0
)
{
printf
(
"CONFIG
\n
"
);
}
acceptsym
(
c
,
tok_EQUAL
,
NULL
);
...
...
@@ -36,25 +38,31 @@ static struct moberg_driver_config parse_config(
printf
(
"%d
\n
"
,
t
.
kind
);
if
(
t
.
kind
==
tok_SEMICOLON
)
{
break
;
}
}
}
else
if
(
acceptsym
(
c
,
tok_RBRACE
,
NULL
))
{
break
;
}
else
{
goto
err
;
break
;
}
}
return
result
;
err:
exit
(
1
);
printf
(
"PARSE_CONFIG DONE%s
\n
"
,
__FILE__
);
return
result
;
}
static
struct
moberg_driver_map
parse_map
(
struct
moberg_config_parser_context
*
c
ontext
,
struct
moberg_config_parser_context
*
c
,
enum
moberg_config_parser_token_kind
kind
)
{
struct
moberg_driver_map
result
;
token_t
t
;
printf
(
"PARSE_MAP %s
\n
"
,
__FILE__
);
if
(
acceptsym
(
c
,
tok_IDENT
,
&
t
))
{
if
(
strncmp
(
"subdevice"
,
t
.
u
.
ident
.
value
,
t
.
u
.
ident
.
length
)
!=
0
)
{
goto
err
;
}
if
(
!
acceptsym
(
c
,
tok_LBRACKET
,
NULL
))
{
goto
err
;
}
if
(
!
acceptsym
(
c
,
tok_INTEGER
,
&
t
))
{
goto
err
;
}
if
(
!
acceptsym
(
c
,
tok_RBRACKET
,
NULL
))
{
goto
err
;
}
}
/*
const char *buf = context->buf;
while (*buf && *buf != '}') {
...
...
@@ -63,6 +71,8 @@ static struct moberg_driver_map parse_map(
context->buf = buf + 1;
*/
return
result
;
err:
exit
(
1
);
}
struct
moberg_driver_module
moberg_module
=
{
...
...
parse_config.c
View file @
672dcb89
...
...
@@ -11,6 +11,7 @@
#define token moberg_config_parser_token
#define token_kind moberg_config_parser_token_kind
#define acceptsym moberg_config_parser_acceptsym
#define peeksym moberg_config_parser_peeksym
typedef
struct
moberg_config_parser_token
token_t
;
typedef
struct
moberg_config_parser_ident
ident_t
;
...
...
@@ -47,20 +48,20 @@ out: ;
c
->
token
.
kind
=
tok_CONFIG
;
}
else
if
(
strncmp
(
"map"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_MAP
;
}
else
if
(
strncmp
(
"analogin"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"analog
_
in"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_ANALOGIN
;
}
else
if
(
strncmp
(
"analogout"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"analog
_
out"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_ANALOGOUT
;
}
else
if
(
strncmp
(
"digitalin"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"digital
_
in"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_DIGITALIN
;
}
else
if
(
strncmp
(
"digitalout"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"digital
_
out"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_DIGITALOUT
;
}
else
if
(
strncmp
(
"encoderin"
,
v
,
l
)
==
0
)
{
}
else
if
(
strncmp
(
"encoder
_
in"
,
v
,
l
)
==
0
)
{
c
->
token
.
kind
=
tok_ENCODERIN
;
}
else
{
c
->
token
.
kind
=
tok_IDENT
;
}
printf
(
"IDENT: %.*s
\n
"
,
l
,
v
);
printf
(
"IDENT: %.*s
%d
\n
"
,
l
,
v
,
c
->
token
.
kind
);
}
static
const
void
nextsym_integer
(
context_t
*
c
)
...
...
@@ -176,12 +177,14 @@ int moberg_config_parser_acceptsym(context_t *c,
token_t
*
token
)
{
if
(
c
->
token
.
kind
==
kind
)
{
printf
(
"ACCEPT %d"
,
c
->
token
.
kind
);
if
(
token
)
{
*
token
=
c
->
token
;
}
nextsym
(
c
);
return
1
;
}
printf
(
"REJECT %d (%d)"
,
kind
,
c
->
token
.
kind
);
return
0
;
}
...
...
@@ -214,6 +217,7 @@ err:
static
int
parse_map
(
context_t
*
c
,
struct
moberg_driver
*
driver
)
{
printf
(
"parsemap"
);
struct
token
t
;
if
(
acceptsym
(
c
,
tok_ANALOGIN
,
&
t
)
||
acceptsym
(
c
,
tok_ANALOGOUT
,
&
t
)
||
...
...
@@ -252,10 +256,15 @@ static int parse_device(context_t *c,
{
if
(
!
acceptsym
(
c
,
tok_LBRACE
,
NULL
))
{
goto
err
;
}
for
(;;)
{
struct
token
t
;
peeksym
(
c
,
&
t
);
printf
(
"PEEK %d"
,
t
.
kind
);
if
(
acceptsym
(
c
,
tok_CONFIG
,
NULL
))
{
driver
->
module
.
parse_config
(
c
);
}
else
if
(
acceptsym
(
c
,
tok_MAP
,
NULL
))
{
parse_map
(
c
,
driver
);
}
else
if
(
acceptsym
(
c
,
tok_RBRACE
,
NULL
))
{
break
;
}
else
{
goto
err
;
}
...
...
@@ -286,6 +295,8 @@ static int parse_config(context_t *c)
{
for
(;;)
{
struct
token
t
;
peeksym
(
c
,
&
t
);
printf
(
"PEEK %d"
,
t
.
kind
);
if
(
acceptsym
(
c
,
tok_IDENT
,
&
t
))
{
printf
(
"DRIVER=%.*s
\n
"
,
t
.
u
.
ident
.
length
,
t
.
u
.
ident
.
value
);
if
(
!
parse_driver
(
c
,
t
.
u
.
ident
))
{
goto
err
;
}
...
...
test/a/moberg.conf
View file @
672dcb89
...
...
@@ -7,7 +7,11 @@ comedi {
}
/*
Moberg
mapping
[
indices
] = {
driver
specific
}[
indices
]
{
driver
specific
}
is
parsed
by
parse_map
in
libmoberg_comedi
.
so
*/
map
digital_in
[
0
:
7
] = {
subdevice
[
4
]}[
0
:
7
] ;
map
analog_in
[
0
:
7
] =
subdevice
[
0
][
0
:
7
] ;
map
analog_out
[
0
:
1
] =
subdevice
[
1
][
0
:
1
] ;
map
digital_in
[
0
] =
subdevice
[
7
][
15
] ;
map
digital_in
[
1
] =
subdevice
[
7
][
2
] ;
map
digital_out
[
0
:
1
] =
subdevice
[
7
][
0
:
1
]
route
16
;
}
serial2002
{
config
{
...
...
@@ -17,5 +21,5 @@ serial2002 {
}
/*
Moberg
mapping
[
indices
] = {
driver
specific
}[
indices
]
{
driver
specific
}
is
parsed
by
parse_map
in
libmoberg_serial2002
.
so
*/
map
digital_in
[
30
:
37
] =
{
digital_in
}
[
0
:
7
] ;
map
digital_in
[
30
:
37
] =
digital_in
[
0
:
7
] ;
}
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment