Mercurial > masqmail
diff src/parse.c @ 10:26e34ae9a3e3
changed indention and line wrapping to a more consistent style
author | meillo@marmaro.de |
---|---|
date | Mon, 27 Oct 2008 16:23:10 +0100 |
parents | 08114f7dcc23 |
children | f671821d8222 |
line wrap: on
line diff
--- a/src/parse.c Mon Oct 27 16:21:27 2008 +0100 +++ b/src/parse.c Mon Oct 27 16:23:10 2008 +0100 @@ -33,320 +33,315 @@ char *parse_error = NULL; -static -gchar *skip_comment(gchar *p) +static gchar* +skip_comment(gchar * p) { #ifdef PARSE_TEST - g_print("skip_comment: %s\n", p); + g_print("skip_comment: %s\n", p); #endif - p++; - while(*p && *p != ')'){ - p++; - if(*p == '(') - p = skip_comment(p); - } - p++; + p++; + while (*p && *p != ')') { + p++; + if (*p == '(') + p = skip_comment(p); + } + p++; - return p; + return p; } -static -gboolean read_word(gchar *p, gchar **b, gchar **e) +static gboolean +read_word(gchar * p, gchar ** b, gchar ** e) { #ifdef PARSE_TEST - g_print("read_word: %s\n", p); + g_print("read_word: %s\n", p); #endif - /* eat leading spaces */ - while(*p && isspace(*p)) p++; - - *b = p; - /* b = &p;*/ - if(*p == '\"'){ - /* quoted-string */ - p++; - while(*p && (*p != '\"')) p++; - p++; - }else{ - /* atom */ - while(*p && !strchr(specials, *p) && !iscntrl(*p) && !isspace(*p)) - p++; - } - *e = p; - return TRUE; + /* eat leading spaces */ + while (*p && isspace(*p)) + p++; + + *b = p; + /* b = &p; */ + if (*p == '\"') { + /* quoted-string */ + p++; + while (*p && (*p != '\"')) + p++; + p++; + } else { + /* atom */ + while (*p && !strchr(specials, *p) && !iscntrl(*p) && !isspace(*p)) + p++; + } + *e = p; + return TRUE; } -static -gboolean read_word_with_dots(gchar *p, gchar **b, gchar **e) +static gboolean +read_word_with_dots(gchar * p, gchar ** b, gchar ** e) { - gchar *b0 = p; + gchar *b0 = p; #ifdef PARSE_TEST - g_print("read_word_with_dots: %s\n", p); + g_print("read_word_with_dots: %s\n", p); #endif - while(TRUE){ - if(!read_word(p, b, e)) - return FALSE; - p = *e; - if(*p != '.') break; - p++; - } - *b = b0; - *e = p; - return TRUE; + while (TRUE) { + if (!read_word(p, b, e)) + return FALSE; + p = *e; + if (*p != '.') + break; + p++; + } + *b = b0; + *e = p; + return TRUE; } -static -gboolean read_domain(gchar *p, gchar **b, gchar **e) +static gboolean +read_domain(gchar * p, gchar ** b, gchar ** e) { #ifdef PARSE_TEST - g_print("read_domain: %s\n", p); + g_print("read_domain: %s\n", p); #endif - *b = p; - if(*p != '['){ - while(isalnum(*p) || (*p == '-') || (*p == '.')) - p++; - }else{ - p++; - while(isalpha(*p) || (*p == '.')) - p++; - if(*p != ']'){ - parse_error = - g_strdup_printf("']' expected at end of literal address %s", *b); - return FALSE; - } - p++; - } - *e = p; - return TRUE; + *b = p; + if (*p != '[') { + while (isalnum(*p) || (*p == '-') || (*p == '.')) + p++; + } else { + p++; + while (isalpha(*p) || (*p == '.')) + p++; + if (*p != ']') { + parse_error = g_strdup_printf("']' expected at end of literal address %s", *b); + return FALSE; + } + p++; + } + *e = p; + return TRUE; } -gboolean parse_address_rfc822(gchar *string, - gchar **local_begin, gchar **local_end, - gchar **domain_begin, gchar **domain_end, - gchar **address_end) +gboolean +parse_address_rfc822(gchar* string, gchar** local_begin, gchar** local_end, gchar** domain_begin, gchar** domain_end, gchar** address_end) { - gint angle_brackets = 0; + gint angle_brackets = 0; + + gchar *p = string; + gchar *b, *e; + + *local_begin = *local_end = NULL; + *domain_begin = *domain_end = NULL; - gchar *p = string; - gchar *b, *e; - - *local_begin = *local_end = NULL; - *domain_begin = *domain_end = NULL; + /* might be some memory left from previous call: */ + if (parse_error != NULL) { + g_free(parse_error); + parse_error = NULL; + } - /* might be some memory left from previous call: */ - if(parse_error != NULL){ - g_free(parse_error); - parse_error = NULL; - } + /* leading spaces and angle brackets */ + while (*p && (isspace(*p) || (*p == '<'))) { + if (*p == '<') + angle_brackets++; + p++; + } - /* leading spaces and angle brackets */ - while(*p && (isspace(*p) || (*p == '<'))){ - if(*p == '<') - angle_brackets++; - p++; - } - - if(*p){ - while(TRUE){ - if(read_word_with_dots(p, &b, &e)){ - p = e; + if (*p) { + while (TRUE) { + if (read_word_with_dots(p, &b, &e)) { + p = e; #ifdef PARSE_TEST - g_print("after read_word_with_dots: %s\n", p); + g_print("after read_word_with_dots: %s\n", p); #endif - /* eat white spaces and comments */ - while((*p && (isspace(*p))) || (*p == '(')){ - if(*p == '('){ - if(!(p = skip_comment(p))){ - parse_error = - g_strdup("missing right bracket ')'"); - return FALSE; - } - }else - p++; - } - /* we now have a non-space char that is not - the beginning of a comment */ + /* eat white spaces and comments */ + while ((*p && (isspace(*p))) || (*p == '(')) { + if (*p == '(') { + if (!(p = skip_comment(p))) { + parse_error = g_strdup("missing right bracket ')'"); + return FALSE; + } + } else + p++; + } + /* we now have a non-space char that is not + the beginning of a comment */ - if(*p == '@'){ - /* the last word was the local_part - of an addr-spec */ - *local_begin = b; - *local_end = e; + if (*p == '@') { + /* the last word was the local_part + of an addr-spec */ + *local_begin = b; + *local_end = e; #ifdef PARSE_TEST - g_print("found local part: %s\n", *local_begin); + g_print("found local part: %s\n", *local_begin); #endif - if(*p == '@'){ - p++; /* skip @ */ - /* now the domain */ - if(read_domain(p, &b, &e)){ - p = e; - *domain_begin = b; - *domain_end = e; - } - else - return FALSE; - }else{ - /* unqualified? */ - *domain_begin = *domain_end = NULL; - } - break; - }else if(*p == '<'){ - /* addr-spec follows */ - while(isspace(*p) || (*p == '<')){ - if(*p == '<') - angle_brackets++; - p++; - } - if(read_word_with_dots(p, &b, &e)){ - p = e; - *local_begin = b; - *local_end = e; + if (*p == '@') { + p++; /* skip @ */ + /* now the domain */ + if (read_domain(p, &b, &e)) { + p = e; + *domain_begin = b; + *domain_end = e; + } else + return FALSE; + } else { + /* unqualified? */ + *domain_begin = *domain_end = NULL; + } + break; + } else if (*p == '<') { + /* addr-spec follows */ + while (isspace(*p) || (*p == '<')) { + if (*p == '<') + angle_brackets++; + p++; + } + if (read_word_with_dots(p, &b, &e)) { + p = e; + *local_begin = b; + *local_end = e; #ifdef PARSE_TEST - g_print("found local part: %s\n", *local_begin); + g_print("found local part: %s\n", *local_begin); #endif - }else - return FALSE; - if(*p == '@'){ - p++; - if(read_domain(p, &b, &e)){ - p = e; - *domain_begin = b; - *domain_end = e; - }else - return FALSE; - }else{ - /* may be unqualified address */ - *domain_begin = *domain_end = NULL; - } - break; - }else if(!*p || *p == '>'){ - *local_begin = b; - *local_end = e; + } else + return FALSE; + if (*p == '@') { + p++; + if (read_domain(p, &b, &e)) { + p = e; + *domain_begin = b; + *domain_end = e; + } else + return FALSE; + } else { + /* may be unqualified address */ + *domain_begin = *domain_end = NULL; + } + break; + } else if (!*p || *p == '>') { + *local_begin = b; + *local_end = e; #ifdef PARSE_TEST - g_print("found local part: %s\n", *local_begin); + g_print("found local part: %s\n", *local_begin); +#endif + *domain_begin = *domain_end = NULL; + break; + } else if (strchr(specials, *p) || iscntrl(*p) || isspace(*p)) { + parse_error = g_strdup_printf("unexpected character: %c", *p); + return FALSE; + } + } else + return FALSE; + } + /* trailing spaces and angle brackets */ +#ifdef PARSE_TEST + g_print("down counting trailing '>'\n"); #endif - *domain_begin = *domain_end = NULL; - break; - }else if(strchr(specials, *p) || iscntrl(*p) || isspace(*p)){ - parse_error = g_strdup_printf("unexpected character: %c", *p); - return FALSE; + while (*p && (isspace(*p) || (*p == '>'))) { + if (*p == '>') + angle_brackets--; + p++; + } + + *address_end = p; + + if (angle_brackets != 0) { + if (angle_brackets > 0) + parse_error = g_strdup("missing '>' at end of string"); + else + parse_error = g_strdup("superfluous '>' at end of string"); + return FALSE; + } else { + /* we successfully parsed the address */ + return TRUE; + } + /* we never get here */ } - }else return FALSE; - } - /* trailing spaces and angle brackets */ -#ifdef PARSE_TEST - g_print("down counting trailing '>'\n"); -#endif - while(*p && (isspace(*p) || (*p == '>'))){ - if(*p == '>') - angle_brackets--; - p++; - } - - *address_end = p; - - if(angle_brackets != 0){ - if(angle_brackets > 0) - parse_error = g_strdup("missing '>' at end of string"); - else - parse_error = g_strdup("superfluous '>' at end of string"); - return FALSE; - }else{ - /* we successfully parsed the address */ - return TRUE; - } - /* we never get here */ - } - return FALSE; } -gboolean parse_address_rfc821(gchar *string, - gchar **local_begin, gchar **local_end, - gchar **domain_begin, gchar **domain_end, - gchar **address_end) +gboolean +parse_address_rfc821(gchar* string, gchar** local_begin, gchar** local_end, gchar** domain_begin, gchar** domain_end, gchar** address_end) { - gint angle_brackets = 0; + gint angle_brackets = 0; + + gchar *p = string; + gchar *b, *e; - gchar *p = string; - gchar *b, *e; - - *local_begin = *local_end = NULL; - *domain_begin = *domain_end = NULL; + *local_begin = *local_end = NULL; + *domain_begin = *domain_end = NULL; - /* might be some memory left from previous call: */ - if(parse_error != NULL){ - g_free(parse_error); - parse_error = NULL; - } + /* might be some memory left from previous call: */ + if (parse_error != NULL) { + g_free(parse_error); + parse_error = NULL; + } - /* leading spaces and angle brackets */ - while(*p && (isspace(*p) || (*p == '<'))){ - if(*p == '<') - angle_brackets++; - p++; - } - - if(*p){ - while(TRUE){ - if(read_word_with_dots(p, &b, &e)){ - p = e; + /* leading spaces and angle brackets */ + while (*p && (isspace(*p) || (*p == '<'))) { + if (*p == '<') + angle_brackets++; + p++; + } + + if (*p) { + while (TRUE) { + if (read_word_with_dots(p, &b, &e)) { + p = e; #ifdef PARSE_TEST - g_print("after read_word_with_dots: %s\n", p); + g_print("after read_word_with_dots: %s\n", p); #endif - *local_begin = b; - *local_end = e; + *local_begin = b; + *local_end = e; #ifdef PARSE_TEST - g_print("found local part: %s\n", *local_begin); - g_print("local_end = %s\n", *local_end); + g_print("found local part: %s\n", *local_begin); + g_print("local_end = %s\n", *local_end); #endif - if(!(*p) || isspace(*p) || (*p == '>')){ - /* unqualified ?*/ - domain_begin = domain_end = NULL; - break; - }else if(*p == '@'){ - p++; - if(read_domain(p, &b, &e)){ - p = e; - *domain_begin = b; - *domain_end = e; - } - break; - }else{ - parse_error = - g_strdup_printf("unexpected character after local part '%c'",*p); - return FALSE; - } - } else - return FALSE; - } + if (!(*p) || isspace(*p) || (*p == '>')) { + /* unqualified ? */ + domain_begin = domain_end = NULL; + break; + } else if (*p == '@') { + p++; + if (read_domain(p, &b, &e)) { + p = e; + *domain_begin = b; + *domain_end = e; + } + break; + } else { + parse_error = g_strdup_printf ("unexpected character after local part '%c'", *p); + return FALSE; + } + } else + return FALSE; + } - /* trailing spaces and angle brackets */ + /* trailing spaces and angle brackets */ #ifdef PARSE_TEST - g_print("down counting trailing '>'\n"); + g_print("down counting trailing '>'\n"); #endif - while(*p && (isspace(*p) || (*p == '>'))){ - if(*p == '>') - angle_brackets--; - p++; - } - *address_end = p; + while (*p && (isspace(*p) || (*p == '>'))) { + if (*p == '>') + angle_brackets--; + p++; + } + *address_end = p; - if(angle_brackets != 0){ - if(angle_brackets > 0) - parse_error = g_strdup("missing '>' at end of string"); - else - parse_error = g_strdup("superfluous '>' at end of string"); - return FALSE; - }else{ - /* we successfully parsed the address */ - return TRUE; - } - /* we never get here */ - } - return FALSE; + if (angle_brackets != 0) { + if (angle_brackets > 0) + parse_error = g_strdup("missing '>' at end of string"); + else + parse_error = g_strdup("superfluous '>' at end of string"); + return FALSE; + } else { + /* we successfully parsed the address */ + return TRUE; + } + /* we never get here */ + } + return FALSE; } /* @@ -358,93 +353,98 @@ parses both rfc 821 and rfc 822 addresses, depending on flag is_rfc821 */ -address *_create_address(gchar *string, gchar **end, gboolean is_rfc821) +address* +_create_address(gchar * string, gchar ** end, gboolean is_rfc821) { - gchar *loc_beg, *loc_end; - gchar *dom_beg, *dom_end; - gchar *addr_end; + gchar *loc_beg, *loc_end; + gchar *dom_beg, *dom_end; + gchar *addr_end; - if (string && (string[0] == 0)) { - address *addr = g_malloc(sizeof(address)); - addr->address = g_strdup(""); - addr->local_part = g_strdup(""); - addr->domain = g_strdup(""); /* 'NULL' address (failure notice), - "" makes sure it will not be qualified with a hostname */ - return addr; - } + if (string && (string[0] == 0)) { + address *addr = g_malloc(sizeof(address)); + addr->address = g_strdup(""); + addr->local_part = g_strdup(""); + addr->domain = g_strdup(""); /* 'NULL' address (failure notice), "" makes sure it will not be qualified with a hostname */ + return addr; + } - if(is_rfc821 ? - parse_address_rfc821(string, - &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end) : - parse_address_rfc822(string, - &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end)){ - address *addr = g_malloc(sizeof(address)); - gchar *p = addr_end; - + if (is_rfc821 + ? parse_address_rfc821(string, &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end) + : parse_address_rfc822(string, &loc_beg, &loc_end, &dom_beg, &dom_end, &addr_end)) + { + address *addr = g_malloc(sizeof(address)); + gchar *p = addr_end; + + + memset(addr, 0, sizeof(address)); - memset(addr, 0, sizeof(address)); + if (loc_beg[0] == '|') { + parse_error = g_strdup("no pipe allowed for RFC 822/821 address"); + return NULL; + } - if(loc_beg[0] == '|'){ - parse_error = g_strdup("no pipe allowed for RFC 822/821 address"); - return NULL; - } + while (*p && (*p != ',')) + p++; + addr->address = g_strndup(string, p - string); - while(*p && (*p != ',')) p++; - addr->address = g_strndup(string, p - string); - - addr->local_part = g_strndup(loc_beg, loc_end - loc_beg); + addr->local_part = g_strndup(loc_beg, loc_end - loc_beg); #ifdef PARSE_TEST - g_print("addr->local_part = %s\n", addr->local_part); + g_print("addr->local_part = %s\n", addr->local_part); #endif - if(dom_beg != NULL){ - addr->domain = g_strndup(dom_beg, dom_end - dom_beg); - }else{ - if(addr->local_part[0] == 0) - addr->domain = g_strdup(""); /* 'NULL' address (failure notice), - "" makes sure it will not be qualified with a hostname */ - else - addr->domain = NULL; - } + if (dom_beg != NULL) { + addr->domain = g_strndup(dom_beg, dom_end - dom_beg); + } else { + if (addr->local_part[0] == 0) + addr->domain = g_strdup(""); /* 'NULL' address (failure notice), "" makes sure it will not be qualified with a hostname */ + else + addr->domain = NULL; + } - if(end != NULL) - *end = p; + if (end != NULL) + *end = p; #ifndef PARSE_TEST - addr_unmark_delivered(addr); + addr_unmark_delivered(addr); #endif - return addr; - } - return NULL; + return addr; + } + return NULL; +} + +address* +create_address_rfc822(gchar * string, gchar ** end) +{ + return _create_address(string, end, FALSE); } -address *create_address_rfc822(gchar *string, gchar **end){ - return _create_address(string, end, FALSE); -} - -address *create_address_rfc821(gchar *string, gchar **end){ - return _create_address(string, end, TRUE); +address* +create_address_rfc821(gchar * string, gchar ** end) +{ + return _create_address(string, end, TRUE); } -GList *addr_list_append_rfc822(GList *addr_list, gchar *string, gchar *domain) +GList* +addr_list_append_rfc822(GList * addr_list, gchar * string, gchar * domain) { - gchar *p = string; - gchar *end; + gchar *p = string; + gchar *end; - while(*p){ - address *addr = _create_address(p, &end, FALSE); - if(addr){ - if(domain) - if(addr->domain == NULL) - addr->domain = g_strdup(domain); + while (*p) { + address *addr = _create_address(p, &end, FALSE); + if (addr) { + if (domain) + if (addr->domain == NULL) + addr->domain = g_strdup(domain); - addr_list = g_list_append(addr_list, addr); - p = end; - }else - break; - while(*p == ',' || isspace(*p)) p++; - } - return addr_list; + addr_list = g_list_append(addr_list, addr); + p = end; + } else + break; + while (*p == ',' || isspace(*p)) + p++; + } + return addr_list; }