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

Grammar: add_symbol

parent 154e4635
No related branches found
No related tags found
No related merge requests found
...@@ -67,7 +67,10 @@ LT_INIT() ...@@ -67,7 +67,10 @@ LT_INIT()
AC_CHECK_HEADERS([errno.h]) AC_CHECK_HEADERS([errno.h])
AC_CHECK_HEADERS([limits.h]) AC_CHECK_HEADERS([limits.h])
AC_CHECK_HEADERS([stdbool.h]) AC_CHECK_HEADERS([stdbool.h])
AC_CHECK_HEADERS([stddef.h])
AC_CHECK_HEADERS([stdint.h])
AC_CHECK_HEADERS([stdio.h]) AC_CHECK_HEADERS([stdio.h])
AC_CHECK_HEADERS([stdlib.h])
AC_CHECK_HEADERS([string.h]) AC_CHECK_HEADERS([string.h])
# Checks for typedefs, structures, and compiler characteristics. # Checks for typedefs, structures, and compiler characteristics.
......
...@@ -31,19 +31,19 @@ long_line_column=72 ...@@ -31,19 +31,19 @@ long_line_column=72
current_page=2 current_page=2
FILE_NAME_0=309;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2FREADME;0;8 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_1=47;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2F.gitignore;0;8
FILE_NAME_2=1592;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fconfigure.ac;0;8 FILE_NAME_2=1770;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fconfigure.ac;0;8
FILE_NAME_3=100;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2FMakefile.am;0;8 FILE_NAME_3=100;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2FMakefile.am;0;8
FILE_NAME_4=74;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2FMakefile.am;0;8 FILE_NAME_4=74;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2FMakefile.am;0;8
FILE_NAME_5=887;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Fmain.c;0;8 FILE_NAME_5=887;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Fmain.c;0;8
FILE_NAME_6=235;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2FMakefile.am;0;8 FILE_NAME_6=235;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2FMakefile.am;0;8
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_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=4596;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fstatus.h;0;8 FILE_NAME_8=4608;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_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=3276;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8 FILE_NAME_10=861;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
FILE_NAME_11=842;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.h;0;8 FILE_NAME_11=3676;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_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 FILE_NAME_13=0;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Ftests%2Fno_test.sh;0;8
FILE_NAME_14=1804;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Ftests%2Ftest_grammar.c;0;8 FILE_NAME_14=17127;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Ftests%2Ftest_grammar.c;0;8
[prjorg] [prjorg]
source_patterns=*.c; source_patterns=*.c;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -387,3 +388,91 @@ GR_Grammar_raw_set_author (struct GR_Grammar * grammar, ...@@ -387,3 +388,91 @@ GR_Grammar_raw_set_author (struct GR_Grammar * grammar,
return; return;
} }
static inline
symbol_t
add_symbol (struct GR_Grammar * grammar,
/*@only@*/ char * name, bool terminal,
/*@null@*/ /*@out@*/ struct GR_Status * status)
{
struct symbol_info * new_symbols;
struct symbol_info symbol_data;
#define symbols grammar->symbols
if (0 == grammar->symbol_n)
{
symbol_data.id = 1;
}
else if (UINT_MAX == symbols[grammar->symbol_n-1].id)
{
set_status (status, E_DOMAIN, 2, "too many symbols");
return SYMBOL_ERR;
}
else
{
symbol_data.id = symbols[grammar->symbol_n-1].id + 1;
}
#undef symbols
symbol_data.name = name;
symbol_data.is_terminal = terminal;
if (((SIZE_MAX / sizeof (struct symbol_info)) - 1)
< grammar->symbol_n)
{
set_status (status, E_DOMAIN, 3, "too many symbols");
return SYMBOL_ERR;
}
new_symbols = realloc (grammar->symbols,
sizeof (struct symbol_info)
* (grammar->symbol_n + 1));
if (NULL == new_symbols)
{
set_status (status, E_ALLOC, 5, "realloc failed");
return SYMBOL_ERR;
}
grammar->symbols = new_symbols;
grammar->symbols[grammar->symbol_n] = symbol_data;
grammar->symbol_n++;
set_success (status);
return symbol_data.id;
}
symbol_t
GR_Grammar_add_symbol (struct GR_Grammar * grammar,
const char * name, bool terminal,
/*@null@*/ /*@out@*/ struct GR_Status * status)
{
char * name_copy;
symbol_t id;
name_copy = strdup (name);
if (NULL == name_copy)
{
set_status (status, E_ALLOC, 3, "strdup failed");
return SYMBOL_ERR;
}
id = add_symbol (grammar, name_copy, terminal, status);
if (SYMBOL_ERR == id)
{
free (name_copy);
return SYMBOL_ERR;
}
return id;
}
symbol_t
GR_Grammar_raw_add_symbol (struct GR_Grammar * grammar,
/*@only@*/ char * name, bool terminal,
/*@null@*/ /*@out@*/
struct GR_Status * status)
{
return add_symbol (grammar, name, terminal, status);
}
...@@ -119,4 +119,15 @@ void ...@@ -119,4 +119,15 @@ void
GR_Grammar_raw_set_author (GR_Grammar * grammar, GR_Grammar_raw_set_author (GR_Grammar * grammar,
/*@null@*/ /*@only@*/ char * author); /*@null@*/ /*@only@*/ char * author);
symbol_t
GR_Grammar_add_symbol (GR_Grammar * grammar,
const char * name, bool terminal,
/*@null@*/ /*@out@*/ struct GR_Status * status);
symbol_t
GR_Grammar_raw_add_symbol (GR_Grammar * grammar,
/*@only@*/ char * name, bool terminal,
/*@null@*/ /*@out@*/
struct GR_Status * status);
#endif /* GRAMMAR_GRAMMAR_H */ #endif /* GRAMMAR_GRAMMAR_H */
...@@ -108,6 +108,7 @@ struct GR_Status ...@@ -108,6 +108,7 @@ struct GR_Status
UNDEFINED, UNDEFINED,
SUCCESS, SUCCESS,
E_ALLOC, E_ALLOC,
E_DOMAIN,
} status; } status;
int errno_; int errno_;
......
...@@ -552,6 +552,120 @@ START_TEST(test_grammar_author_raw) ...@@ -552,6 +552,120 @@ START_TEST(test_grammar_author_raw)
} }
END_TEST END_TEST
START_TEST(test_grammar_symbol_add_no_status)
{
struct GR_Grammar * grammar;
symbol_t symbol;
/* setup */
grammar = GR_Grammar_new ("", NULL, NULL, NULL);
ck_assert_ptr_ne (NULL, grammar);
/* test */
ck_assert_int_eq (0, grammar->symbol_n);
symbol = GR_Grammar_add_symbol (grammar, "sym", TRUE, NULL);
ck_assert_int_eq (1, symbol);
ck_assert_int_eq (1, grammar->symbol_n);
ck_assert_int_eq (1, grammar->symbols[0].id);
ck_assert_str_eq ("sym", grammar->symbols[0].name);
ck_assert_int_eq (TRUE, grammar->symbols[0].is_terminal);
/* cleanup */
GR_Grammar_free (grammar);
}
END_TEST
START_TEST(test_grammar_symbol_add_with_status)
{
struct GR_Status status;
struct GR_Grammar * grammar;
symbol_t symbol;
/* setup */
grammar = GR_Grammar_new ("", NULL, NULL, NULL);
ck_assert_ptr_ne (NULL, grammar);
/* test */
ck_assert_int_eq (0, grammar->symbol_n);
_status_preinit (status);
symbol = GR_Grammar_add_symbol (grammar, "sym", TRUE, &status);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (1, symbol);
ck_assert_int_eq (1, grammar->symbol_n);
ck_assert_int_eq (1, grammar->symbols[0].id);
ck_assert_str_eq ("sym", grammar->symbols[0].name);
ck_assert_int_eq (TRUE, grammar->symbols[0].is_terminal);
/* cleanup */
GR_Grammar_free (grammar);
}
END_TEST
START_TEST(test_grammar_symbol_add_raw_no_status)
{
struct GR_Grammar * grammar;
char * name;
symbol_t symbol;
/* setup */
grammar = GR_Grammar_new ("", NULL, NULL, NULL);
ck_assert_ptr_ne (NULL, grammar);
name = strdup ("sym");
ck_assert_ptr_ne (NULL, name);
/* test */
ck_assert_int_eq (0, grammar->symbol_n);
symbol = GR_Grammar_raw_add_symbol (grammar, name, TRUE, NULL);
ck_assert_int_eq (1, symbol);
ck_assert_int_eq (1, grammar->symbol_n);
ck_assert_int_eq (1, grammar->symbols[0].id);
ck_assert_str_eq ("sym", grammar->symbols[0].name);
ck_assert_int_eq (TRUE, grammar->symbols[0].is_terminal);
/* cleanup */
GR_Grammar_free (grammar);
}
END_TEST
START_TEST(test_grammar_symbol_add_raw_with_status)
{
struct GR_Status status;
struct GR_Grammar * grammar;
char * name;
symbol_t symbol;
/* setup */
grammar = GR_Grammar_new ("", NULL, NULL, NULL);
ck_assert_ptr_ne (NULL, grammar);
name = strdup ("sym");
ck_assert_ptr_ne (NULL, name);
/* test */
ck_assert_int_eq (0, grammar->symbol_n);
_status_preinit (status);
symbol = GR_Grammar_raw_add_symbol (grammar, name, TRUE, &status);
ck_assert_int_eq (1, symbol);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (1, grammar->symbol_n);
ck_assert_int_eq (1, grammar->symbols[0].id);
ck_assert_str_eq ("sym", grammar->symbols[0].name);
ck_assert_int_eq (TRUE, grammar->symbols[0].is_terminal);
/* cleanup */
GR_Grammar_free (grammar);
}
END_TEST
Suite * test_suite (void) Suite * test_suite (void)
{ {
...@@ -576,6 +690,11 @@ Suite * test_suite (void) ...@@ -576,6 +690,11 @@ Suite * test_suite (void)
tcase_add_test (tc_core, test_grammar_author_no_status); tcase_add_test (tc_core, test_grammar_author_no_status);
tcase_add_test (tc_core, test_grammar_author_with_status); tcase_add_test (tc_core, test_grammar_author_with_status);
tcase_add_test (tc_core, test_grammar_author_raw); tcase_add_test (tc_core, test_grammar_author_raw);
tcase_add_test (tc_core, test_grammar_symbol_add_no_status);
tcase_add_test (tc_core, test_grammar_symbol_add_with_status);
tcase_add_test (tc_core, test_grammar_symbol_add_raw_no_status);
tcase_add_test (tc_core, test_grammar_symbol_add_raw_with_status);
suite_add_tcase (s, tc_core); suite_add_tcase (s, tc_core);
return s; return s;
......
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