/** * Implements the CFML Function listdeleteat */ package railo.runtime.functions.list; import railo.runtime.PageContext; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.FunctionException; import railo.runtime.ext.function.Function; public final class ListDeleteAt implements Function { private static char[] DEFAULT_DELIMITER=new char[]{','}; public static String call(PageContext pc , String list, double posNumber) throws ExpressionException { return _call(pc,list,(int)posNumber,DEFAULT_DELIMITER,false); } public static String call(PageContext pc, String list, double posNumber, String del) throws ExpressionException { return _call(pc, list, (int)posNumber, del.toCharArray(),false); } public static String call(PageContext pc, String list, double posNumber, String del, boolean includeEmptyFields) throws ExpressionException { return _call(pc, list, (int)posNumber, del.toCharArray(),includeEmptyFields); } public static String _call(PageContext pc, String list, int pos, char[] del, boolean includeEmptyFields) throws ExpressionException { StringBuilder sb = new StringBuilder(); int len=list.length(); int index=0; char last=0,c; if(pos<1) throw new FunctionException(pc,"ListDeleteAt",2,"index","index must be greater than 0"); pos--; int i=0; // ignore all delimiter at start if(!includeEmptyFields)for(;i<len;i++){ c=list.charAt(i); if(!equal(del,c)) break; sb.append(c); } // before for(;i<len;i++){ c=list.charAt(i); if(index==pos && !equal(del,c)) break; if(equal(del,c)) { if(includeEmptyFields || !equal(del,last)) index++; } sb.append(c); last=c; } // suppress item for(;i<len;i++){ if(equal(del,list.charAt(i))) break; } // ignore following delimiter for(;i<len;i++){ if(!equal(del,list.charAt(i))) break; } if(i==len){ while(sb.length()>0 && equal(del,sb.charAt(sb.length()-1))) { sb.delete(sb.length()-1, sb.length()); } if(pos>index) throw new FunctionException(pc,"ListDeleteAt",2,"index","index must be a integer between 1 and "+index); return sb.toString(); } // fill the rest for(;i<len;i++){ sb.append(list.charAt(i)); } return sb.toString(); } private static boolean equal(char[] del, char c) { for(int i=0;i<del.length;i++){ if(del[i]==c) return true; } return false; } }