105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*  $Id$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Part of SWI-Prolog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Jan Wielemaker
							 | 
						||
| 
								 | 
							
								    E-mail:        jan@swi.psy.uva.nl
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 1985-2002, University of Amsterdam
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This 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
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include "dtd.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void
							 | 
						||
| 
								 | 
							
								char_range(dtd_charclass *map, int from, int to, int msk)
							 | 
						||
| 
								 | 
							
								{ unsigned char *ca;
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for(i=from, ca=map->class+i; i++<=to; )
							 | 
						||
| 
								 | 
							
								    *ca++ |= msk;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								dtd_charclass *
							 | 
						||
| 
								 | 
							
								new_charclass()
							 | 
						||
| 
								 | 
							
								{ dtd_charclass *map = sgml_calloc(1, sizeof(*map));
							 | 
						||
| 
								 | 
							
								  unsigned char *ca = map->class;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  char_range(map, 'a', 'z', CH_LCLETTER);
							 | 
						||
| 
								 | 
							
								  char_range(map, 'A', 'Z', CH_LCLETTER);
							 | 
						||
| 
								 | 
							
								  char_range(map, '0', '9', CH_DIGIT);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  ca['.'] |= CH_CNM;
							 | 
						||
| 
								 | 
							
								  ca['-'] |= CH_CNM;
							 | 
						||
| 
								 | 
							
								  ca[183] |= CH_CNM;			/* XML */
							 | 
						||
| 
								 | 
							
								  ca[':'] |= CH_CNMSTRT;		/* HTML and XML */
							 | 
						||
| 
								 | 
							
								  ca['_'] |= CH_CNMSTRT;		/* HTML and XML */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  char_range(map, 192, 214, CH_CNMSTRT); /* XML ISO-LATIN-1 accented chars */
							 | 
						||
| 
								 | 
							
								  char_range(map, 216, 246, CH_CNMSTRT);
							 | 
						||
| 
								 | 
							
								  char_range(map, 248, 255, CH_CNMSTRT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ca['\t'] |= CH_WHITE;
							 | 
						||
| 
								 | 
							
								  ca[' ']  |= CH_WHITE;
							 | 
						||
| 
								 | 
							
								  ca['\r'] |= CH_RE;
							 | 
						||
| 
								 | 
							
								  ca['\n'] |= CH_RS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return map;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								dtd_charfunc *
							 | 
						||
| 
								 | 
							
								new_charfunc()
							 | 
						||
| 
								 | 
							
								{ dtd_charfunc *f = sgml_calloc(1, sizeof(*f));
							 | 
						||
| 
								 | 
							
								  ichar *cf = f->func;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cf[CF_STAGO]	= '<';
							 | 
						||
| 
								 | 
							
								  cf[CF_STAGC]	= '>';
							 | 
						||
| 
								 | 
							
								  cf[CF_ETAGO1]	= '<';
							 | 
						||
| 
								 | 
							
								  cf[CF_ETAGO2]	= '/';
							 | 
						||
| 
								 | 
							
								  cf[CF_VI]	= '=';
							 | 
						||
| 
								 | 
							
								  cf[CF_NS]     = ':';
							 | 
						||
| 
								 | 
							
								  cf[CF_LIT]	= '"';
							 | 
						||
| 
								 | 
							
								  cf[CF_LITA]	= '\'';
							 | 
						||
| 
								 | 
							
								  cf[CF_PERO]	= '%';
							 | 
						||
| 
								 | 
							
								  cf[CF_ERO]	= '&';
							 | 
						||
| 
								 | 
							
								  cf[CF_ERC]	= ';';
							 | 
						||
| 
								 | 
							
								  cf[CF_MDO1]	= '<';
							 | 
						||
| 
								 | 
							
								  cf[CF_MDO2]	= '!';
							 | 
						||
| 
								 | 
							
								  cf[CF_MDC]	= '>';
							 | 
						||
| 
								 | 
							
								  cf[CF_PRO1]	= '<';
							 | 
						||
| 
								 | 
							
								  cf[CF_PRO2]	= '?';
							 | 
						||
| 
								 | 
							
								  cf[CF_PRC]	= '>';
							 | 
						||
| 
								 | 
							
								  cf[CF_GRPO]	= '(';
							 | 
						||
| 
								 | 
							
								  cf[CF_GRPC]	= ')';
							 | 
						||
| 
								 | 
							
								  cf[CF_SEQ]	= ',';
							 | 
						||
| 
								 | 
							
								  cf[CF_AND]	= '&';
							 | 
						||
| 
								 | 
							
								  cf[CF_OR]	= '|';
							 | 
						||
| 
								 | 
							
								  cf[CF_OPT]	= '?';
							 | 
						||
| 
								 | 
							
								  cf[CF_PLUS]	= '+';
							 | 
						||
| 
								 | 
							
								  cf[CF_DSO]	= '[';
							 | 
						||
| 
								 | 
							
								  cf[CF_DSC]	= ']';
							 | 
						||
| 
								 | 
							
								  cf[CF_REP]	= '*';
							 | 
						||
| 
								 | 
							
								  cf[CF_RS]	= '\n';
							 | 
						||
| 
								 | 
							
								  cf[CF_RE]	= '\r';
							 | 
						||
| 
								 | 
							
								  cf[CF_CMT]	= '-';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return f;
							 | 
						||
| 
								 | 
							
								}
							 |