public List<SPatch> call() {
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(patch));

			currentSPatch = new SPatch();
			{
				String name = patch.getName();
				String sname = name.substring(0, name.lastIndexOf('.'));
				currentSPatch.setName(sname);
				String message = messages.getProperty(sname);
				assert message != null : patch.getName();
				List<String> messages = Utility.splitLineOn(78, message);
				messages.add("Found by coccinelle spatch \"" + Utility.findPath(sname) +"\"");
				currentSPatch.setMessage(messages);
			}

			// read first
			String currentLine = reader.readLine();

			while(currentLine != null) {

				if(currentLine.startsWith("Please check ")) {
					newmode = ParserMode.WARNING;
				} else if(currentLine.startsWith("diff")) {
					newmode = ParserMode.PATCH_START;

					if(oldmode == ParserMode.PATCH_START)
						newmode = ParserMode.PATCH_CONTENT;
				}

				checkModeChange();

				switch (newmode) {
				case PATCH_START:
				case PATCH_CONTENT:
					diff.add(currentLine);
					break;
				}
				oldmode = newmode;

				// read next
				currentLine = reader.readLine();
			}


			// all SPatches were parsed, now process them
			newmode = ParserMode.END_OF_FILE;
			checkModeChange();

			return Arrays.asList(currentSPatch);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(reader != null) {
				try {
					reader.close();
				} catch (IOException e) {}
			}
		}

		return null;
	}