/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source 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. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Nam Nguyen */ package com.caucho.quercus.lib.gettext.expr; import com.caucho.quercus.env.StringValue; /** * Represents a gettext plural expression. */ public class PluralExpr { private PluralExprParser _parser; private Expr _npluralsExpr; private Expr _pluralExpr; private PluralExpr(CharSequence expr) { _parser = new PluralExprParser(expr); } private void init() { if (_parser != null) { _npluralsExpr = _parser.getNpluralsExpr(); _pluralExpr = _parser.getPluralExpr(); _parser = null; } } /** * Returns a PluralExpr from the metadata. * * @param metadata contains the plural expression * @return PluralExpr */ public static PluralExpr getPluralExpr(StringValue metaData) { String pluralForms = "Plural-Forms:"; int i = metaData.indexOf(pluralForms); if (i < 0) return new PluralExpr("nplurals=2; plural=n!=1"); i += pluralForms.length(); int j = metaData.indexOf('\n', i); if (j < 0) return new PluralExpr(metaData.substring(i)); else return new PluralExpr(metaData.substring(i, j)); } /** * Returns evaluated plural expression * * @param expr * @param quantity number of items */ public static int eval(CharSequence expr, int quantity) { return new PluralExpr(expr).eval(quantity); } /** * Evaluates this plural expression. */ public int eval(int quantity) { init(); return validate(quantity); } /** * Returns a valid plural form index. */ private int validate(int quantity) { int pluralForm; int numOfPlurals; if (_pluralExpr == null) pluralForm = -1; else pluralForm = _pluralExpr.eval(quantity); if (_npluralsExpr == null) numOfPlurals = -1; else numOfPlurals = _npluralsExpr.eval(quantity); if (numOfPlurals < 1 || pluralForm < 0) { if (quantity == 1) return 0; else return 1; } // pluralForm is a 0-based index if (pluralForm >= numOfPlurals) return 0; return pluralForm; } }