// -- Happy Computing!\r
//\r
package com.stevesoft.pat;\r
+\r
import java.io.*;\r
import java.util.*;\r
\r
</table>\r
</center>\r
*/\r
-public class FileRegex extends Regex {\r
- /** Build an unitialized FileRegex. */\r
- public FileRegex() { dirflag=EITHER; }\r
- /** Build a FileRegex form String s. */\r
- public FileRegex(String s) {\r
- super(s);\r
- dirflag = EITHER;\r
+public class FileRegex\r
+ extends Regex\r
+{\r
+ /** Build an unitialized FileRegex. */\r
+ public FileRegex()\r
+ {\r
+ dirflag = EITHER;\r
+ }\r
+\r
+ /** Build a FileRegex form String s. */\r
+ public FileRegex(String s)\r
+ {\r
+ super(s);\r
+ dirflag = EITHER;\r
+ }\r
+\r
+ /** Compile a new pattern.\r
+ Throws @exception com.stevesoft.pat.RegSyntax for\r
+ nonsensical patterns like "[9-0]+" just as Regex does.\r
+ @see com.stevesoft.pat#compile(java.lang.String)\r
+ */\r
+ public void compile(String s)\r
+ throws RegSyntax\r
+ {\r
+ String npat = toFileRegex(s);\r
+ super.compile(npat);\r
+ if (File.separatorChar == '\\') // MS-DOS\r
+ {\r
+ ignoreCase = true;\r
}\r
- /** Compile a new pattern.\r
- Throws @exception com.stevesoft.pat.RegSyntax for\r
- nonsensical patterns like "[9-0]+" just as Regex does.\r
- @see com.stevesoft.pat#compile(java.lang.String)\r
- */\r
- public void compile(String s) throws RegSyntax {\r
- String npat = toFileRegex(s);\r
- super.compile(npat);\r
- if(File.separatorChar == '\\') // MS-DOS\r
- ignoreCase = true;\r
+ }\r
+\r
+ /** This is the method required by FileNameFilter.\r
+ To get a listing of files in the current directory\r
+ ending in .java, do this:\r
+ <pre>\r
+ File dot = new File(".");\r
+ FileRegex java_files = new FileRegex("*.java");\r
+ String[] file_list = dot.list(java_files);\r
+ </pre>\r
+ */\r
+ public boolean accept(File dir, String s)\r
+ {\r
+ if (dirflag != EITHER)\r
+ {\r
+ File f = new File(s);\r
+ if (f.isDirectory() && dirflag == NONDIR)\r
+ {\r
+ return false;\r
+ }\r
+ if (!f.isDirectory() && dirflag == DIR)\r
+ {\r
+ return false;\r
+ }\r
}\r
- /** This is the method required by FileNameFilter.\r
- To get a listing of files in the current directory\r
- ending in .java, do this:\r
- <pre>\r
- File dot = new File(".");\r
- FileRegex java_files = new FileRegex("*.java");\r
- String[] file_list = dot.list(java_files);\r
- </pre>\r
- */\r
- public boolean accept(File dir,String s) {\r
- if(dirflag != EITHER) {\r
- File f = new File(s);\r
- if(f.isDirectory() && dirflag == NONDIR)\r
- return false;\r
- if(!f.isDirectory() && dirflag == DIR)\r
- return false;\r
- }\r
- return matchAt(s,0);\r
+ return matchAt(s, 0);\r
+ }\r
+\r
+ int dirflag = 0;\r
+ final static int EITHER = 0, DIR = 1, NONDIR = 2;\r
+\r
+ /** Provides an alternative to File.list -- this\r
+ separates its argument according to File.pathSeparator.\r
+ To each path, it splits off a directory -- all characters\r
+ up to and including the first instance of File.separator --\r
+ and a file pattern -- the part that comes after the directory.\r
+ It then produces a list of all the pattern matches on all\r
+ the paths. Thus "*.java:../*.java" would produce a list of\r
+ all the java files in this directory and in the ".." directory\r
+ on a Unix machine. "*.java;..\\*.java" would do the same thing\r
+ on a Dos machine. */\r
+ public static String[] list(String f)\r
+ {\r
+ return list(f, EITHER);\r
+ }\r
+\r
+ static String[] list(String f, int df)\r
+ {\r
+ //return list_(f,new FileRegex());\r
+ StringTokenizer st = new StringTokenizer(f, File.pathSeparator);\r
+ Vector v = new Vector();\r
+ while (st.hasMoreTokens())\r
+ {\r
+ String path = st.nextToken();\r
+ list1(path, v, df, true);\r
}\r
- int dirflag = 0;\r
- final static int EITHER=0,DIR=1,NONDIR=2;\r
+ String[] sa = new String[v.size()];\r
+ v.copyInto(sa);\r
+ return sa;\r
+ }\r
\r
- /** Provides an alternative to File.list -- this\r
- separates its argument according to File.pathSeparator.\r
- To each path, it splits off a directory -- all characters\r
- up to and including the first instance of File.separator --\r
- and a file pattern -- the part that comes after the directory.\r
- It then produces a list of all the pattern matches on all\r
- the paths. Thus "*.java:../*.java" would produce a list of\r
- all the java files in this directory and in the ".." directory\r
- on a Unix machine. "*.java;..\\*.java" would do the same thing\r
- on a Dos machine. */\r
- public static String[] list(String f) {\r
- return list(f,EITHER);\r
+ final static Regex root = new Regex(File.separatorChar == '/' ?\r
+ "/$" : "(?:.:|)\\\\$");\r
+ static void list1(String path, Vector v, int df, boolean rec)\r
+ {\r
+ // if path looks like a/b/c/ or d:\ then add .\r
+ if (root.matchAt(path, 0))\r
+ {\r
+ v.addElement(path + ".");\r
+ return;\r
}\r
- static String[] list(String f,int df) {\r
- //return list_(f,new FileRegex());\r
- StringTokenizer st = new StringTokenizer(f,File.pathSeparator);\r
- Vector v = new Vector();\r
- while(st.hasMoreTokens()) {\r
- String path = st.nextToken();\r
- list1(path,v,df,true);\r
- }\r
- String[] sa = new String[v.size()];\r
- v.copyInto(sa);\r
- return sa;\r
+ File f = new File(path);\r
+ if (f.getParent() != null && rec)\r
+ {\r
+ Vector v2 = new Vector();\r
+ list1(f.getParent(), v2, DIR, true);\r
+ for (int i = 0; i < v2.size(); i++)\r
+ {\r
+ String path2 = ( (String) v2.elementAt(i)) +\r
+ File.separator + f.getName();\r
+ list1(path2, v, df, false);\r
+ }\r
}\r
- final static Regex root=new Regex(File.separatorChar=='/' ?\r
- "/$" : "(?:.:|)\\\\$");\r
- static void list1(String path,Vector v,int df,boolean rec) {\r
- // if path looks like a/b/c/ or d:\ then add .\r
- if(root.matchAt(path,0)) {\r
- v.addElement(path+".");\r
- return;\r
- }\r
- File f = new File(path);\r
- if(f.getParent() != null && rec) {\r
- Vector v2 = new Vector();\r
- list1(f.getParent(),v2,DIR,true);\r
- for(int i=0;i<v2.size();i++) {\r
- String path2 = ((String)v2.elementAt(i))+\r
- File.separator+f.getName();\r
- list1(path2,v,df,false);\r
- }\r
- } else {\r
- File base = new File(path);\r
+ else\r
+ {\r
+ File base = new File(path);\r
\r
- String dir_s = base.getParent();\r
- if(dir_s==null) dir_s=".";\r
- File dir = new File(dir_s);\r
+ String dir_s = base.getParent();\r
+ if (dir_s == null)\r
+ {\r
+ dir_s = ".";\r
+ }\r
+ File dir = new File(dir_s);\r
\r
- FileRegex fr = new FileRegex(base.getName());\r
- if(fr.isLiteral()) {\r
- v.addElement(dir_s+File.separator+base.getName());\r
- return;\r
- }\r
- fr.dirflag = df;\r
- String[] sa = dir.list(fr);\r
- if(sa == null) return;\r
- for(int i=0;i<sa.length;i++) {\r
- v.addElement(dir_s+File.separator+sa[i]);\r
- }\r
- }\r
+ FileRegex fr = new FileRegex(base.getName());\r
+ if (fr.isLiteral())\r
+ {\r
+ v.addElement(dir_s + File.separator + base.getName());\r
+ return;\r
+ }\r
+ fr.dirflag = df;\r
+ String[] sa = dir.list(fr);\r
+ if (sa == null)\r
+ {\r
+ return;\r
+ }\r
+ for (int i = 0; i < sa.length; i++)\r
+ {\r
+ v.addElement(dir_s + File.separator + sa[i]);\r
+ }\r
}\r
+ }\r
\r
- /** This method takes a file regular expression, and translates it\r
- into the type of pattern used by a normal Regex. */\r
- public static String toFileRegex(String s) {\r
- StrPos sp = new StrPos(s,0);\r
- StringBuffer sb = new StringBuffer();\r
- if(sp.incMatch("{?e=")) {\r
- char e = sp.thisChar();\r
- sp.inc();\r
- if(sp.incMatch("}")) {\r
- sb.append("(?e="+e+")^");\r
- } else {\r
- sb.append("^(?e=");\r
- }\r
- sp.esc = e;\r
- }\r
- int ParenLvl = 0;\r
- while(!sp.eos()) {\r
- if(File.separatorChar == '\\') {\r
- if(sp.escaped())\r
- sb.append("\\\\");\r
- sp.dontMatch = false;\r
- }\r
- if(sp.incMatch("?"))\r
- sb.append(".");\r
- else if(sp.incMatch(".")) {\r
- sb.append(sp.esc);\r
- sb.append('.');\r
- } else if(sp.incMatch("{??")) {\r
- sb.append("(??");\r
- ParenLvl++;\r
- // allow negative lookahead to work\r
- } else if(sp.incMatch("{?!")) {\r
- sb.append("(?!");\r
- ParenLvl++;\r
- // allow positive lookahead to work\r
- } else if(sp.incMatch("{?=")) {\r
- sb.append("(?=");\r
- ParenLvl++;\r
- } else if(sp.incMatch("{")) {\r
- sb.append("(?:");\r
- ParenLvl++;\r
- } else if(sp.incMatch("}")) {\r
- sb.append(')');\r
- ParenLvl--;\r
- } else if(ParenLvl != 0 && sp.incMatch(","))\r
- sb.append('|');\r
- else if(sp.incMatch("*"))\r
- sb.append(".*");\r
- else {\r
- sb.append(sp.thisChar());\r
- sp.inc();\r
- }\r
- }\r
- sb.append("$");\r
- return sb.toString();\r
+ /** This method takes a file regular expression, and translates it\r
+ into the type of pattern used by a normal Regex. */\r
+ public static String toFileRegex(String s)\r
+ {\r
+ StrPos sp = new StrPos(s, 0);\r
+ StringBuffer sb = new StringBuffer();\r
+ if (sp.incMatch("{?e="))\r
+ {\r
+ char e = sp.thisChar();\r
+ sp.inc();\r
+ if (sp.incMatch("}"))\r
+ {\r
+ sb.append("(?e=" + e + ")^");\r
+ }\r
+ else\r
+ {\r
+ sb.append("^(?e=");\r
+ }\r
+ sp.esc = e;\r
}\r
- public boolean isLiteral() {\r
- Pattern x = thePattern;\r
- while(x != null && !(x instanceof End)) {\r
- if(x instanceof oneChar)\r
- ;\r
- else if(x instanceof Skipped)\r
- ;\r
- else return false;\r
- x = x.next;\r
+ int ParenLvl = 0;\r
+ while (!sp.eos())\r
+ {\r
+ if (File.separatorChar == '\\')\r
+ {\r
+ if (sp.escaped())\r
+ {\r
+ sb.append("\\\\");\r
}\r
- return true;\r
+ sp.dontMatch = false;\r
+ }\r
+ if (sp.incMatch("?"))\r
+ {\r
+ sb.append(".");\r
+ }\r
+ else if (sp.incMatch("."))\r
+ {\r
+ sb.append(sp.esc);\r
+ sb.append('.');\r
+ }\r
+ else if (sp.incMatch("{??"))\r
+ {\r
+ sb.append("(??");\r
+ ParenLvl++;\r
+ // allow negative lookahead to work\r
+ }\r
+ else if (sp.incMatch("{?!"))\r
+ {\r
+ sb.append("(?!");\r
+ ParenLvl++;\r
+ // allow positive lookahead to work\r
+ }\r
+ else if (sp.incMatch("{?="))\r
+ {\r
+ sb.append("(?=");\r
+ ParenLvl++;\r
+ }\r
+ else if (sp.incMatch("{"))\r
+ {\r
+ sb.append("(?:");\r
+ ParenLvl++;\r
+ }\r
+ else if (sp.incMatch("}"))\r
+ {\r
+ sb.append(')');\r
+ ParenLvl--;\r
+ }\r
+ else if (ParenLvl != 0 && sp.incMatch(","))\r
+ {\r
+ sb.append('|');\r
+ }\r
+ else if (sp.incMatch("*"))\r
+ {\r
+ sb.append(".*");\r
+ }\r
+ else\r
+ {\r
+ sb.append(sp.thisChar());\r
+ sp.inc();\r
+ }\r
+ }\r
+ sb.append("$");\r
+ return sb.toString();\r
+ }\r
+\r
+ public boolean isLiteral()\r
+ {\r
+ Pattern x = thePattern;\r
+ while (x != null && ! (x instanceof End))\r
+ {\r
+ if (x instanceof oneChar)\r
+ {\r
+ ;\r
+ }\r
+ else if (x instanceof Skipped)\r
+ {\r
+ ;\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+ x = x.next;\r
}\r
+ return true;\r
+ }\r
}\r