Skip to content
Snippets Groups Projects
Commit 26c549cf authored by Jonathan Schöbel's avatar Jonathan Schöbel
Browse files

Grammar: find_symbol helper method

parent d58062cb
No related branches found
No related tags found
No related merge requests found
......@@ -28,7 +28,7 @@ long_line_behaviour=1
long_line_column=72
[files]
current_page=14
current_page=10
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=13349;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
FILE_NAME_10=15191;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
......
......@@ -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_status (status, E_VALUE, 18, "invalid symbol");
return NULL;
set_success (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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment