package jeffaschenk.commons.frameworks.cnxidx.shell; import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.util.regex.*; import java.util.LinkedList; public class Grep { // Charset and decoder for ISO-8859-15 private static Charset charset = Charset.forName("ISO-8859-15"); private static CharsetDecoder decoder = charset.newDecoder(); // Results LinkedLists LinkedList<String> gresults = new LinkedList<>(); LinkedList<String> gcontrol = new LinkedList<>(); // Pattern used to parse lines private static Pattern linePattern = Pattern.compile(".*\r?\n"); // The input pattern that we're looking for private static Pattern pattern; // Default Constructor. public Grep() { } // Compile the pattern from the command line // private static void compile(String pat) throws PatternSyntaxException { pattern = Pattern.compile(pat); } // End of compile Method. // Use the linePattern to break the given CharBuffer into lines, applying // the input pattern to each line to see if we have a match // private void grep(File f, CharBuffer cb) throws IOException { Matcher lm = linePattern.matcher(cb); // Line matcher Matcher pm = null; // Pattern matcher int lines = 0; while (lm.find()) { lines++; CharSequence cs = lm.group(); // The current line if (pm == null) { pm = pattern.matcher(cs); } else { pm.reset(cs); } if (pm.find()) { gcontrol.addLast(f + ":" + lines); gresults.addLast(cs.toString()); } // End of find if. if (lm.end() == cb.limit()) { break; } } // End of While Loop. } // End of grep method. // Search for occurrences of the input pattern in the given file // public void grep(File f, String _pattern) throws IOException, PatternSyntaxException { // Open the file and then get a channel from the stream FileInputStream fis = new FileInputStream(f); FileChannel fc = fis.getChannel(); // Get the file's size and then map it into memory int sz = (int) fc.size(); MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz); // Decode the file into a char buffer CharBuffer cb = decoder.decode(bb); // Compile the Pattern compile(_pattern); // Perform the search grep(f, cb); // Close the channel and the stream fc.close(); } // End of grep Method. // Dump Results for a Grep. public void dumpResults() { // *************************** // Iterate through the Results for (int i = 0; i < gcontrol.size(); i++) { System.out.print(gcontrol.get(i) + ": "); System.out.print(gresults.get(i)); } // End of While Loop. } // End of dumpResults Method. // Obtain Results from the Grep. public LinkedList obtainResults() { return (gresults); } // End of obtainResults Method. // Obtain Control Info from the Grep. public LinkedList obtainControl() { return (gcontrol); } // End of obtainControl Method. /** * main to provide command line capability. */ public static void main(String[] args) { if (args.length < 2) { System.err.println("Usage: java Grep pattern file..."); return; } for (int i = 1; i < args.length; i++) { File f = new File(args[i]); try { Grep gx = new Grep(); gx.grep(f, args[0]); gx.dumpResults(); } catch (IOException x) { System.err.println(f + ": " + x); } } } // End of Main. } ///:~ Grep