JspUIPlugin.log("error while parsing attributes", e);
	private void parseAttributes(int pos, String s) {				boolean hasValue= false;		StringBuffer name= new StringBuffer();		StringBuffer value= new StringBuffer();		String startTag= ""; //$NON-NLS-1$		int i= 0;		int ix= 0;		int startName= 0;		int startValue= 0;		char c= s.charAt(i++);				try {			while (true) {								// whitespace						while (Character.isWhitespace(c))					c= s.charAt(i++);									startName= i;				while (Character.isLetterOrDigit(c) || c == ':') {					name.append(c);					c= s.charAt(i++);				}								// whitespace						while (Character.isWhitespace(c))					c= s.charAt(i++);									hasValue= false;				if (c == '=') {					c= s.charAt(i++);										// value					while (Character.isWhitespace(c))						c= s.charAt(i++);											startValue= i;					// Special handling for this taglib tag					if (startTag.equals("c:out"))  { //$NON-NLS-1$						value= value.append(s.substring(startValue, Math.max(startValue, s.length() - 2)));						name.setLength(0);						tagAttribute(name.toString(), value.toString(), startName+pos, startValue+pos);						break;					} else if (c == '"') {						c= s.charAt(i++);						while (c != '"') {							value.append(c);							c= s.charAt(i++);						}						c= s.charAt(i++);					} else {						while (Character.isLetterOrDigit(c)) {							value.append(c);							c= s.charAt(i++);						}					}					hasValue= true;				}									if (ix == 0)  {					startTag= name.toString();					startTag(false, startTag, startName+pos);				} else 					tagAttribute(name.toString(), hasValue ? value.toString() : null, startName+pos, startValue+pos);				ix++;								name.setLength(0);				value.setLength(0);			}		} catch (StringIndexOutOfBoundsException e) {			JspUIPlugin.log("error while parsing attributes", e); //$NON-NLS-1$		}				if (name.length() > 0) {			if (ix == 0)				startTag(false, name.toString(), startName+pos);			else 				tagAttribute(name.toString(), hasValue ? value.toString() : null, startName+pos, startValue+pos);		}				endTag(false);	}