Program: 91504
Project: 91504
Buggy source:
private HashMap<String,ArrayList<GLSLStruct>> findUniformStructs(String shaderText){
  HashMap<String,ArrayList<GLSLStruct>> result=new HashMap<String,ArrayList<GLSLStruct>>();
  final String STRUCT_KEYWORD="String_Node_Str";
  int structStartLocation=shaderText.indexOf(STRUCT_KEYWORD);
  while (structStartLocation != -1) {
    if (!(structStartLocation != 0 && (Character.isWhitespace(shaderText.charAt(structStartLocation - 1)) || shaderText.charAt(structStartLocation - 1) == ';') && Character.isWhitespace(shaderText.charAt(structStartLocation + STRUCT_KEYWORD.length()))))     continue;
    int nameBegin=structStartLocation + STRUCT_KEYWORD.length() + 1;
    int braceBegin=shaderText.indexOf("String_Node_Str",nameBegin);
    int braceEnd=shaderText.indexOf("String_Node_Str",braceBegin);
    String structName=shaderText.substring(nameBegin,braceBegin).trim();
    ArrayList<GLSLStruct> glslStructs=new ArrayList<GLSLStruct>();
    int componentSemicolonPos=shaderText.indexOf("String_Node_Str",braceBegin);
    while (componentSemicolonPos != -1 && componentSemicolonPos < braceEnd) {
      int componentNameEnd=componentSemicolonPos + 1;
      while (Character.isWhitespace(shaderText.charAt(componentNameEnd - 1)) || shaderText.charAt(componentNameEnd - 1) == ';')       componentNameEnd--;
      int componentNameStart=componentSemicolonPos;
      while (!Character.isWhitespace(shaderText.charAt(componentNameStart - 1)))       componentNameStart--;
      int componentTypeEnd=componentNameStart;
      while (Character.isWhitespace(shaderText.charAt(componentTypeEnd - 1)))       componentTypeEnd--;
      int componentTypeStart=componentTypeEnd;
      while (!Character.isWhitespace(shaderText.charAt(componentTypeStart - 1)))       componentTypeStart--;
      String componentName=shaderText.substring(componentNameStart,componentNameEnd);
      String componentType=shaderText.substring(componentTypeStart,componentTypeEnd);
      GLSLStruct glslStruct=new GLSLStruct();
      glslStruct.name=componentName;
      glslStruct.type=componentType;
      glslStructs.add(glslStruct);
      componentSemicolonPos=shaderText.indexOf("String_Node_Str",componentSemicolonPos + 1);
    }
    result.put(structName,glslStructs);
    structStartLocation=shaderText.indexOf(STRUCT_KEYWORD,structStartLocation + STRUCT_KEYWORD.length());
  }
  return result;
}

Fixed version (ground truth):
private HashMap<String,ArrayList<GLSLStruct>> findUniformStructs(String shaderText){
  HashMap<String,ArrayList<GLSLStruct>> result=new HashMap<String,ArrayList<GLSLStruct>>();
  final String STRUCT_KEYWORD="String_Node_Str";
  int structStartLocation=shaderText.indexOf(STRUCT_KEYWORD);
  while (structStartLocation != -1) {
    if (!(structStartLocation != 0 && (Character.isWhitespace(shaderText.charAt(structStartLocation - 1)) || shaderText.charAt(structStartLocation - 1) == ';') && Character.isWhitespace(shaderText.charAt(structStartLocation + STRUCT_KEYWORD.length())))) {
      structStartLocation=shaderText.indexOf(STRUCT_KEYWORD,structStartLocation + STRUCT_KEYWORD.length());
      continue;
    }
    int nameBegin=structStartLocation + STRUCT_KEYWORD.length() + 1;
    int braceBegin=shaderText.indexOf("String_Node_Str",nameBegin);
    int braceEnd=shaderText.indexOf("String_Node_Str",braceBegin);
    String structName=shaderText.substring(nameBegin,braceBegin).trim();
    ArrayList<GLSLStruct> glslStructs=new ArrayList<GLSLStruct>();
    int componentSemicolonPos=shaderText.indexOf("String_Node_Str",braceBegin);
    while (componentSemicolonPos != -1 && componentSemicolonPos < braceEnd) {
      int componentNameEnd=componentSemicolonPos + 1;
      while (Character.isWhitespace(shaderText.charAt(componentNameEnd - 1)) || shaderText.charAt(componentNameEnd - 1) == ';')       componentNameEnd--;
      int componentNameStart=componentSemicolonPos;
      while (!Character.isWhitespace(shaderText.charAt(componentNameStart - 1)))       componentNameStart--;
      int componentTypeEnd=componentNameStart;
      while (Character.isWhitespace(shaderText.charAt(componentTypeEnd - 1)))       componentTypeEnd--;
      int componentTypeStart=componentTypeEnd;
      while (!Character.isWhitespace(shaderText.charAt(componentTypeStart - 1)))       componentTypeStart--;
      String componentName=shaderText.substring(componentNameStart,componentNameEnd);
      String componentType=shaderText.substring(componentTypeStart,componentTypeEnd);
      GLSLStruct glslStruct=new GLSLStruct();
      glslStruct.name=componentName;
      glslStruct.type=componentType;
      glslStructs.add(glslStruct);
      componentSemicolonPos=shaderText.indexOf("String_Node_Str",componentSemicolonPos + 1);
    }
    result.put(structName,glslStructs);
    structStartLocation=shaderText.indexOf(STRUCT_KEYWORD,structStartLocation + STRUCT_KEYWORD.length());
  }
  return result;
}