diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/format.c | 269 | ||||
-rw-r--r-- | src/grecs-gram.y | 1086 | ||||
-rw-r--r-- | src/grecs-lex.l | 579 | ||||
-rw-r--r-- | src/grecs.h | 180 | ||||
-rw-r--r-- | src/list.c | 177 | ||||
-rw-r--r-- | src/preproc.c | 1050 | ||||
-rw-r--r-- | src/text.c | 36 |
8 files changed, 1631 insertions, 1748 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 2f35f52..759716b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,5 +33,5 @@ EXTRA_DIST=grecs-gram.h $(PP_SETUP_FILE) INCLUDES = -I$(srcdir) @GRECS_INCLUDES@ AM_YFLAGS = -dtv -AM_LFLAGS = -dvp +AM_LFLAGS = -d # Use a modified ylwrap implementation that understands the --prefix option. YLWRAP = $(top_srcdir)/$(grex_topdir)grecs/build-aux/ylwrap --prefix yy_grecs diff --git a/src/format.c b/src/format.c index a1aa67d..fc6c8d6 100644 --- a/src/format.c +++ b/src/format.c @@ -27,163 +27,158 @@ const char * grecs_data_type_string (enum grecs_data_type type) { - switch (type) - { - case grecs_type_void: - return "void"; + switch (type) { + case grecs_type_void: + return "void"; - case grecs_type_string: - return "string"; - - case grecs_type_short: - case grecs_type_ushort: - case grecs_type_int: - case grecs_type_uint: - case grecs_type_long: - case grecs_type_ulong: - case grecs_type_size: - /*FIXME case grecs_type_off:*/ - return "number"; - - case grecs_type_time: - return "time"; - - case grecs_type_bool: - return "boolean"; - - case grecs_type_ipv4: - return "IPv4"; - - case grecs_type_cidr: - return "CIDR"; - - case grecs_type_host: - return "hostname"; - - case grecs_type_sockaddr: - return "sock-addr"; - - case grecs_type_section: - return "section"; - } - return "UNKNOWN?"; + case grecs_type_string: + return "string"; + + case grecs_type_short: + case grecs_type_ushort: + case grecs_type_int: + case grecs_type_uint: + case grecs_type_long: + case grecs_type_ulong: + case grecs_type_size: + /*FIXME case grecs_type_off:*/ + return "number"; + + case grecs_type_time: + return "time"; + + case grecs_type_bool: + return "boolean"; + + case grecs_type_ipv4: + return "IPv4"; + + case grecs_type_cidr: + return "CIDR"; + + case grecs_type_host: + return "hostname"; + + case grecs_type_sockaddr: + return "sock-addr"; + + case grecs_type_section: + return "section"; + } + return "UNKNOWN?"; } static void -format_level (FILE *stream, unsigned level) +format_level(FILE *stream, unsigned level) { - while (level--) - fprintf (stream, " "); + while (level--) + fprintf(stream, " "); } void -grecs_format_docstring (FILE *stream, const char *docstring, unsigned level) +grecs_format_docstring(FILE *stream, const char *docstring, unsigned level) { - size_t len = strlen (docstring); - int width = 78 - level * 2; - - if (width < 0) - { - width = 78; - level = 0; - } - - while (len) - { - size_t seglen; - const char *p; - - for (seglen = 0, p = docstring; p < docstring + width && *p; p++) - { - if (*p == '\n') - { - seglen = p - docstring; - break; - } - if (isspace (*p)) - seglen = p - docstring; + size_t len = strlen(docstring); + int width = 78 - level * 2; + + if (width < 0) { + width = 78; + level = 0; } - if (seglen == 0 || *p == 0) - seglen = p - docstring; - - format_level (stream, level); - fprintf (stream, "# "); - fwrite (docstring, seglen, 1, stream); - fputc ('\n', stream); - len -= seglen; - docstring += seglen; - if (*docstring == '\n') - { - docstring++; - len--; + + while (len) { + size_t seglen; + const char *p; + + for (seglen = 0, p = docstring; p < docstring + width && *p; + p++) { + if (*p == '\n') { + seglen = p - docstring; + break; + } + if (isspace(*p)) + seglen = p - docstring; + } + if (seglen == 0 || *p == 0) + seglen = p - docstring; + + format_level(stream, level); + fprintf(stream, "# "); + fwrite(docstring, seglen, 1, stream); + fputc('\n', stream); + len -= seglen; + docstring += seglen; + if (*docstring == '\n') { + docstring++; + len--; + } else + while (*docstring && isspace(*docstring)) { + docstring++; + len--; + } } - else - while (*docstring && isspace (*docstring)) - { - docstring++; - len--; - } - } } void -grecs_format_simple_statement (FILE *stream, struct grecs_keyword *kwp, - unsigned level) +grecs_format_simple_statement(FILE *stream, struct grecs_keyword *kwp, + unsigned level) { - const char *argstr; - - if (kwp->docstring) - grecs_format_docstring (stream, kwp->docstring, level); - format_level (stream, level); - - if (kwp->argname) - argstr = kwp->argname; - else - argstr = N_("arg"); - - if (strchr ("<[", argstr[0])) - fprintf (stream, "%s %s;\n", kwp->ident, gettext (argstr)); - else if (strchr (argstr, ':')) - fprintf (stream, "%s <%s>;\n", kwp->ident, gettext (argstr)); - else - { - fprintf (stream, "%s <%s: ", kwp->ident, gettext (argstr)); - if (GRECS_IS_LIST (kwp->type)) - fprintf (stream, "list of %s", - gettext (grecs_data_type_string (GRECS_TYPE (kwp->type)))); - else - fprintf (stream, "%s", gettext (grecs_data_type_string (kwp->type))); - fprintf (stream, ">;\n"); - } + const char *argstr; + + if (kwp->docstring) + grecs_format_docstring(stream, kwp->docstring, level); + format_level(stream, level); + + if (kwp->argname) + argstr = kwp->argname; + else + argstr = N_("arg"); + + if (strchr("<[", argstr[0])) + fprintf(stream, "%s %s;\n", kwp->ident, gettext(argstr)); + else if (strchr (argstr, ':')) + fprintf (stream, "%s <%s>;\n", kwp->ident, gettext(argstr)); + else { + fprintf(stream, "%s <%s: ", kwp->ident, gettext(argstr)); + if (GRECS_IS_LIST(kwp->type)) + fprintf(stream, "list of %s", + gettext(grecs_data_type_string( + GRECS_TYPE (kwp->type)))); + else + fprintf(stream, "%s", + gettext(grecs_data_type_string(kwp->type))); + fprintf(stream, ">;\n"); + } } void -grecs_format_block_statement (FILE *stream, struct grecs_keyword *kwp, - unsigned level) +grecs_format_block_statement(FILE *stream, struct grecs_keyword *kwp, + unsigned level) { - if (kwp->docstring) - grecs_format_docstring (stream, kwp->docstring, level); - format_level (stream, level); - fprintf (stream, "%s", kwp->ident); - if (kwp->argname) - fprintf (stream, " <%s>", gettext (kwp->argname)); - fprintf (stream, " {\n"); - grecs_format_statement_array (stream, kwp->kwd, 0, level + 1); - format_level (stream, level); - fprintf (stream, "}\n"); + if (kwp->docstring) + grecs_format_docstring(stream, kwp->docstring, level); + format_level(stream, level); + fprintf(stream, "%s", kwp->ident); + if (kwp->argname) + fprintf(stream, " <%s>", gettext(kwp->argname)); + fprintf(stream, " {\n"); + grecs_format_statement_array(stream, kwp->kwd, 0, level + 1); + format_level(stream, level); + fprintf(stream, "}\n"); } void -grecs_format_statement_array (FILE *stream, struct grecs_keyword *kwp, - unsigned n, - unsigned level) +grecs_format_statement_array(FILE *stream, struct grecs_keyword *kwp, + unsigned n, + unsigned level) { - for (; kwp->ident; kwp++, n++) - { - if (n) - fputc ('\n', stream); - if (kwp->type == grecs_type_section) - grecs_format_block_statement (stream, kwp, level); - else - grecs_format_simple_statement (stream, kwp, level); - } + for (; kwp->ident; kwp++, n++) { + if (n) + fputc('\n', stream); + if (kwp->type == grecs_type_section) + grecs_format_block_statement(stream, kwp, level); + else + grecs_format_simple_statement(stream, kwp, level); + } } + + diff --git a/src/grecs-gram.y b/src/grecs-gram.y index 0edea13..f65e2dd 100644 --- a/src/grecs-gram.y +++ b/src/grecs-gram.y @@ -48,11 +48,11 @@ int grecs_error_count; int grecs_default_port = 0; -static void *target_ptr (struct grecs_keyword *kwp, char *base); -static void stmt_begin (struct grecs_keyword *kwp, grecs_value_t tag); -static void stmt_end (struct grecs_keyword *kwp); -static struct grecs_keyword *find_keyword (const char *ident); +static void *target_ptr(struct grecs_keyword *kwp, char *base); +static void stmt_begin(struct grecs_keyword *kwp, grecs_value_t tag); +static void stmt_end(struct grecs_keyword *kwp); +static struct grecs_keyword *find_keyword(const char *ident); -static void process_ident (struct grecs_keyword *kwp, grecs_value_t *value); -static struct grecs_list *simple_list_create (int dispose); +static void process_ident(struct grecs_keyword *kwp, grecs_value_t *value); +static struct grecs_list *simple_list_create(int dispose); %} @@ -86,5 +86,5 @@ stmt : simple simple : ident vallist ';' { - process_ident($1, &$2); + process_ident($1, &$2); } ; @@ -92,5 +92,5 @@ simple : ident vallist ';' block : ident tag { stmt_begin($<kw>1, $<value>2); } '{' stmtlist '}' opt_sc { - stmt_end($1); + stmt_end($1); } ; @@ -98,7 +98,8 @@ block : ident tag { stmt_begin($<kw>1, $<value>2); } '{' stmtlist '}' opt_sc ident : IDENT { - $$ = find_keyword($1); - if (!$$) - grecs_error(&grecs_current_locus, 0, _("Unknown keyword")); + $$ = find_keyword($1); + if (!$$) + grecs_error(&grecs_current_locus, 0, + _("Unknown keyword")); } ; @@ -106,6 +107,6 @@ ident : IDENT tag : /* empty */ { - $$.type = GRECS_TYPE_STRING; - $$.v.string = NULL; + $$.type = GRECS_TYPE_STRING; + $$.v.string = NULL; } | value @@ -114,22 +115,20 @@ tag : /* empty */ vallist : vlist { - size_t n; - - if ((n = grecs_list_size ($1)) == 1) - { - $$ = *(grecs_value_t *)grecs_list_index ($1, 0); - } - else - { - size_t i; - struct grecs_list_entry *ep; + size_t n; + + if ((n = grecs_list_size($1)) == 1) { + $$ = *(grecs_value_t *)grecs_list_index($1, 0); + } else { + size_t i; + struct grecs_list_entry *ep; - $$.type = GRECS_TYPE_ARRAY; - $$.v.arg.c = n; - $$.v.arg.v = grecs_malloc (n * sizeof ($$.v.arg.v[0])); - for (i = 0, ep = $1->head; ep; i++, ep = ep->next) - $$.v.arg.v[i] = *(grecs_value_t *)ep->data; - } - grecs_list_free ($1); + $$.type = GRECS_TYPE_ARRAY; + $$.v.arg.c = n; + $$.v.arg.v = grecs_malloc(n * + sizeof($$.v.arg.v[0])); + for (i = 0, ep = $1->head; ep; i++, ep = ep->next) + $$.v.arg.v[i] = *(grecs_value_t *)ep->data; + } + grecs_list_free($1); } ; @@ -137,10 +136,10 @@ vallist : vlist vlist : value { - $$ = simple_list_create (0); - grecs_list_append ($$, grecs_value_dup (&$1)); + $$ = simple_list_create(0); + grecs_list_append($$, grecs_value_dup(&$1)); } | vlist value { - grecs_list_append ($1, grecs_value_dup (&$2)); + grecs_list_append($1, grecs_value_dup(&$2)); } ; @@ -148,16 +147,16 @@ vlist : value value : string { - $$.type = GRECS_TYPE_STRING; - $$.v.string = $1; + $$.type = GRECS_TYPE_STRING; + $$.v.string = $1; } | list { - $$.type = GRECS_TYPE_LIST; - $$.v.list = $1; + $$.type = GRECS_TYPE_LIST; + $$.v.list = $1; } | MSTRING { - $$.type = GRECS_TYPE_STRING; - $$.v.string = $1; + $$.type = GRECS_TYPE_STRING; + $$.v.string = $1; } ; @@ -170,12 +169,12 @@ string : STRING slist : slist0 { - struct grecs_list_entry *ep; - const void *p; - - grecs_line_begin (); - for (ep = $1->head; ep; ep = ep->next) - grecs_line_add (ep->data, strlen (ep->data)); - $$ = grecs_line_finish (); - grecs_list_free ($1); + struct grecs_list_entry *ep; + const void *p; + + grecs_line_begin(); + for (ep = $1->head; ep; ep = ep->next) + grecs_line_add(ep->data, strlen(ep->data)); + $$ = grecs_line_finish(); + grecs_list_free($1); } ; @@ -183,11 +182,11 @@ slist : slist0 slist0 : QSTRING { - $$ = simple_list_create (0); - grecs_list_append ($$, $1); + $$ = simple_list_create(0); + grecs_list_append($$, $1); } | slist0 QSTRING { - grecs_list_append ($1, $2); - $$ = $1; + grecs_list_append($1, $2); + $$ = $1; } ; @@ -195,13 +194,13 @@ slist0 : QSTRING list : '(' ')' { - $$ = NULL; + $$ = NULL; } | '(' values ')' { - $$ = $2; + $$ = $2; } | '(' values ',' ')' { - $$ = $2; + $$ = $2; } ; @@ -209,11 +208,11 @@ list : '(' ')' values : value { - $$ = simple_list_create (0); - grecs_list_append ($$, grecs_value_dup (&$1)); + $$ = simple_list_create(0); + grecs_list_append($$, grecs_value_dup(&$1)); } | values ',' value { - grecs_list_append ($1, grecs_value_dup (&$3)); - $$ = $1; + grecs_list_append($1, grecs_value_dup(&$3)); + $$ = $1; } ; @@ -228,153 +227,144 @@ int yyerror(char *s) { - grecs_error (&grecs_current_locus, 0, "%s", s); - return 0; + grecs_error(&grecs_current_locus, 0, "%s", s); + return 0; } static void -listel_dispose (void *el) +listel_dispose(void *el) { - free (el); + free(el); } static struct grecs_list * -simple_list_create (int dispose) +simple_list_create(int dispose) { - struct grecs_list *lp = grecs_list_create (); - if (dispose) - lp->free_entry = listel_dispose; - return lp; + struct grecs_list *lp = grecs_list_create(); + if (dispose) + lp->free_entry = listel_dispose; + return lp; } int -grecs_vasprintf (char **pbuf, size_t *psize, const char *fmt, va_list ap) +grecs_vasprintf(char **pbuf, size_t *psize, const char *fmt, va_list ap) { - char *buf = *pbuf; - size_t buflen = *psize; - int rc = 0; + char *buf = *pbuf; + size_t buflen = *psize; + int rc = 0; - if (!buf) - { - if (buflen == 0) - buflen = 512; /* Initial allocation */ + if (!buf) { + if (buflen == 0) + buflen = 512; /* Initial allocation */ - buf = calloc (1, buflen); - if (buf == NULL) - return ENOMEM; - } - - for (;;) - { - ssize_t n = vsnprintf (buf, buflen, fmt, ap); - if (n < 0 || n >= buflen || !memchr (buf, '\0', n + 1)) - { - char *newbuf; - size_t newlen = buflen * 2; - if (newlen < buflen) - { - rc = ENOMEM; - break; - } - newbuf = realloc (buf, newlen); - if (newbuf == NULL) - { - rc = ENOMEM; - break; - } - buflen = newlen; - buf = newbuf; + buf = calloc(1, buflen); + if (buf == NULL) + return ENOMEM; } - else - break; - } - - if (rc) - { - if (!*pbuf) - { - /* We made first allocation, now free it */ - free (buf); - buf = NULL; - buflen = 0; + + for (;;) { + ssize_t n = vsnprintf(buf, buflen, fmt, ap); + if (n < 0 || n >= buflen || !memchr(buf, '\0', n + 1)) { + char *newbuf; + size_t newlen = buflen * 2; + if (newlen < buflen) { + rc = ENOMEM; + break; + } + newbuf = realloc(buf, newlen); + if (newbuf == NULL) { + rc = ENOMEM; + break; + } + buflen = newlen; + buf = newbuf; + } else + break; } - } - *pbuf = buf; - *psize = buflen; - return rc; + if (rc) { + if (!*pbuf) { + /* We made first allocation, now free it */ + free(buf); + buf = NULL; + buflen = 0; + } + } + + *pbuf = buf; + *psize = buflen; + return rc; } int -grecs_asprintf (char **pbuf, size_t *psize, const char *fmt, ...) +grecs_asprintf(char **pbuf, size_t *psize, const char *fmt, ...) { - int rc; - va_list ap; - - va_start (ap, fmt); - rc = grecs_vasprintf (pbuf, psize, fmt, ap); - va_end (ap); - return rc; + int rc; + va_list ap; + + va_start(ap, fmt); + rc = grecs_vasprintf(pbuf, psize, fmt, ap); + va_end(ap); + return rc; } void -grecs_warning (grecs_locus_t *locus, int errcode, const char *fmt, ...) +grecs_warning(grecs_locus_t *locus, int errcode, const char *fmt, ...) { - va_list ap; - char *buf = NULL; - size_t size = 0; - - va_start (ap, fmt); - if (grecs_vasprintf (&buf, &size, fmt, ap)) - grecs_alloc_die (); - va_end (ap); - grecs_print_diag (locus, 0, errcode, buf); - free(buf); + va_list ap; + char *buf = NULL; + size_t size = 0; + + va_start(ap, fmt); + if (grecs_vasprintf(&buf, &size, fmt, ap)) + grecs_alloc_die(); + va_end(ap); + grecs_print_diag(locus, 0, errcode, buf); + free(buf); } void -grecs_error (grecs_locus_t *locus, int errcode, const char *fmt, ...) +grecs_error(grecs_locus_t *locus, int errcode, const char *fmt, ...) { - va_list ap; - char *buf = NULL; - size_t size = 0; - - va_start (ap, fmt); - if (grecs_vasprintf (&buf, &size, fmt, ap)) - grecs_alloc_die (); - va_end (ap); - grecs_print_diag (locus, 1, errcode, buf); - free (buf); - grecs_error_count++; + va_list ap; + char *buf = NULL; + size_t size = 0; + + va_start(ap, fmt); + if (grecs_vasprintf(&buf, &size, fmt, ap)) + grecs_alloc_die(); + va_end(ap); + grecs_print_diag(locus, 1, errcode, buf); + free(buf); + grecs_error_count++; } void -grecs_set_keywords (struct grecs_keyword *kwd) +grecs_set_keywords(struct grecs_keyword *kwd) { - config_keywords.kwd = kwd; + config_keywords.kwd = kwd; } int -grecs_parse (const char *name) +grecs_parse(const char *name) { - int rc; - if (grecs_lex_begin (name)) - return 1; - cursect = &config_keywords; - if (sections) - { - grecs_list_free (sections); - sections = NULL; - } - rc = yyparse (); - grecs_lex_end (); - if (grecs_error_count) - rc = 1; - return rc; + int rc; + if (grecs_lex_begin(name)) + return 1; + cursect = &config_keywords; + if (sections) { + grecs_list_free(sections); + sections = NULL; + } + rc = yyparse(); + grecs_lex_end(); + if (grecs_error_count) + rc = 1; + return rc; } void -grecs_gram_trace (int n) +grecs_gram_trace(int n) { - yydebug = n; + yydebug = n; } @@ -382,16 +372,16 @@ grecs_gram_trace (int n) static void * -target_ptr (struct grecs_keyword *kwp, char *base) +target_ptr(struct grecs_keyword *kwp, char *base) { - if (kwp->varptr) - base = (char*) kwp->varptr + kwp->offset; - else if (base) - base += kwp->offset; - - return base; + if (kwp->varptr) + base = (char*) kwp->varptr + kwp->offset; + else if (base) + base += kwp->offset; + + return base; } static int -fake_callback (enum grecs_callback_command cmd, +fake_callback(enum grecs_callback_command cmd, grecs_locus_t *locus, void *varptr, @@ -399,207 +389,192 @@ fake_callback (enum grecs_callback_command cmd, void *cb_data) { - return 0; + return 0; } static struct grecs_keyword fake = { - "*", - NULL, - NULL, - grecs_type_void, - NULL, - 0, - fake_callback, - NULL, - &fake + "*", + NULL, + NULL, + grecs_type_void, + NULL, + 0, + fake_callback, + NULL, + &fake }; static void -stmt_begin (struct grecs_keyword *kwp, grecs_value_t tag) +stmt_begin(struct grecs_keyword *kwp, grecs_value_t tag) { - void *target; - - if (!sections) - sections = grecs_list_create (); - grecs_list_push (sections, cursect); - if (kwp) - { - target = target_ptr (kwp, CURRENT_BASE); - cursect = kwp; - if (kwp->callback && kwp->callback (grecs_callback_section_begin, - &grecs_current_locus, /* FIXME */ - target, - &tag, - &kwp->callback_data)) - cursect = &fake; - } - else - /* install "ignore-all" section */ - cursect = kwp; + void *target; + + if (!sections) + sections = grecs_list_create(); + grecs_list_push(sections, cursect); + if (kwp) { + target = target_ptr(kwp, CURRENT_BASE); + cursect = kwp; + if (kwp->callback && + kwp->callback(grecs_callback_section_begin, + &grecs_current_locus, /* FIXME */ + target, + &tag, + &kwp->callback_data)) + cursect = &fake; + } else + /* install "ignore-all" section */ + cursect = kwp; } static void -stmt_end (struct grecs_keyword *kwp) +stmt_end(struct grecs_keyword *kwp) { - grecs_callback_fn callback = NULL; - void *dataptr = NULL; - - if (cursect && cursect->callback) - { - callback = cursect->callback; - dataptr = &cursect->callback_data; - } - - cursect = (struct grecs_keyword *) grecs_list_pop (sections); - if (!cursect) - abort (); - if (callback) - callback (grecs_callback_section_end, - &grecs_current_locus, /* FIXME */ - kwp ? target_ptr (kwp, CURRENT_BASE) : NULL, - NULL, - dataptr); + grecs_callback_fn callback = NULL; + void *dataptr = NULL; + + if (cursect && cursect->callback) { + callback = cursect->callback; + dataptr = &cursect->callback_data; + } + cursect = (struct grecs_keyword *) grecs_list_pop(sections); + if (!cursect) + abort(); + if (callback) + callback(grecs_callback_section_end, + &grecs_current_locus, /* FIXME */ + kwp ? target_ptr(kwp, CURRENT_BASE) : NULL, + NULL, + dataptr); } static struct grecs_keyword * -find_keyword (const char *ident) +find_keyword(const char *ident) { - struct grecs_keyword *kwp; + struct grecs_keyword *kwp; - if (cursect && cursect != &fake) - { - for (kwp = cursect->kwd; kwp->ident; kwp++) - if (strcmp (kwp->ident, ident) == 0) - return kwp; - } - else - { - return &fake; - } - return NULL; + if (cursect && cursect != &fake) { + for (kwp = cursect->kwd; kwp->ident; kwp++) + if (strcmp(kwp->ident, ident) == 0) + return kwp; + } else { + return &fake; + } + return NULL; } static int -string_to_bool (const char *string, int *pval, grecs_locus_t *locus) +string_to_bool(const char *string, int *pval, grecs_locus_t *locus) { - if (strcmp (string, "yes") == 0 - || strcmp (string, "true") == 0 - || strcmp (string, "t") == 0 - || strcmp (string, "1") == 0) - *pval = 1; - else if (strcmp (string, "no") == 0 - || strcmp (string, "false") == 0 - || strcmp (string, "nil") == 0 - || strcmp (string, "0") == 0) - *pval = 0; - else - { - grecs_error (locus, 0, _("%s: not a valid boolean value"), string); - return 1; - } - return 0; + if (strcmp(string, "yes") == 0 + || strcmp(string, "true") == 0 + || strcmp(string, "t") == 0 + || strcmp(string, "1") == 0) + *pval = 1; + else if (strcmp(string, "no") == 0 + || strcmp(string, "false") == 0 + || strcmp(string, "nil") == 0 + || strcmp(string, "0") == 0) + *pval = 0; + else { + grecs_error(locus, 0, + _("%s: not a valid boolean value"), + string); + return 1; + } + return 0; } static int -string_to_host (struct in_addr *in, const char *string, grecs_locus_t *locus) +string_to_host(struct in_addr *in, const char *string, grecs_locus_t *locus) { - if (inet_aton (string, in) == 0) - { - struct hostent *hp; - - hp = gethostbyname (string); - if (hp == NULL) - return 1; - memcpy (in, hp->h_addr, sizeof (struct in_addr)); - } - return 0; + if (inet_aton(string, in) == 0) { + struct hostent *hp; + + hp = gethostbyname(string); + if (hp == NULL) + return 1; + memcpy(in, hp->h_addr, sizeof(struct in_addr)); + } + return 0; } static int -string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, +string_to_sockaddr(struct grecs_sockaddr *sp, const char *string, grecs_locus_t *locus) { - if (string[0] == '/') - { - struct sockaddr_un s_un; - if (strlen (string) >= sizeof (s_un.sun_path)) - { - grecs_error (locus, 0, _("%s: UNIX socket name too long"), string); - return 1; - } - s_un.sun_family = AF_UNIX; - strcpy (s_un.sun_path, string); - sp->len = sizeof (s_un); - sp->sa = grecs_malloc (sp->len); - memcpy (sp->sa, &s_un, sp->len); - } - else - { - char *p = strchr (string, ':'); - size_t len; - struct sockaddr_in sa; - - sa.sin_family = AF_INET; - if (p) - len = p - string; - else - len = strlen (string); - - if (len == 0) - sa.sin_addr.s_addr = INADDR_ANY; - else - { - char *host = grecs_malloc (len + 1); - memcpy (host, string, len); - host[len] = 0; - - if (string_to_host (&sa.sin_addr, host, locus)) - { - grecs_error (locus, 0, - _("%s: not a valid IP address or hostname"), - host); - free (host); - return 1; - } - free (host); - } - - if (p) - { - struct servent *serv; - - p++; - serv = getservbyname (p, "tcp"); - if (serv != NULL) - sa.sin_port = serv->s_port; - else - { - unsigned long l; - char *q; - - /* Not in services, maybe a number? */ - l = strtoul (p, &q, 0); - - if (*q || l > USHRT_MAX) - { - grecs_error (locus, 0, - _("%s: not a valid port number"), p); - return 1; + if (string[0] == '/') { + struct sockaddr_un s_un; + if (strlen(string) >= sizeof(s_un.sun_path)) { + grecs_error(locus, 0, + _("%s: UNIX socket name too long"), + string); + return 1; } - sa.sin_port = htons (l); - } - } - else if (grecs_default_port) - sa.sin_port = grecs_default_port; - else - { - grecs_error (locus, 0, _("missing port number")); - return 1; + s_un.sun_family = AF_UNIX; + strcpy(s_un.sun_path, string); + sp->len = sizeof(s_un); + sp->sa = grecs_malloc(sp->len); + memcpy(sp->sa, &s_un, sp->len); + } else { + char *p = strchr(string, ':'); + size_t len; + struct sockaddr_in sa; + + sa.sin_family = AF_INET; + if (p) + len = p - string; + else + len = strlen(string); + + if (len == 0) + sa.sin_addr.s_addr = INADDR_ANY; + else { + char *host = grecs_malloc(len + 1); + memcpy(host, string, len); + host[len] = 0; + + if (string_to_host(&sa.sin_addr, host, locus)) { + grecs_error(locus, 0, + _("%s: not a valid IP address or hostname"), + host); + free(host); + return 1; + } + free(host); + } + + if (p) { + struct servent *serv; + + p++; + serv = getservbyname(p, "tcp"); + if (serv != NULL) + sa.sin_port = serv->s_port; + else { + unsigned long l; + char *q; + + /* Not in services, maybe a number? */ + l = strtoul(p, &q, 0); + + if (*q || l > USHRT_MAX) { + grecs_error(locus, 0, + _("%s: not a valid port number"), p); + return 1; + } + sa.sin_port = htons(l); + } + } else if (grecs_default_port) + sa.sin_port = grecs_default_port; + else { + grecs_error(locus, 0, _("missing port number")); + return 1; + } + sp->len = sizeof(sa); + sp->sa = grecs_malloc(sp->len); + memcpy(sp->sa, &sa, sp->len); } - sp->len = sizeof (sa); - sp->sa = grecs_malloc (sp->len); - memcpy (sp->sa, &sa, sp->len); - } - return 0; + return 0; } @@ -613,13 +588,13 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, macros have undefined behavior if T is signed and has padding bits. */ # define TYPE_MINIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ + ((t) (! TYPE_SIGNED(t) \ ? (t) 0 \ - : TYPE_SIGNED_MAGNITUDE (t) \ + : TYPE_SIGNED_MAGNITUDE(t) \ ? ~ (t) 0 \ - : ~ TYPE_MAXIMUM (t))) + : ~ TYPE_MAXIMUM(t))) # define TYPE_MAXIMUM(t) \ - ((t) (! TYPE_SIGNED (t) \ + ((t) (! TYPE_SIGNED(t) \ ? (t) -1 \ - : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) + : ((((t) 1 << (sizeof(t) * CHAR_BIT - 2)) - 1) * 2 + 1))) # define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) @@ -643,10 +618,10 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, if (x <= sum) \ { \ - grecs_error (loc, 0, _("numeric overflow")); \ + grecs_error(loc, 0, _("numeric overflow")); \ return 1; \ } \ else if (limit && x > limit) \ { \ - grecs_error (loc, 0, _("value out of allowed range")); \ + grecs_error(loc, 0, _("value out of allowed range")); \ return 1; \ } \ @@ -673,5 +648,5 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, } else \ base = 10; \ - STRTONUM (s, type, base, res, limit, loc); \ + STRTONUM(s, type, base, res, limit, loc); \ } @@ -680,8 +655,8 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, type tmpres; \ const char *s = str; \ - STRxTONUM (s, type, tmpres, 0, loc); \ + STRxTONUM(s, type, tmpres, 0, loc); \ if (*s) \ { \ - grecs_error (loc, 0, _("not a number (stopped near `%s')"), \ + grecs_error(loc, 0, _("not a number (stopped near `%s')"), \ s); \ return 1; \ @@ -701,5 +676,5 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, sign = 1; \ s++; \ - limit = TYPE_MINIMUM (type); \ + limit = TYPE_MINIMUM(type); \ limit = - limit; \ } \ @@ -707,8 +682,8 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, { \ sign = 0; \ - limit = TYPE_MAXIMUM (type); \ + limit = TYPE_MAXIMUM(type); \ } \ \ - STRxTONUM (s, unsigned type, tmpres, limit, loc); \ + STRxTONUM(s, unsigned type, tmpres, limit, loc); \ if (*s) \ { \ @@ -721,87 +696,87 @@ string_to_sockaddr (struct grecs_sockaddr *sp, const char *string, int -grecs_string_convert (void *target, enum grecs_data_type type, +grecs_string_convert(void *target, enum grecs_data_type type, const char *string, grecs_locus_t *locus) { - switch (type) - { - case grecs_type_void: - abort (); - - |