244 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Erlang
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Erlang
		
	
	
	
	
	
%% 
 | 
						|
%% %CopyrightBegin%
 | 
						|
%% 
 | 
						|
%% Copyright Ericsson AB 2004-2024. All Rights Reserved.
 | 
						|
%% 
 | 
						|
%% Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
%% you may not use this file except in compliance with the License.
 | 
						|
%% You may obtain a copy of the License at
 | 
						|
%%
 | 
						|
%%     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
%%
 | 
						|
%% Unless required by applicable law or agreed to in writing, software
 | 
						|
%% distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
%% See the License for the specific language governing permissions and
 | 
						|
%% limitations under the License.
 | 
						|
%% 
 | 
						|
%% %CopyrightEnd%
 | 
						|
%%
 | 
						|
%% Contributor(s):
 | 
						|
%%    Michael.Remond: suggested #xmlDocument{}
 | 
						|
%%
 | 
						|
%%----------------------------------------------------------------------
 | 
						|
%% #0.    BASIC INFORMATION
 | 
						|
%%----------------------------------------------------------------------
 | 
						|
%% File:       xmerl.hrl
 | 
						|
%% Author       : Ulf Wiger
 | 
						|
%% Date         : 00-09-22
 | 
						|
%% Description  : Record and macro definitions for xmerl
 | 
						|
%%----------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%% records generated by the scanner
 | 
						|
%% --------------------------------
 | 
						|
 | 
						|
%% XML declaration
 | 
						|
