001: /*
002: * Author: Chris Seguin
003: *
004: * This software has been developed under the copyleft
005: * rules of the GNU General Public License. Please
006: * consult the GNU General Public License for more
007: * details about use and distribution of this software.
008: */
009: package org.acm.seguin.metrics;
010:
011: import java.io.File;
012: import java.io.FileInputStream;
013: import java.io.IOException;
014: import java.io.InputStream;
015: import org.acm.seguin.awt.ExceptionPrinter;
016:
017: /**
018: * Counts the number of lines in a file
019: *
020: *@author Chris Seguin
021: *@created June 30, 1999
022: */
023: public class LineCounter {
024: File file;
025:
026: /**
027: * Constructor for the LineCounter object
028: *
029: *@param init File to count
030: */
031: public LineCounter(File init) {
032: file = init;
033: }
034:
035: /**
036: * Counts the number of lines in a file
037: *
038: *@return The number of lines in the file
039: */
040: public int countLines() {
041: int count = 1;
042: try {
043: FileInputStream in = new FileInputStream(file);
044: int ch = 0;
045:
046: while (ch != -1) {
047: ch = in.read();
048: count += countCharacter(ch, in);
049: }
050:
051: in.close();
052: } catch (IOException ioe) {
053: ExceptionPrinter.print(ioe, false);
054: }
055:
056: return count;
057: }
058:
059: /**
060: * Prints the message
061: *
062: *@return The number of lines in the file
063: */
064: public int printMessage() {
065: int count = countLines();
066: if (count < 10) {
067: System.out
068: .println(" " + count + " " + file.getPath());
069: } else if (count < 100) {
070: System.out.println(" " + count + " " + file.getPath());
071: } else if (count < 1000) {
072: System.out.println(" " + count + " " + file.getPath());
073: } else if (count < 10000) {
074: System.out.println(" " + count + " " + file.getPath());
075: } else if (count < 100000) {
076: System.out.println(" " + count + " " + file.getPath());
077: } else {
078: System.out.println(" " + count + " " + file.getPath());
079: }
080:
081: return count;
082: }
083:
084: /**
085: * Counts how many lines a character counts as (depends on next character
086: * sometimes)
087: *
088: *@param ch The character to be counted
089: *@param in The input stream
090: *@return The number to add to the ongoing count
091: *@exception IOException Thrown if unable to read from the input stream
092: */
093: protected int countCharacter(int ch, InputStream in)
094: throws IOException {
095: if (ch == '\n') {
096: return 1;
097: } else if (ch == '\r') {
098: int next = in.read();
099: if (next == '\n') {
100: return 1;
101: } else {
102: return 1 + countCharacter(next, in);
103: }
104: }
105:
106: return 0;
107: }
108:
109: /**
110: * Main program
111: *
112: *@param args Command line arguments
113: */
114: public static void main(String[] args) {
115: if (args.length == 0) {
116: System.out
117: .println("Syntax: java org.acm.seguin.metrics.LineCounter <filename>");
118: return;
119: }
120:
121: int count = (new LineCounter(new File(args[0]))).printMessage();
122: }
123: }
|