001 /* 002 * To change this template, choose Tools | Templates 003 * and open the template in the editor. 004 */ 005 006 package org.util.xml.parse; 007 008 import java.io.IOException; 009 import org.util.xml.parse.ElementParser; 010 011 /** 012 * 013 * @author masaru 014 */ 015 public class AttValueParser extends ParseElement { 016 017 String return_value_; 018 019 @Override 020 public boolean match(char c) { 021 return allow(c); 022 } 023 024 @Override 025 public int parse(int c, ElementParser parser) throws XMLParseException, IOException { 026 StringBuffer sb = new StringBuffer(); 027 int next_word_ = -1; 028 int state = 0; 029 while(true) { 030 if(c==-1) throw new XMLParseException("end of stream."); 031 if(state == 0) { 032 if(c=='\"') state = 1; 033 else if(c=='\'') state = 2; 034 else if(allow(c)) { 035 sb.append((char)c); 036 state = 3; 037 } else throw new XMLParseException("parse error: cannot read value: this char does not allowed "+(char)c); 038 }else if(state == 1) { 039 if(c=='\"') state = 4; 040 else sb.append((char)c); 041 }else if(state == 2) { 042 if(c=='\'') state = 4; 043 else sb.append((char)c); 044 }else if(state == 3) { 045 if(allow(c)) sb.append((char)c); 046 else { 047 next_word_ = c; 048 break; 049 } 050 }else if(state == 4) { 051 next_word_ = c; 052 break; 053 } 054 c = parser.get(); 055 } 056 return_value_ = sb.toString(); 057 return next_word_; 058 } 059 060 @Override 061 public String getReturnValue() { 062 return return_value_; 063 } 064 065 public boolean allow(int c) { 066 return (!isSpace(c) && (c!='<') && (c!='>') && (c!='!') && (c!=-1)); 067 } 068 }