/* * Created on 29. March 2007, 17:07 */ package com.mbien.engine.glsl; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Parser for GLSL compiler messages. The main purose of this class is to find * warnings or erros in the compiler log. * @autor Michael Bien */ public class GLSLCompilerMessageParser { // may be null private Pattern pattern; /** Creates a new instance of CompilerOutputHandler */ public GLSLCompilerMessageParser(Pattern pattern) { this.pattern = pattern; } public CompilerMessage[] parse(String str, int[] lines) { StringTokenizer tokenizer = new StringTokenizer(str, "\n"); CompilerMessage[] messages = new CompilerMessage[tokenizer.countTokens()]; for (int i = 0; i < messages.length; i++) { String line = tokenizer.nextToken(); Matcher m = null; if(pattern != null) m = pattern.matcher(line); if(m != null && m.find()) { String g1 = m.group(1); String g2 = m.group(2); int linenumber; String type = null; try{ linenumber = Integer.parseInt(g1); type = g2; }catch(NumberFormatException ex) { try{ linenumber = Integer.parseInt(g2); type = g1; }catch(NumberFormatException ex2) { linenumber = 0; type = null; } } // find the fragment and compute correct relative line number int n = 0; int fragment = 0; for (int j = 0; j < lines.length; j++) { n += lines[j]; if(linenumber <= n) { fragment = j; linenumber -= n-lines[j]; break; } } // System.out.println("fragment: "+fragment+" line: "+linenumber); if(type == null) { messages[i] = new CompilerMessage(CompilerMessage.COMPILER_EVENT_TYPE.MSG, "Internal error in "+GLSLCompilerMessageParser.class.getName()+" while parsing this line:\n "+line); }else if(type.equalsIgnoreCase("error")) { messages[i] = new CompilerMessage(CompilerMessage.COMPILER_EVENT_TYPE.ERROR, line, linenumber, fragment); }else{ messages[i] = new CompilerMessage(CompilerMessage.COMPILER_EVENT_TYPE.WARNING, line, linenumber, fragment); } }else{ messages[i] = new CompilerMessage(CompilerMessage.COMPILER_EVENT_TYPE.MSG, line); } } return messages; } }