/* translation of file "occur.k" */
/* generated by:
 *  @(#)$Author$
 */
#ifndef KC_FUNCTIONS_occur_HEADER
#define KC_FUNCTIONS_occur_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
//

/* end included stuff */


namespace kc {
void v_defoccur (ID id, IDtype it);
void v_extendoccur (ID id, IDtype it);
void v_extendoccur_nowarning (ID id, IDtype it);
bool f_useoccuroperator (ID id);
bool f_warnifnotvariable (ID id);
bool f_useoccurphylum (ID id);
bool f_useoccurlistphylum (ID id);
bool f_useoccuruviewname (ID id);
bool f_useoccurrviewname (ID id);
bool f_useoccurstorageclass (ID id);
bool f_useoccurlanguagename (languagenames names);
bool f_useoccurpatternvariable (ID id);

} // namespace kc

#endif // !  KC_FUNCTIONS_occur_HEADER

