| 1 package com.quadcap.util.text; 2 3 40 41 import java.io.InputStream ; 42 import java.io.IOException ; 43 44 import com.quadcap.util.Debug; 45 46 50 public class TextMatch { 51 public static int match(byte[] string, int slen, 52 byte[] pattern, int plen) { 53 int[] qmap = new int[256]; 54 for (int i = 0; i < 256; i++) { 55 qmap[i] = plen + 1; 56 } 57 for (int i = 0; i < plen; i++) { 58 qmap[pattern[i]] = plen - i; 59 } 60 for (int i = 0; i <= slen - plen; ) { 61 boolean match = true; 63 for (int j = 0; j < plen; j++) { 64 byte c = string[i + j]; 65 if (string[i + j] != pattern[j]) { 67 match = false; 68 break; 69 } 70 } 71 if (match) return i; 72 73 byte c = string[i + plen]; 74 i += qmap[string[i + plen]]; 76 } 77 return -1; 78 } 79 80 public static int match(byte[] string, byte[] pattern) { 81 return match(string, string.length, pattern, pattern.length); 82 } 83 84 public static int match(InputStream is, byte[] pattern) 85 throws IOException  86 { 87 int[] qmap = new int[256]; 88 for (int i = 0; i < 256; i++) { 89 qmap[i] = pattern.length + 1; 90 } 91 for (int i = 0; i < pattern.length; i++) { 92 qmap[pattern[i]] = pattern.length - i; 93 } 94 int cnt = 0; 95 while (true) { 96 is.mark(pattern.length); 98 boolean match = true; 99 int j, c; 100 for (j = 0; j < pattern.length; j++) { 101 if ((c = is.read()) < 0) return -1; 102 if (c != pattern[j]) { 104 match = false; 105 break; 106 } 107 } 108 if (match) return cnt; 109 is.skip(pattern.length - j - 1); 110 if ((c = is.read()) < 0) return -1; 111 is.reset(); 112 int skip = qmap[c]; 114 if (is.skip(skip) < skip) return -1; 115 cnt += skip; 116 } 117 } 118 } 119 | Popular Tags |