_init() and _INITIALIZER -> _make()

Gets rid of stupid memset()s and some preprocessor.
This commit is contained in:
Přemysl Eric Janouch 2017-06-22 16:14:11 +02:00
parent 4a199c7b67
commit 67cc243e34
Signed by: p
GPG Key ID: B715679E3A361BE6
3 changed files with 25 additions and 29 deletions

39
ell.c
View File

@ -72,7 +72,10 @@ struct ell_buffer {
bool memory_failure; ///< Memory allocation failed bool memory_failure; ///< Memory allocation failed
}; };
#define ELL_BUFFER_INITIALIZER { NULL, 0, 0, false } static struct ell_buffer
ell_buffer_make (void) {
return (struct ell_buffer) { NULL, 0, 0, false };
}
static bool static bool
ell_buffer_append (struct ell_buffer *self, const void *s, size_t n) { ell_buffer_append (struct ell_buffer *self, const void *s, size_t n) {
@ -212,9 +215,9 @@ struct ell_lexer {
struct ell_buffer string; ///< Parsed string value struct ell_buffer string; ///< Parsed string value
}; };
static void static struct ell_lexer
ell_lexer_init (struct ell_lexer *self, const char *p, size_t len) { ell_lexer_make (const char *p, size_t len) {
*self = (struct ell_lexer) { .p = (const unsigned char *) p, .len = len }; return (struct ell_lexer) { .p = (const unsigned char *) p, .len = len };
} }
static void static void
@ -311,7 +314,7 @@ ell_lexer_next (struct ell_lexer *self, const char **e) {
return ELLT_ABORT; return ELLT_ABORT;
free (self->string.s); free (self->string.s);
self->string = (struct ell_buffer) ELL_BUFFER_INITIALIZER; self->string = ell_buffer_make ();
int c = ell_lexer_advance (self); int c = ell_lexer_advance (self);
if (c == ELL_LEXER_COMMENT) { if (c == ELL_LEXER_COMMENT) {
@ -476,14 +479,14 @@ struct ell_parser {
bool memory_failure; ///< Memory allocation failed bool memory_failure; ///< Memory allocation failed
}; };
static void static struct ell_parser
ell_parser_init (struct ell_parser *p, const char *script, size_t len) { ell_parser_make (const char *script, size_t len) {
memset (p, 0, sizeof *p);
ell_lexer_init (&p->lexer, script, len);
// As reading in tokens may cause exceptions, we wait for the first peek() // As reading in tokens may cause exceptions, we wait for the first peek()
// to replace the initial ELLT_ABORT. // to replace the initial ELLT_ABORT.
p->replace_token = true; return (struct ell_parser) {
.lexer = ell_lexer_make (script, len),
.replace_token = true,
};
} }
static void static void
@ -673,10 +676,7 @@ struct ell_native_fn {
char name[]; ///< The name of the function char name[]; ///< The name of the function
}; };
static void static struct ell ell_make (void) { return (struct ell) {}; }
ell_init (struct ell *ell) {
memset (ell, 0, sizeof *ell);
}
static void static void
ell_free (struct ell *ell) { ell_free (struct ell *ell) {
@ -1127,7 +1127,7 @@ ell_defn (ell_fn_print) {
} }
ell_defn (ell_fn_cat) { ell_defn (ell_fn_cat) {
struct ell_buffer buf = ELL_BUFFER_INITIALIZER; struct ell_buffer buf = ell_buffer_make ();
struct ell_buffer_printer bp = { { ell_buffer_printer_putchar }, &buf }; struct ell_buffer_printer bp = { { ell_buffer_printer_putchar }, &buf };
for (; args; args = args->next) { for (; args; args = args->next) {
if (args->type != ELL_STRING) if (args->type != ELL_STRING)
@ -1155,8 +1155,7 @@ ell_defn (ell_fn_parse) {
if (!body || body->type != ELL_STRING) if (!body || body->type != ELL_STRING)
return ell_error (ell, "first argument must be string"); return ell_error (ell, "first argument must be string");
struct ell_parser p; struct ell_parser p = ell_parser_make (args->string, args->len);
ell_parser_init (&p, args->string, args->len);
const char *e = NULL; const char *e = NULL;
bool ok = ell_check (ell, (*result = ell_list (ell_parser_run (&p, &e)))); bool ok = ell_check (ell, (*result = ell_list (ell_parser_run (&p, &e))));
if (e) if (e)
@ -1392,8 +1391,8 @@ ell_std_initialize (struct ell *ell) {
return false; return false;
} }
struct ell_parser p; struct ell_parser p =
ell_parser_init (&p, ell_std_composed, sizeof ell_std_composed); ell_parser_make (ell_std_composed, sizeof ell_std_composed);
const char *e = NULL; const char *e = NULL;
struct ell_v *result = NULL; struct ell_v *result = NULL;

View File

@ -28,14 +28,13 @@ main (int argc, char *argv[]) {
} }
int c; int c;
struct ell_buffer buf = ELL_BUFFER_INITIALIZER; struct ell_buffer buf = ell_buffer_make ();
while ((c = fgetc (fp)) != EOF) while ((c = fgetc (fp)) != EOF)
ell_buffer_append_c (&buf, c); ell_buffer_append_c (&buf, c);
ell_buffer_append_c (&buf, 0); ell_buffer_append_c (&buf, 0);
fclose (fp); fclose (fp);
struct ell_parser p; struct ell_parser p = ell_parser_make (buf.s, buf.len - 1);
ell_parser_init (&p, buf.s, buf.len - 1);
const char *e = NULL; const char *e = NULL;
struct ell_v *program = ell_parser_run (&p, &e); struct ell_v *program = ell_parser_run (&p, &e);
free (buf.s); free (buf.s);
@ -45,8 +44,7 @@ main (int argc, char *argv[]) {
} }
ell_parser_free (&p); ell_parser_free (&p);
struct ell ell; struct ell ell = ell_make ();
ell_init (&ell);
if (!ell_std_initialize (&ell)) if (!ell_std_initialize (&ell))
printf ("%s\n", "runtime library initialization failed"); printf ("%s\n", "runtime library initialization failed");

5
repl.c
View File

@ -84,7 +84,7 @@ int
main (int argc, char *argv[]) { main (int argc, char *argv[]) {
(void) argc; (void) argc;
ell_init (&ell); ell = ell_make ();
if (!ell_std_initialize (&ell)) if (!ell_std_initialize (&ell))
printf ("%s\n", "runtime library initialization failed"); printf ("%s\n", "runtime library initialization failed");
@ -96,8 +96,7 @@ main (int argc, char *argv[]) {
char *line; char *line;
while ((line = readline ("> "))) { while ((line = readline ("> "))) {
struct ell_parser p; struct ell_parser p = ell_parser_make (line, strlen (line));
ell_parser_init (&p, line, strlen (line));
add_history (line); add_history (line);
const char *e = NULL; const char *e = NULL;