blob: a2497798ac4b9a7d645677f6e6be1c007e207f13 [file] [log] [blame]
/*
**********************************************************************
* Copyright (c) 2008-2010, International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
*/
package com.ibm.icu.dev.tools.misc;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.Vector;
public class NonAsciiFileDetector
{
private static boolean VERBOSE = false;
public static class ICUSourceFileFilter implements FilenameFilter
{
int matched = 0;
int skipped = 0;
public boolean accept(File dir, String name)
{
boolean doAccept = name.endsWith(".cpp") || name.endsWith(".c") || name.endsWith(".h") || name.endsWith(".java");
if(doAccept) {
matched++;
} else {
skipped++;
}
return doAccept;
}
public String stats() {
return "Checked " + matched + " files and skipped " + skipped + " files";
}
}
public static int isNonAscii(File file) throws IOException
{
BufferedReader in = new BufferedReader(new FileReader(file));
int line = 0;
while (true) {
String str = in.readLine();
if (str == null) {
in.close();
return -1;
}
for (int i = 0; i < str.length(); i ++) {
if (str.charAt(i) > 0x7f || str.charAt(i)==0x07) {
System.out.println("Ascii test failed in "
+ file.getAbsolutePath() + " line "
+ line + " string\n" + str);
// non-latin1
in.close();
return line;
}
}
line ++;
}
}
public static void listFiles(File file,
FilenameFilter filter,
Vector<File> list) throws IOException
{
if(VERBOSE) System.err.println(" .. checking " + file.getPath() );
File files[] = file.listFiles();
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i ++) {
if (files[i].isDirectory()) {
if(files[i].getAbsolutePath().equals(files[i].getCanonicalPath())) {
if(!files[i].getName().equals(".svn")) { // skip .svn dirs
listFiles(files[i], filter, list);
}
} else {
if(VERBOSE) {
System.err.println(".. skipping symlink " + files[i].getPath());
}
}
}
else {
if (filter.accept(file, files[i].getName())) {
list.add(files[i]);
}
}
}
}
}
public static Map<String, Integer> getNonAsciiFiles(File directory,
FilenameFilter filter)
throws IOException
{
Vector<File> files = new Vector<File>();
Map<String,Integer> result = new TreeMap<String,Integer>();
listFiles(directory, filter, files);
int filecount = files.size();
if (filecount == 0) {
return null;
}
for (int i = 0; i < filecount; i ++) {
int isnonascii = isNonAscii(files.elementAt(i));
if (isnonascii != -1) {
result.put(files.elementAt(i).getAbsolutePath(),new Integer(isnonascii));
}
}
return result;
}
public static void main(String arg[])
{
int nextArg = 0;
for(nextArg = 0;nextArg<arg.length && arg[nextArg].startsWith("-");nextArg++) {
if(arg[nextArg].equals("-v")) {
VERBOSE=true;
System.err.println(" .. verbose mode.");
}
}
if(nextArg == arg.length) {
System.err.println(NonAsciiFileDetector.class.getSimpleName()+": error, no directories specified!");
}
int bad=0;
for(;nextArg<arg.length;nextArg++){
try {
ICUSourceFileFilter isff = new ICUSourceFileFilter();
File dir = new File(arg[nextArg]);
if(!dir.isDirectory()) {
throw new FileNotFoundException("Not a directory: " + dir.getAbsolutePath());
}
Map<String, Integer> nonascii = getNonAsciiFiles(dir, isff);
boolean noised = false;
System.out.println();
if (nonascii != null && nonascii.size() > 0) {
for (Entry<String, Integer> e : nonascii.entrySet()) {
if(!noised) {
System.out.println("Non ascii files in " + arg[nextArg] + ": ");
noised = true;
}
System.out.println(""
+e.getKey() + ":"
+e.getValue());
bad++;
}
} else {
// if (VERBOSE==true) {
System.out.println("No non ascii files in " + arg[nextArg]);
// }
}
// if(VERBOSE==true) {
System.out.println( isff.stats());
// }
} catch (IOException e) {
System.err.println("Error processing " + arg[nextArg]);
e.printStackTrace();
}
}
if(bad>0) {
System.err.println(bad+" non-ascii files found in total.");
}
}
}