-record(xmlDecl,{
 | 
						|
	  vsn,        % string() XML version
 | 
						|
	  encoding,   % string() Character encoding 
 | 
						|
	  standalone, % (yes | no)
 | 
						|
	  attributes  % [#xmlAttribute()] Other attributes than above
 | 
						|
	 }).
 | 
						|
 | 
						|
%% Attribute
 | 
						|
-record(xmlAttribute,{
 | 
						|
	  name,		   % atom()
 | 
						|
	  expanded_name=[],% atom() | {string(),atom()}
 | 
						|
	  nsinfo = [],	   % {Prefix, Local} | []
 | 
						|
	  namespace = [],  % inherits the element's namespace
 | 
						|
	  parents = [],	   % [{atom(),integer()}]
 | 
						|
	  pos,		   % integer()
 | 
						|
	  language = [],   % inherits the element's language
 | 
						|
	  value,	   % IOlist() | atom() | integer()
 | 
						|
	  normalized       % atom() one of (true | false)
 | 
						|
	 }).
 | 
						|
 | 
						|
%% namespace record
 | 
						|
-record(xmlNamespace,{
 | 
						|
	  default = [],
 | 
						|
	  nodes = []
 | 
						|
	 }).
 | 
						|
 | 
						|
%% namespace node - i.e. a {Prefix, URI} pair
 | 
						|
-record(xmlNsNode,{
 | 
						|
	  parents = [],	% [{atom(),integer()}]
 | 
						|
	  pos,		% integer()
 | 
						|
	  prefix,	% string()
 | 
						|
	  uri = []	% [] | atom()
 | 
						|
	 }).
 | 
						|
 | 
						|
%% XML Element
 | 
						|
%% content = [#xmlElement()|#xmlText()|#xmlPI()|#xmlComment()|#xmlDecl()]
 | 
						|
-record(xmlElement,{
 | 
						|
	  name,			% atom()
 | 
						|
	  expanded_name = [],	% string() | {URI,Local} | {"xmlns",Local}
 | 
						|
	  nsinfo = [],	        % {Prefix, Local} | []
 | 
						|
	  namespace=#xmlNamespace{},
 | 
						|
	  parents = [],		% [{atom(),integer()}]
 | 
						|
	  pos,			% integer()
 | 
						|
	  attributes = [],	% [#xmlAttribute()]
 | 
						|
	  content = [],
 | 
						|
	  language = "",	% string()
 | 
						|
	  xmlbase="",           % string() XML Base path, for relative URI:s
 | 
						|
	  elementdef=undeclared % atom(), one of [undeclared | prolog | external | element]
 | 
						|
	 }).
 | 
						|
 | 
						|
%% plain text
 | 
						|
%% IOlist = [char() | binary () | IOlist]
 | 
						|
-record(xmlText,{
 | 
						|
	  parents = [],	% [{atom(),integer()}]
 | 
						|
	  pos,		% integer()
 | 
						|
	  language = [],% inherits the element's language
 | 
						|
	  value,	% IOlist()
 | 
						|
	  type = text   % atom() one of (text|cdata)
 | 
						|
	 }).
 | 
						|
 | 
						|
%% plain text
 | 
						|
-record(xmlComment,{
 | 
						|
	  parents = [],  % [{atom(),integer()}]
 | 
						|
	  pos,	         % integer()
 | 
						|
	  language = [], % inherits the element's language
 | 
						|
	  value	         % IOlist()
 | 
						|
	 }).
 | 
						|
 | 
						|
%% processing instruction
 | 
						|
-record(xmlPI,{
 | 
						|
	  name,		% atom()
 | 
						|
	  parents = [],	% [{atom(),integer()}]
 | 
						|
	  pos,		% integer()
 | 
						|
	  value		% IOlist()
 | 
						|
	 }).
 | 
						|
 | 
						|
-record(xmlDocument,{
 | 
						|
	  content
 | 
						|
	 }).
 | 
						|
 | 
						|
 | 
						|
%% XPATH (xmerl_xpath, xmerl_pred_funcs) records
 | 
						|
 | 
						|
-record(xmlContext, {
 | 
						|
		     axis_type = forward,
 | 
						|
		     context_node,
 | 
						|
		     context_position = 1,
 | 
						|
		     nodeset = [],
 | 
						|
		     bindings = [],
 | 
						|
		     functions = [],
 | 
						|
		     namespace = [],
 | 
						|
		     whole_document
 | 
						|
		    }).
 | 
						|
 | 
						|
-record(xmlNode, {
 | 
						|
		  type = element,
 | 
						|
		  node,
 | 
						|
		  parents = [],
 | 
						|
		  pos = 1
 | 
						|
		 }).
 | 
						|
 | 
						|
-record(xmlObj, {
 | 
						|
		 type,
 | 
						|
		 value
 | 
						|
		 }).
 | 
						|
 | 
						|
-record(xmerl_fun_states, {event,
 | 
						|
			   hook,
 | 
						|
			   rules,
 | 
						|
			   fetch,
 | 
						|
			   cont}).
 | 
						|
 | 
						|
 | 
						|
%% scanner state record
 | 
						|
-record(xmerl_scanner,{
 | 
						|
	  encoding=undefined, % undefined | string() Character set used, default is UTF-8
 | 
						|
	  standalone = no,
 | 
						|
%	  prolog =continue,
 | 
						|
	  environment = prolog,    % atom(), (prolog | element)
 | 
						|
	  declarations = [],	   % [{Name, Attrs}]
 | 
						|
	  doctype_name,
 | 
						|
	  doctype_DTD = internal, % internal | DTDId
 | 
						|
	  comments = true,
 | 
						|
	  document = false,
 | 
						|
	  default_attrs = false,
 | 
						|
	  rules,
 | 
						|
	  keep_rules = false,	% delete (ets) tab if false
 | 
						|
	  namespace_conformant = false, % true | false
 | 
						|
	  xmlbase,          % string() Current Base path, for relative URI:s
 | 
						|
	  xmlbase_cache,    % string() Cached Base path
 | 
						|
	  fetch_path=[], % [string()] List with additional, user
 | 
						|
                         % defined, paths
 | 
						|
	  filename=file_name_unknown,
 | 
						|
	  validation = off, %% off (default) | dtd | schema (true, false are obsolete)
 | 
						|
	  schemaLocation = [],
 | 
						|
	  space = preserve,
 | 
						|
	  event_fun,
 | 
						|
	  hook_fun,
 | 
						|
	  acc_fun,
 | 
						|
	  fetch_fun,
 | 
						|
	  close_fun,
 | 
						|
	  continuation_fun,
 | 
						|
	  rules_read_fun,
 | 
						|
	  rules_write_fun,
 | 
						|
	  rules_delete_fun,
 | 
						|
	  user_state,
 | 
						|
	  fun_states = #xmerl_fun_states{},
 | 
						|
	  entity_references=[],
 | 
						|
	  text_decl=false,
 | 
						|
	  quiet=false,   % bool() Set to true will print no error messages
 | 
						|
	  col = 1,
 | 
						|
	  line = 1,
 | 
						|
          common_data = [],
 | 
						|
          allow_entities = false % If true entities are allowed in the document
 | 
						|
	 }).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%% scanner events
 | 
						|
 | 
						|
%% event : start | end
 | 
						|
-record(xmerl_event, {
 | 
						|
		      event,
 | 
						|
		      line,
 | 
						|
		      col,
 | 
						|
		      pos,
 | 
						|
		      data
 | 
						|
		     }).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
%% useful scanner macros
 | 
						|
%% ---------------------
 | 
						|
 | 
						|
-define(space, 32).
 | 
						|
-define(cr,    13).
 | 
						|
-define(lf,    10).
 | 
						|
-define(tab,   9).
 | 
						|
%% whitespace consists of 'space', 'carriage return', 'line feed' or 'tab'
 | 
						|
-define(whitespace(H), H==?space ; H==?cr ; H==?lf ; H==?tab).
 | 
						|
 | 
						|
%% non-caharacters according to Unicode: 16#ffff and 16#fffe
 | 
						|
-define(non_character(H1,H2), H1==16#ff,H2==16#fe;H1==16#ff,H2==16#ff).
 | 
						|
 | 
						|
-define(non_ascii(H), list(H),hd(H)>=128;integer(H),H>=128).
 | 
						|
 | 
						|
-define(strip1,  {_, T1,  S1}  = strip(T,  S)).
 | 
						|
-define(strip2,  {_, T2,  S2}  = strip(T1, S1)).
 | 
						|
-define(strip3,  {_, T3,  S3}  = strip(T2, S2)).
 | 
						|
-define(strip4,  {_, T4,  S4}  = strip(T3, S3)).
 | 
						|
-define(strip5,  {_, T5,  S5}  = strip(T4, S4)).
 | 
						|
-define(strip6,  {_, T6,  S6}  = strip(T5, S5)).
 | 
						|
-define(strip7,  {_, T7,  S7}  = strip(T6, S6)).
 | 
						|
-define(strip8,  {_, T8,  S8}  = strip(T7, S7)).
 | 
						|
-define(strip9,  {_, T9,  S9}  = strip(T8, S8)).
 | 
						|
-define(strip10, {_, T10, S10} = strip(T9, S9)).
 | 
						|
 | 
						|
-define(condstrip1,  {_, T1,  S1}  = condstrip(T, S, false)).
 | 
						|
-define(condstrip2,  {_, T2,  S2}  = condstrip(T1,S1,false)).
 | 
						|
-define(condstrip3,  {_, T3,  S3}  = condstrip(T2,S2,false)).
 | 
						|
-define(condstrip4,  {_, T4,  S4}  = condstrip(T3,S3,false)).
 | 
						|
 | 
						|
-define(bump_col(N), 
 | 
						|
	?dbg("bump_col(~p), US = ~p~n", [N, S0#xmerl_scanner.user_state]),
 | 
						|
	S = S0#xmerl_scanner{col = S0#xmerl_scanner.col + N}).
 |