132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
/*  $Id$
 | 
						|
 | 
						|
    Part of SWI-Prolog
 | 
						|
 | 
						|
    Author:        Jan Wielemaker
 | 
						|
    E-mail:        wielemak@science.uva.nl
 | 
						|
    WWW:           http://www.swi-prolog.org
 | 
						|
    Copyright (C): 1985-2006, University of Amsterdam
 | 
						|
 | 
						|
    This program 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.
 | 
						|
 | 
						|
    This program 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 this library; if not, write to the Free Software
 | 
						|
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
 | 
						|
    As a special exception, if you link this library with other files,
 | 
						|
    compiled with a Free Software compiler, to produce an executable, this
 | 
						|
    library does not by itself cause the resulting executable to be covered
 | 
						|
    by the GNU General Public License. This exception does not however
 | 
						|
    invalidate any other reasons why the executable file might be covered by
 | 
						|
    the GNU General Public License.
 | 
						|
*/
 | 
						|
 | 
						|
:- module(turtle_unicode,
 | 
						|
	  [ mkclassify/1,
 | 
						|
	    run/0
 | 
						|
	  ]).
 | 
						|
 | 
						|
run :-
 | 
						|
	mkclassify('turtle_chars.c', 'static ').
 | 
						|
 | 
						|
%%	mkclassify(+File)
 | 
						|
%
 | 
						|
%	Generate the core of xml_unicode.c.
 | 
						|
 | 
						|
mkclassify(File) :-
 | 
						|
	mkclassify(File, '').
 | 
						|
 | 
						|
mkclassify(File, Decl) :-
 | 
						|
	tell(File),
 | 
						|
	call_cleanup(forall(list(List, _),
 | 
						|
			    mkfunc(List, Decl)),
 | 
						|
		     told).
 | 
						|
 | 
						|
mkfunc(Name, Decl) :-
 | 
						|
	format('~wint~n', [Decl]),
 | 
						|
	format('wcis_~w(int c)~n', [Name]),
 | 
						|
	format('{ '),
 | 
						|
	list(Name, List),
 | 
						|
	mkswitch(List),
 | 
						|
	format('}~n~n').
 | 
						|
 | 
						|
mkswitch(List) :-
 | 
						|
	mkswitch(List, 2).
 | 
						|
 | 
						|
mkswitch([Low-High], Indent) :- !,
 | 
						|
	indent(Indent),
 | 
						|
	format('return (c >= 0x~|~`0t~16r~4+ && c <= 0x~|~`0t~16r~4+);~n', [Low, High]).
 | 
						|
mkswitch([Value], Indent) :- !,
 | 
						|
	indent(Indent),
 | 
						|
	format('return (c == 0x~|~`0t~16r~4+);', [Value]).
 | 
						|
mkswitch(List, Indent) :-
 | 
						|
	split(List, Low, High),
 | 
						|
	end(Low, MaxLow),
 | 
						|
	indent(Indent),
 | 
						|
	NextIndent is Indent + 2,
 | 
						|
	format('if ( c <= 0x~|~`0t~16r~4+ )~n', [MaxLow]),
 | 
						|
	indent(Indent),
 | 
						|
	format('{ '),
 | 
						|
	mkswitch(Low, NextIndent),
 | 
						|
	indent(Indent),
 | 
						|
	format('} else~n'),
 | 
						|
	indent(Indent),
 | 
						|
	format('{ '),
 | 
						|
	mkswitch(High, NextIndent),
 | 
						|
	indent(Indent),
 | 
						|
	format('}~n').
 | 
						|
 | 
						|
end(List, Max) :-
 | 
						|
	last(List, Last),
 | 
						|
	(   Last = _-Max
 | 
						|
	->  true
 | 
						|
	;   Max = Last
 | 
						|
	).
 | 
						|
 | 
						|
split(List, Low, High) :-
 | 
						|
	length(List, Len),
 | 
						|
	Mid is Len//2,
 | 
						|
	length(Low, Mid),
 | 
						|
	append(Low, High, List).
 | 
						|
 | 
						|
indent(N) :-
 | 
						|
	line_position(current_output, Pos),
 | 
						|
	Spaces is N - Pos,
 | 
						|
	format('~*c', [Spaces, 32]).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
list(name_start_char,
 | 
						|
     [ 0'A-0'Z,
 | 
						|
       0'_,
 | 
						|
       0'a-0'z,
 | 
						|
       0x00C0-0x00D6,
 | 
						|
       0x00D8-0x00F6,
 | 
						|
       0x00F8-0x02FF,
 | 
						|
       0x0370-0x037D,
 | 
						|
       0x037F-0x1FFF,
 | 
						|
       0x200C-0x200D,
 | 
						|
       0x2070-0x218F,
 | 
						|
       0x2C00-0x2FEF,
 | 
						|
       0x3001-0xD7FF,
 | 
						|
       0xF900-0xFDCF,
 | 
						|
       0xFDF0-0xFFFD,
 | 
						|
       0x10000-0xEFFFF
 | 
						|
     ]).
 | 
						|
 | 
						|
list(name_extender_char,
 | 
						|
     [ 0'-,
 | 
						|
       0'0-0'9,
 | 
						|
       0x00B7,
 | 
						|
       0x0300-0x036F,
 | 
						|
       0x203F-0x2040
 | 
						|
     ]).
 |