// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3) fieldsfirst lnc
// Source File Name: Mode.java
package com.icl.saxon;
import com.icl.saxon.expr.XPathException;
import com.icl.saxon.om.Navigator;
import com.icl.saxon.om.NodeInfo;
import com.icl.saxon.pattern.NoNodeTest;
import com.icl.saxon.pattern.Pattern;
import javax.xml.transform.TransformerException;
// Referenced classes of package com.icl.saxon:
// Context, Controller
public class Mode
{
private static class Rule
{
public Pattern pattern;
public Object object;
public int precedence;
public double priority;
public int sequence;
public Rule next;
public Rule(Pattern pattern1, Object obj, int i, double d, int j)
{
/* 324*/ pattern = pattern1;
/* 325*/ object = obj;
/* 326*/ precedence = i;
/* 327*/ priority = d;
/* 328*/ sequence = j;
/* 329*/ next = null;
}
}
private Rule ruleDict[];
private int nameCode;
private int sequence;
public Mode()
{
/* 18*/ ruleDict = new Rule[114];
/* 19*/ nameCode = -1;
/* 20*/ sequence = 0;
}
public void setNameCode(int i)
{
/* 34*/ nameCode = i;
}
public int getNameCode()
{
/* 42*/ return nameCode;
}
public void addRule(Pattern pattern, Object obj, int i, double d)
{
/* 60*/ if(pattern instanceof NoNodeTest)
/* 61*/ return;
/* 69*/ int j = pattern.getFingerprint();
/* 70*/ short word0 = pattern.getNodeType();
/* 72*/ int k = getList(j, word0);
/* 75*/ Rule rule = new Rule(pattern, obj, i, d, sequence++);
/* 77*/ Rule rule1 = ruleDict[k];
/* 78*/ if(rule1 == null)
{
/* 79*/ ruleDict[k] = rule;
/* 80*/ return;
}
/* 85*/ Rule rule2 = null;
/* 87*/ for(; rule1 != null; rule1 = rule1.next)
{
/* 87*/ if(rule1.precedence < i || rule1.precedence == i && rule1.priority <= d)
{
/* 89*/ rule.next = rule1;
/* 90*/ if(rule2 == null)
/* 91*/ ruleDict[k] = rule;
/* 93*/ else
/* 93*/ rule2.next = rule;
/* 95*/ break;
}
/* 97*/ rule2 = rule1;
}
/* 101*/ if(rule1 == null)
{
/* 102*/ rule2.next = rule;
/* 103*/ rule.next = null;
}
}
public int getList(int i, int j)
{
/* 113*/ if(j == 1)
{
/* 114*/ if(i == -1)
/* 115*/ return 0;
/* 117*/ else
/* 117*/ return 13 + i % 101;
} else
{
/* 121*/ return j;
}
}
public Object getRule(NodeInfo nodeinfo, Context context)
throws TransformerException
{
/* 133*/ int i = nodeinfo.getFingerprint();
/* 134*/ short word0 = nodeinfo.getNodeType();
/* 135*/ int j = getList(i, word0);
/* 136*/ int k = context.getController().getRecoveryPolicy();
/* 138*/ Rule rule = null;
/* 139*/ Rule rule1 = null;
/* 140*/ int l = -1;
/* 141*/ double d = (-1.0D / 0.0D);
/* 147*/ if(j != 0)
{
/* 148*/ for(Rule rule2 = ruleDict[j]; rule2 != null; rule2 = rule2.next)
{
/* 152*/ if(rule != null && (rule2.precedence < l || rule2.precedence == l && rule2.priority < d))
/* 155*/ break;
/* 159*/ if(!rule2.pattern.matches(nodeinfo, context))
/* 163*/ continue;
/* 163*/ if(rule != null)
{
/* 164*/ if(rule2.precedence == l && rule2.priority == d)
/* 165*/ reportAmbiguity(nodeinfo, rule.pattern, rule2.pattern, context);
/* 165*/ break;
}
/* 169*/ rule = rule2;
/* 170*/ l = rule2.precedence;
/* 171*/ d = rule2.priority;
/* 172*/ if(k == 0)
/* 173*/ break;
}
}
/* 182*/ for(Rule rule3 = ruleDict[0]; rule3 != null; rule3 = rule3.next)
{
/* 184*/ if(rule3.precedence < l || rule3.precedence == l && rule3.priority < d)
/* 186*/ break;
/* 188*/ if(!rule3.pattern.matches(nodeinfo, context))
/* 190*/ continue;
/* 190*/ if(rule1 != null)
{
/* 191*/ if(rule3.precedence == rule1.precedence && rule3.priority == rule1.priority)
/* 192*/ reportAmbiguity(nodeinfo, rule3.pattern, rule1.pattern, context);
/* 192*/ break;
}
/* 196*/ rule1 = rule3;
/* 197*/ if(k == 0)
/* 198*/ break;
}
/* 205*/ if(rule != null && rule1 == null)
/* 206*/ return rule.object;
/* 207*/ if(rule == null && rule1 != null)
/* 208*/ return rule1.object;
/* 209*/ if(rule != null && rule1 != null)
{
/* 210*/ if(rule.precedence == rule1.precedence && rule.priority == rule1.priority)
{
/* 216*/ Object obj = rule.sequence <= rule1.sequence ? rule1.object : rule.object;
/* 220*/ if(k != 0)
/* 221*/ reportAmbiguity(nodeinfo, rule.pattern, rule1.pattern, context);
/* 223*/ return obj;
}
/* 225*/ if(rule.precedence > rule1.precedence || rule.precedence == rule1.precedence && rule.priority >= rule1.priority)
/* 228*/ return rule.object;
/* 230*/ else
/* 230*/ return rule1.object;
} else
{
/* 233*/ return null;
}
}
public Object getRule(NodeInfo nodeinfo, int i, int j, Context context)
throws XPathException
{
/* 244*/ int k = nodeinfo.getFingerprint();
/* 245*/ short word0 = nodeinfo.getNodeType();
/* 246*/ int l = getList(k, word0);
/* 248*/ Rule rule = null;
/* 249*/ Rule rule1 = null;
/* 253*/ if(l != 0)
{
/* 254*/ for(Rule rule2 = ruleDict[l]; rule2 != null; rule2 = rule2.next)
{
/* 256*/ if(rule2.precedence < i || rule2.precedence > j || !rule2.pattern.matches(nodeinfo, context))
/* 258*/ continue;
/* 258*/ rule = rule2;
/* 259*/ break;
}
}
/* 267*/ for(Rule rule3 = ruleDict[0]; rule3 != null; rule3 = rule3.next)
{
/* 269*/ if(rule3.precedence < i || rule3.precedence > j || !rule3.pattern.matches(nodeinfo, context))
/* 270*/ continue;
/* 270*/ rule1 = rule3;
/* 271*/ break;
}
/* 275*/ if(rule != null && rule1 == null)
/* 276*/ return rule.object;
/* 277*/ if(rule == null && rule1 != null)
/* 278*/ return rule1.object;
/* 279*/ if(rule != null && rule1 != null)
{
/* 280*/ if(rule.precedence > rule1.precedence || rule.precedence == rule1.precedence && rule.priority >= rule1.priority)
/* 283*/ return rule.object;
/* 285*/ else
/* 285*/ return rule1.object;
} else
{
/* 288*/ return null;
}
}
private void reportAmbiguity(NodeInfo nodeinfo, Pattern pattern, Pattern pattern1, Context context)
throws TransformerException
{
/* 300*/ if(pattern.getStaticContext() == pattern1.getStaticContext())
{
/* 301*/ return;
} else
{
/* 303*/ context.getController().reportRecoverableError("Ambiguous rule match for " + Navigator.getPath(nodeinfo) + "\n" + "Matches both \"" + pattern + "\" on line " + pattern.getLineNumber() + " of " + pattern.getSystemId() + "\nand \"" + pattern1 + "\" on line " + pattern1.getLineNumber() + " of " + pattern1.getSystemId(), null);
/* 308*/ return;
}
}
}