void print_emails(estring fname) { estring file_contents = es_read_file(fname); estring grammar = es( "EMAIL = NAME '@' LOCATION || PREFIX '<' NAME '@' DOMAIN '>'" "*NAME = [CHARS - @]" "*DOMAIN = CHARS" "PREFIX = [CHARS - <]" ); egnode node = grammar_quick_parse(grammar, file_contents); ehash h = new_ehash(); while(node != NULL) { estring username = eslower(node->match); eg_next_node(node); estring domain = eslower(node->match); eg_next_node(node); h.setdefault(domain, new_earray()).append(username); } // Print it out for(ehash_iter(h);!ehash_iter_done(h);ehash_iter_next(h)){ printf("%s [",ehash_iter_key(h)); earray a = ehash_iter_val(h); earray_sort_in_place(a); for(int i = 0; i