/* translation of file "gutil.k" */
/* generated by:
 *  @(#)$Author$
 */
#ifndef KC_FUNCTIONS_gutil_HEADER
#define KC_FUNCTIONS_gutil_HEADER
#include "k.h"    /* in case a user forgets */

namespace kc { }
using namespace kc;
/* included stuff */
//
// The Termprocessor Kimwitu++
//
// Copyright (C) 1991 University of Twente, Dept TIOS.
// Copyright (C) 1998-2003 Humboldt-University of Berlin, Institute of Informatics
// All rights reserved.
//
// Kimwitu++ is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Kimwitu++ is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Kimwitu++; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

extern phylumdeclaration The_abstract_phylum_decl;
extern phylumdeclaration The_abstract_phylum_ref_decl;
extern phylumdeclaration The_abstract_list_decl;

/* end included stuff */


namespace kc {
bool f_something_to_initialize (Ccode_option cco);
bool f_something_to_initialize (alternative a);
bool f_NilCtexts (Ctexts c);
bool f_constructors_in_operatordecl (alternative op);
bool f_constructors_in_phylumdecl (phylumdeclaration ph);
bool f_destructors_in_operatordecl (alternative op);
bool f_destructors_in_phylumdecl (phylumdeclaration ph);
bool f_no_params (ac_parameter_type_list p);
bool f_post_create_in_operatordecl (alternative op);
bool f_post_create_in_phylumdecl (phylumdeclaration ph);
bool f_rewrite_in_phylumdecl (phylumdeclaration ph);
bool f_rewrite_in_operatordecl (alternative op);
ID f_phylumofwithcasesinfo (withcasesinfo wcso);
ID f_phylumofpatternrepresentation (patternrepresentation a_patrep);
ac_parameter_type_list sort_extend_parameter_type_list (ac_declaration_list C_vardecls, ac_declarator decl);
ac_parameter_list t_sort_extend_parameter_list (ac_declaration_list C_vardecls, ac_identifier_list fn_args, ac_parameter_list temp);
void unparse (const char *s, printer_functor printer_fn, uview v);
ID f_mkselvar (const char *prefix, int level);
ID f_mkselvar2 (const char *prefix, int level, int branch);
char *f_mk_filename (casestring a_casestring, const char *suffix);
char *f_mk_filename (casestring a_casestring, const string &suffix);
char *f_make_identifier_basename (const char *fn);
rewriterulesinfo f_rewriterulesinfoofalternativeinview (alternative a_alternative, ID a_view);
rewriteviewsinfo f_rewriteviewsinfo_of_alternative (alternative a_alternative, viewnames a_views);
unparseviewsinfo f_unparseviewsinfo_of_alternative (alternative a_alternative, viewnames a_views);
ID f_typeof (path a_path);
ID f_operatorofpatternrepresentation (patternrepresentation a_patternrepresentation);
ID f_typeofunpsubterm (unpsubterm a_unpsubterm, ID a_operator);
elem_patternrepresentation f_outmost_nl_preds_in_rewriterulesinfo (rewriterulesinfo ri);
elem_patternrepresentation f_outmost_nl_preds_in_unparsedeclsinfo (unparsedeclsinfo ri);
bool f_is_known_ptr_type (ID id);
withcasesinfo rewrite_withcasesinfo (withcasesinfo a_withcasesinfo);
int pos_of_sole_dollar_or_pattern_in_patternchain (patternchain a_patternchain);
int t_pos_of_sole_dollar_or_pattern_in_patternchain (patternchain a_patternchain, int tmp_result, int pos);
string f_getidentfromstring (const char **c);

} // namespace kc

#endif // !  KC_FUNCTIONS_gutil_HEADER

