/*
 * conv.h --- header file for conv, the encoding module of websh3
 * nca-073-9
 * 
 * Copyright (c) 1996-2000 by Netcetera AG.
 * Copyright (c) 2001 by Apache Software Foundation.
 * All rights reserved.
 *
 * See the file "license.terms" for information on usage and
 * redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * @(#) $Id$
 * 
 */

#include <tcl.h>
#include "webutl.h"
#include "hashutl.h"

#ifndef CONV_H
#define CONV_H
/* --------------------------------------------------------------------------
 * Commands
 * ------------------------------------------------------------------------*/

/* ----------------------------------------------------------------------------
 * SubCommands 
 * ------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
 * Switches
 * Params
 * ------------------------------------------------------------------------- */
#define WEB_CONV_HTMLIFY_SWITCH_NUMERIC "-numeric"

/* --------------------------------------------------------------------------
 * Registered Data (SetAssocData) 
 * ------------------------------------------------------------------------*/
#define WEB_CONV_ASSOC_DATA "web::conv"

/* --------------------------------------------------------------------------
 * Internas
 * ------------------------------------------------------------------------*/


#define WEBENC_LATIN_TABLE_LENGTH 256

/* ----------------------------------------------------------------------------
 * internal data
 * ------------------------------------------------------------------------- */
typedef struct ConvData
{
    int need[WEBENC_LATIN_TABLE_LENGTH];
    Tcl_Obj *ute[WEBENC_LATIN_TABLE_LENGTH];	/* ">" --> "gt" */
    Tcl_HashTable *etu;		/* "gt" --> ">" */
}
ConvData;
ConvData *createConvData();
void destroyConvData(ClientData clientData, Tcl_Interp * interp);

/* ----------------------------------------------------------------------------
 * Tcl interface
 * ------------------------------------------------------------------------- */
int conv_Init(Tcl_Interp * interp);

int Web_Htmlify(ClientData clientData,
		Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]);

int Web_UriEncode(ClientData clientData,
		  Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]);
int Web_UriDecode(ClientData clientData,
		  Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]);

int Web_DeHtmlify(ClientData clientData,
		  Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]);

void htmlifyAppendNum(Tcl_Obj * tclo, int num);

Tcl_Obj *webHtmlify(ConvData * convData, Tcl_Obj * in, int useNumeric);
int webDeHtmlify(ConvData * convData, Tcl_Obj * in, Tcl_Obj * out);

Tcl_Obj *uriEncode(Tcl_Obj * inString);
Tcl_Obj *uriDecode(Tcl_Obj * inString);


/* ----------------------------------------------------------------------------
 * prototypes
 * ------------------------------------------------------------------------- */
int removeHtmlComments(Tcl_Interp * interp, Tcl_Obj * in, Tcl_Obj * res);
int removeShortHtmlComments(Tcl_Obj * in, Tcl_Obj * res);
int removeHtmlTags(Tcl_Obj * in, Tcl_Obj * res);
int convertHtmlEntities(ConvData * convData, Tcl_Obj * in, Tcl_Obj * res);
Tcl_UniChar getNumericEntity(Tcl_UniChar ** str, int len);
int Web_Html_RemoveComments(ClientData clientData,
			    Tcl_Interp * interp,
			    int objc, Tcl_Obj * CONST objv[]);

#endif
