package com.siberika.idea.pascal.sdk;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.Map;
import java.util.TreeMap;
/**
* Author: George Bakhtadze
* Date: 31/08/2013
*/
public class DefinesParser {
static Map<String, Map<String, Define>> parse(@NotNull InputStream stream) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
final Map<String, Map<String, Define>> defines = new TreeMap<String, Map<String, Define>>();
DefaultHandler handler = new DefaultHandler() {
private String version = null;
private StringBuilder sb = new StringBuilder();
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("compiler")) {
version = attributes.getValue("version");
}
sb = new StringBuilder();
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("define")) {
addDefine(defines, version, sb.toString());
}
}
public void characters(char ch[], int start, int length) throws SAXException {
sb.append(ch, start, length);
}
};
saxParser.parse(stream, handler);
return defines;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static void addDefine(Map<String, Map<String, Define>> compilerDefines, String version, String name) {
Map<String, Define> defines = compilerDefines.get(version);
if (null == defines) {
defines = new HashMap<String, Define>();
}
defines.put(name.toUpperCase(), new Define(name, null, -1));
compilerDefines.put(version, defines);
}
}