@SuppressWarnings("serial") public Map> readString(String string){ HashMap> sections; HashMap sectiondata; StringCharacterIterator si=new StringCharacterIterator(string); boolean readingtitle=false; boolean havetitle=false; boolean readingkey=false; boolean readingvalue=false; boolean inquotes=false; boolean escaping=false; boolean sectioncomplete=false; boolean keycomplete=false; boolean valuecomplete=false; StringBuilder key=null; StringBuilder value=null; StringBuilder title=null; sections=new HashMap>(){ public String toString(){ } }; sectiondata=new HashMap(); for(char ch=si.first();ch!=si.DONE;ch=si.next()){ if(!escaping && !inquotes && ch!='\"'){ if(ch=='['){ readingtitle=!havetitle; if(readingvalue | readingkey){ sectioncomplete=true; }else{ continue; } }else if(ch==']'){ havetitle=readingtitle; readingtitle=false; continue; }else if(havetitle){ readingkey=true; if(ch=='='){ readingkey=false; keycomplete=true; readingvalue=true; continue; }else if(ch=='\"'){ if(!escaping){ inquotes=!inquotes; } continue; }else if(ch==' ' | ch=='\t' | ch=='\n'){ if(readingkey){ continue; }else if(readingvalue){ readingvalue=false; valuecomplete=true; readingkey=true; continue; } }else if(ch=='\\'){ escaping=true; continue; } } } if(readingtitle){ title.append(ch); }else if(readingkey){ key.append(ch); }else if(readingvalue){ value.append(ch); }else if(sectioncomplete){ sections.put(title.toString(), sectiondata); sectiondata=new HashMap(); havetitle=false; sectioncomplete=false; }else if(keycomplete){ keycomplete=false; }else if(valuecomplete){ sectiondata.put(key.toString(), value.toString()); key=null; value=null; valuecomplete=false; } escaping=false; } return sections; }