Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
GSAT
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
josc941e
GSAT
Commits
26c549cf
Commit
26c549cf
authored
1 year ago
by
Jonathan Schöbel
Browse files
Options
Downloads
Patches
Plain Diff
Grammar: find_symbol helper method
parent
d58062cb
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
gsat.geany
+2
-2
2 additions, 2 deletions
gsat.geany
src/lib/grammar.c
+107
-103
107 additions, 103 deletions
src/lib/grammar.c
with
109 additions
and
105 deletions
gsat.geany
+
2
−
2
View file @
26c549cf
...
...
@@ -28,7 +28,7 @@ long_line_behaviour=1
long_line_column=72
[files]
current_page=1
4
current_page=1
0
FILE_NAME_0=309;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2FREADME;0;8
FILE_NAME_1=47;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2F.gitignore;0;8
FILE_NAME_2=1770;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fconfigure.ac;0;8
...
...
@@ -39,7 +39,7 @@ FILE_NAME_6=235;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2F
FILE_NAME_7=947;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fmacro.h;0;8
FILE_NAME_8=4630;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fstatus.h;0;8
FILE_NAME_9=881;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Flog.h;0;8
FILE_NAME_10=1
3349
;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
FILE_NAME_10=1
5191
;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
FILE_NAME_11=5253;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.h;0;8
FILE_NAME_12=668;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Ftests%2FMakefile.am;0;8
FILE_NAME_13=0;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Ftests%2Fno_test.sh;0;8
...
...
This diff is collapsed.
Click to expand it.
src/lib/grammar.c
+
107
−
103
View file @
26c549cf
...
...
@@ -498,6 +498,23 @@ symbol_is_used (struct GR_Grammar * grammar, symbol_t symbol)
return
FALSE
;
}
static
inline
bool
find_symbol
(
const
struct
GR_Grammar
*
grammar
,
symbol_t
symbol
,
/*@out@*/
size_t
*
index
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
*
index
=
i
;
return
TRUE
;
}
}
return
FALSE
;
}
static
inline
symbol_t
add_symbol
(
struct
GR_Grammar
*
grammar
,
...
...
@@ -590,15 +607,10 @@ bool
GR_Grammar_is_symbol
(
const
struct
GR_Grammar
*
grammar
,
symbol_t
symbol
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
return
TRUE
;
}
}
/* unused */
size_t
index
;
return
FALSE
;
return
find_symbol
(
grammar
,
symbol
,
&
index
)
;
}
bool
...
...
@@ -624,27 +636,24 @@ GR_Grammar_get_symbol_name (const struct GR_Grammar * grammar,
/*@null@*/
/*@out@*/
struct
GR_Status
*
status
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
char
*
name
;
size_t
index
;
/*@only@*/
char
*
name
;
name
=
strdup
(
grammar
->
symbols
[
i
].
name
);
if
(
NULL
==
name
)
{
set_status
(
status
,
E_ALLOC
,
3
,
"strdup failed"
);
return
NULL
;
}
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
set_status
(
status
,
E_VALUE
,
2
,
"invalid symbol"
);
return
NULL
;
}
set_success
(
status
);
return
name
;
}
name
=
strdup
(
grammar
->
symbols
[
index
].
name
);
if
(
NULL
==
name
)
{
set_status
(
status
,
E_ALLOC
,
3
,
"strdup failed"
);
return
NULL
;
}
set_s
tatu
s
(
status
,
E_VALUE
,
18
,
"invalid symbol"
);
return
NULL
;
set_s
ucces
s
(
status
);
return
name
;
}
/*@null@*/
...
...
@@ -653,15 +662,14 @@ const char *
GR_Grammar_raw_get_symbol_name
(
const
struct
GR_Grammar
*
grammar
,
symbol_t
symbol
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
size_t
index
;
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
return
grammar
->
symbols
[
i
].
name
;
}
return
NULL
;
}
return
NULL
;
return
grammar
->
symbols
[
index
].
name
;
}
bool
...
...
@@ -670,17 +678,17 @@ GR_Grammar_is_terminal_symbol (const struct GR_Grammar * grammar,
/*@null@*/
/*@only@*/
struct
GR_Status
*
status
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
size_t
index
;
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
set_success
(
status
);
return
grammar
->
symbols
[
i
].
is_terminal
;
}
set_status
(
status
,
E_VALUE
,
2
,
"invalid symbol"
);
return
FALSE
;
}
set_status
(
status
,
E_VALUE
,
9
,
"invalid symbol"
);
return
FALSE
;
set_success
(
status
);
return
grammar
->
symbols
[
index
].
is_terminal
;
}
symbol_t
...
...
@@ -704,30 +712,29 @@ GR_Grammar_rename_symbol (struct GR_Grammar * grammar,
/*@null@*/
/*@out@*/
struct
GR_Status
*
status
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
char
*
name_copy
;
size_t
index
;
name_copy
=
strdup
(
name
);
if
(
NULL
==
name_copy
)
{
set_status
(
status
,
E_ALLOC
,
3
,
"strdup failed"
);
return
FALSE
;
}
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
set_status
(
status
,
E_VALUE
,
2
,
"invalid symbol"
);
return
FALSE
;
}
free
(
grammar
->
symbols
[
i
].
name
);
grammar
->
symbols
[
i
].
name
=
name_copy
;
char
*
name_copy
;
set_success
(
status
);
return
TRUE
;
}
name_copy
=
strdup
(
name
);
if
(
NULL
==
name_copy
)
{
set_status
(
status
,
E_ALLOC
,
3
,
"strdup failed"
);
return
FALSE
;
}
set_status
(
status
,
E_VALUE
,
23
,
"invalid symbol"
);
return
FALSE
;
free
(
grammar
->
symbols
[
index
].
name
);
grammar
->
symbols
[
index
].
name
=
name_copy
;
set_success
(
status
);
return
TRUE
;
}
bool
...
...
@@ -736,68 +743,65 @@ GR_Grammar_raw_rename_symbol (struct GR_Grammar * grammar,
/*@null@*/
/*@out@*/
struct
GR_Status
*
status
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
free
(
grammar
->
symbols
[
i
].
name
);
grammar
->
symbols
[
i
].
name
=
name
;
size_t
index
;
set_success
(
status
);
return
TRUE
;
}
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
set_status
(
status
,
E_VALUE
,
2
,
"invalid symbol"
);
return
FALSE
;
}
set_status
(
status
,
E_VALUE
,
23
,
"invalid symbol"
);
return
FALSE
;
free
(
grammar
->
symbols
[
index
].
name
);
grammar
->
symbols
[
index
].
name
=
name
;
set_success
(
status
);
return
TRUE
;
}
bool
GR_Grammar_remove_symbol
(
struct
GR_Grammar
*
grammar
,
symbol_t
symbol
,
/*@null@*/
/*@out@*/
struct
GR_Status
*
status
)
{
for
(
size_t
i
=
0
;
i
<
grammar
->
symbol_n
;
i
++
)
{
if
(
symbol
==
grammar
->
symbols
[
i
].
id
)
{
struct
symbol_info
*
new_symbols
;
struct
symbol_info
*
new_symbols
;
size_t
index
;
if
(
symbol_is_used
(
grammar
,
symbol
))
{
set_status
(
status
,
E_STATE
,
2
,
"can't remove used symbol"
);
return
FALSE
;
}
if
(
!
find_symbol
(
grammar
,
symbol
,
&
index
))
{
set_status
(
status
,
E_VALUE
,
2
,
"invalid symbol"
);
return
FALSE
;
}
free
(
grammar
->
symbols
[
i
].
name
);
if
(
symbol_is_used
(
grammar
,
symbol
))
{
set_status
(
status
,
E_STATE
,
2
,
"can't remove used symbol"
);
return
FALSE
;
}
for
(
i
++
;
i
<
grammar
->
symbol_n
;
i
++
)
{
grammar
->
symbols
[
i
-
1
]
=
grammar
->
symbols
[
i
];
}
free
(
grammar
->
symbols
[
index
].
name
);
grammar
->
symbol_n
--
;
for
(
index
++
;
index
<
grammar
->
symbol_n
;
index
++
)
{
grammar
->
symbols
[
index
-
1
]
=
grammar
->
symbols
[
index
];
}
new_symbols
=
realloc
(
grammar
->
symbols
,
sizeof
(
struct
symbol_info
)
*
grammar
->
symbol_n
);
if
(
NULL
!=
new_symbols
)
{
grammar
->
symbols
=
new_symbols
;
set_success
(
status
);
}
else
{
set_status
(
status
,
E_ALLOC
,
10
,
"realloc failed"
);
}
grammar
->
symbol_n
--
;
return
TRUE
;
}
new_symbols
=
realloc
(
grammar
->
symbols
,
sizeof
(
struct
symbol_info
)
*
grammar
->
symbol_n
);
if
(
NULL
!=
new_symbols
)
{
grammar
->
symbols
=
new_symbols
;
set_success
(
status
);
}
else
{
set_status
(
status
,
E_ALLOC
,
10
,
"realloc failed"
);
/* TODO: non critical */
}
set_status
(
status
,
E_VALUE
,
23
,
"invalid symbol"
);
return
FALSE
;
return
TRUE
;
}
rule_t
...
...
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