git @ Cat's Eye Technologies OpenZz / master src / zlex.h
master

Tree @master (Download .tar.gz)

zlex.h @masterraw · history · blame

/* 
    Zz Dynamic Parser Library
    Copyright (C) 1989 - I.N.F.N - S.Cabasino, P.S.Paolucci, G.M.Todesco

    The Zz Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    The Zz Library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#ifndef __ZLEX_H__
#define __ZLEX_H__

// forward declaration...
//struct s_content;

#include "zz.h"

typedef struct s_content *(*s_tag_cast_fun)(struct s_content* src, struct s_tag* tgt_type_tag, struct s_content* tgt);

struct s_tag {
  char *name;
  int (*sprint)(char *, struct s_content *);
  int (*fprint)(FILE *, struct s_content *);
  int (*copy)(struct s_content *tgt, struct s_content *src);
  int (*len)(struct s_content *);
  int (*delete)(struct s_content *);
  int (*param_on)(struct s_content *, const char*);
  int (*param_off)(struct s_content *, const char*);
  s_tag_cast_fun cast;
};

#ifdef ZLEX
int init_zlex_done=0;
#else
extern int init_zlex_done;
#endif

void init_zlex(void);
#define INIT_ZLEX {if(!init_zlex_done)init_zlex();}


#ifdef ZLEX
struct s_tag 
#else
extern struct s_tag 
#endif

/* source tokens */
 *tag_t,
 *tag_int,		/* numero intero (decimale)	*/
 *tag_hex,	        /* numero intero (esadecimale)	*/
 *tag_float, 		/* numero float			*/
 *tag_double, 		/* numero double		*/
 *tag_int64, 		/* 64bit integer number		*/
 *tag_qstring,		/* stringa fra virgolette	*/
 *tag_ident,		/* identificatore		*/
 *tag_eol,		/* fine linea			*/
 *tag_eof,		/* fine file			*/ 
 *tag_char,		/* carattere singolo diverso da 
	 			["0-9A-Za-AEOLEOF] 	*/

/* private tokens */

 *tag_none,		/* token vuoto  		*/	
 *tag_address,		/* puntatore generico 		*/
 *tag_procedure,	/* puntatore a funzione		*/
 *tag_qprocedure,	/* puntatore a funzione	(quoted)*/
 *tag_list,		/* lista			*/


/* zz-specific tokens */

 *tag_cont,		/* '...'			*/
 *tag_special,		/* codice per match-ident ecc.	*/
 *tag_sint,		/* non-terminale		*/
 *tag_param,		/* parametro			*/
 *tag_bead		/* bead				*/
 
;

/*-----------------------------------------------------------------------------*/

struct s_content 
{
  struct s_tag *tag; 
  //long value;
  union {
    long      lvalue;
    int32_t   ivalue;
    float     fvalue;
    void*     pvalue;
    char*     svalue;
    int64_t   llvalue;
    double    dvalue;
  } val;
};

#define s_content_lvalue(S)  ((S).val.lvalue)
#define s_content_ivalue(S)  ((S).val.ivalue)
#define s_content_fvalue(S)  ((S).val.fvalue)
#define s_content_pvalue(S)  ((S).val.pvalue)
#define s_content_svalue(S)  ((S).val.svalue)
#define s_content_llvalue(S) ((S).val.llvalue)
#define s_content_dvalue(S)  ((S).val.dvalue)

/* for compatibility */
#define s_content_value(S)   s_content_ivalue(S)

/* access to object "class" */
#define s_content_tag(S)     ((S).tag)

/*-----------------------------------------------------------------------------*/

char *zlex_strsave(const char *name);
//char *content_image();
void zlex(char **ptr, struct s_content *cnt);
int zlex_set_case_sensitive(int boolean);
int zlex_set_parse_eol(int boolean);
int zlex_set_default_real_as_double(int boolean);
int zlex_set_default_integer_as_int64(int boolean);

struct s_tag *find_tag(const char *name);

/*-----------------------------------------------------------------------------*/

#endif /*__ZLEX_H__*/