package org.basex.util; import org.basex.io.IO; /** * Input information. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class InputInfo { /** Input query. */ private final String query; /** Parse position. */ private final int pos; /** Input file. */ public final IO file; /** Line and column number. */ private int[] lc; /** * Optimizes and compiles the expression. * @param p parsing position */ public InputInfo(final InputParser p) { query = p.query; pos = p.qp; file = p.file; } /** * Getter for line and column number. * @return two element array of line and column number */ public int[] lineCol() { if(lc == null) lc = lineCol(query, Math.min(pos - 1, query.length())); return lc; } /** * Calculates the column and line number of a given offset in the string. * @param qu query string * @param qp offset * @return two element array of line and column number */ public static int[] lineCol(final String qu, final int qp) { final int[] lc = {1, 1}; for(int i = 0, ch; i < qp; i += Character.charCount(ch)) { ch = qu.codePointAt(i); if(ch == '\n') { lc[0]++; lc[1] = 1; } else if(ch != '\r') { lc[1]++; } } return lc; } @Override public String toString() { final int[] p = lineCol(); return Util.info("InputInfo[Line %, Column %]", p[0], p[1]); } }