package com.e2u.fsm; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class CodeCounter { private static final int STAT_NONE = 0; private static final int STAT_FIRST_SLASH = 1; private static final int STAT_SECOND_SLASH = 2; private static final int STAT_STAR_AFTER_SLASH = 3; private static final int STAT_STAR_IN_BLOCK_COMMENT = 4; private static final int STAT_ESC_AFTER_SECOND_STAR = 5; private static final int STAT_FIRST_QM = 6; private static final int STAT_ESC_AFTER_FIRST_QM = 7; private static final int STAT_CODE = 8; private static final int STAT_BLOCK_COMMENT_END = 9; private static final int STAT_FIRST_SQM = 10; private static final int STAT_ESC_AFTER_FIRST_SQM = 11; private static final int COUNT_0_CODE_1_COMMENT = 0; private static final int COUNT_1_CODE_0_COMMENT = 2; private static final int COUNT_1_CODE_1_COMMENT = 3; private int codeCount = 0; private int commentCount = 0; private int spaceCount = 0; private int lineCount = 0; private boolean isSpace(int ch) { if(ch == ' ' || ch == '\t') { return true; } return false; } private boolean isNewLine(int ch) { if(ch == '\n') { return true; } return false; } public void parse(BufferedReader reader) { int fromStat = STAT_NONE; int curStat = STAT_NONE; int ch = -1; try { while( (ch = reader.read()) != -1) { switch(curStat) { case STAT_NONE: { fromStat = STAT_NONE; if(ch == '/') { curStat = STAT_FIRST_SLASH; } else if(ch == '"') { curStat = STAT_FIRST_QM; } else if(isSpace(ch)) { } else if(ch == '\r') { } else if(isNewLine(ch)) { spaceCount++; } //Any other keys else { curStat = STAT_CODE; } break; } case STAT_FIRST_SLASH: { if(ch == '/') { curStat = STAT_SECOND_SLASH; } else if(ch == '*') { curStat = STAT_STAR_AFTER_SLASH; } else { curStat = STAT_CODE; if(isNewLine(ch)) { codeCount++; } } break; } case STAT_SECOND_SLASH: { if(isNewLine(ch)) { curStat = STAT_NONE; commentCount++; if(fromStat == STAT_CODE) { codeCount++; } } //Any other keys else { //stub } break; } case STAT_STAR_AFTER_SLASH: { if(ch == '*') { curStat = STAT_STAR_IN_BLOCK_COMMENT; } else if(isNewLine(ch)) { commentCount++; } //Any other keys else { //stub } break; } case STAT_STAR_IN_BLOCK_COMMENT: { if(ch == '\\') { curStat = STAT_ESC_AFTER_SECOND_STAR; } else if(ch == '/') { curStat = STAT_BLOCK_COMMENT_END; commentCount++; } else if(ch == '\r') { } //Any other keys else { if(isNewLine(ch)) { commentCount++; } curStat = STAT_STAR_AFTER_SLASH; } break; } case STAT_ESC_AFTER_SECOND_STAR: { if(isNewLine(ch)) { commentCount++; } else if(ch == '\r') { } curStat = STAT_STAR_AFTER_SLASH; break; } case STAT_FIRST_QM: { if(ch == '\\') { curStat = STAT_ESC_AFTER_FIRST_QM; } else if(ch == '"') { curStat = STAT_CODE; } //Any other keys else { if(isNewLine(ch)) { codeCount++; } } break; } case STAT_ESC_AFTER_FIRST_QM: { if(isNewLine(ch)) { codeCount++; } curStat = STAT_FIRST_QM; break; } case STAT_CODE: { fromStat = STAT_CODE; if(ch == '/') { curStat = STAT_FIRST_SLASH; } else if(ch == '"') { curStat = STAT_FIRST_QM; } else if(isSpace(ch)) { } else if(isNewLine(ch)) { curStat = STAT_NONE; codeCount++; } else if(ch == '\r') { } //Any other keys else { curStat = STAT_CODE; } break; } case STAT_BLOCK_COMMENT_END: { fromStat = STAT_BLOCK_COMMENT_END; if(ch == '/') { curStat = STAT_FIRST_SLASH; } else if(ch == '"') { curStat = STAT_FIRST_QM; } else if(isSpace(ch)) { } else if(ch == '\r') { } else if(isNewLine(ch)) { curStat = STAT_NONE; } //Any other keys else { curStat = STAT_CODE; } break; } } } } catch(Exception e) { e.printStackTrace(); } } public void parse1(BufferedReader reader) { String line = null; int curStat = STAT_NONE; int ch = -1; char dbgChar = 0; int codeSeg = 0; int commentSeg = 0; try { while( (line = reader.readLine()) != null) { lineCount++; line = line.trim(); if(line.isEmpty()) { // if(curStat == STAT_STAR_AFTER_SLASH) // { // commentCount++; // } // else // { // spaceCount++; // } spaceCount++; continue; } codeSeg = 0; commentSeg = 0; boolean isSpace = true; if(curStat == STAT_STAR_AFTER_SLASH || curStat == STAT_STAR_IN_BLOCK_COMMENT || curStat == STAT_ESC_AFTER_SECOND_STAR) { } else { curStat = STAT_NONE; } for(int i = 0, size = line.length(); i < size; i++) { ch = line.charAt(i); dbgChar = (char)ch; switch(curStat) { case STAT_NONE: { if(ch == '/') { curStat = STAT_FIRST_SLASH; } else if(ch == '"') { curStat = STAT_FIRST_QM; } else if(ch == '\'') { curStat = STAT_FIRST_SQM; } else if(!isSpace(ch)) { isSpace = false; } if(i == size - 1) { // codeCount++; if(commentSeg > 0) { //setting commentCount++; codeCount++; } else { codeCount++; } } break; } case STAT_FIRST_SLASH: { /**/ /*int a = 3; int b = 6;*/ /**/ /*int a = 3; int b = 6;*/ // /* a */ /// /**/ int a;/*int a = 3; int b = 6;*/ int b; // /**/ int c;/*int a = 3; int b = 6;*/ /**/ int aa;/*int a = 3; int b = 6;*/ int aaab; // /**/ int caa;/*int a = 3; int b = 6;*/ int bbbb = 9 / /* adfd */ ( 222 / 6 /* **/ ) / // dfsa/ 4; if(ch == '/') { curStat = STAT_SECOND_SLASH; if(!isSpace) { isSpace = true; codeSeg++; } commentSeg++; } else if(ch == '*') { curStat = STAT_STAR_AFTER_SLASH; if(!isSpace) { isSpace = true; codeSeg++; } commentSeg++; } else { curStat = STAT_NONE; isSpace = false; } if(i == size - 1) { if(curStat == STAT_SECOND_SLASH || curStat == STAT_STAR_AFTER_SLASH) { //commentCount++; if(codeSeg > 0 && commentSeg > 0) { //setting commentCount++; codeCount++; } else { commentCount++; } } else { codeCount++; } } break; } case STAT_SECOND_SLASH: { if(i == size - 1) { commentCount++; if(codeSeg > 0) { codeCount++; } } break; } case STAT_STAR_AFTER_SLASH: { if(ch == '*') { curStat = STAT_STAR_IN_BLOCK_COMMENT; } if(i == size - 1) { commentCount++; } break; } case STAT_STAR_IN_BLOCK_COMMENT: { if(ch == '\\') { curStat = STAT_ESC_AFTER_SECOND_STAR; } else if(ch == '/') { curStat = STAT_NONE; isSpace = true; // if(i != size - 1) // { // commentCount++; // } } else if(ch == '*') { //do nothing } //Any other keys else { curStat = STAT_STAR_AFTER_SLASH; } if(i == size - 1) { // commentCount++; if(codeSeg > 0 && commentSeg > 0) { //setting commentCount++; codeCount++; } else { commentCount++; } } break; } case STAT_ESC_AFTER_SECOND_STAR: { curStat = STAT_STAR_AFTER_SLASH; if(i == size - 1) { commentCount++; } break; } case STAT_FIRST_QM: { if(ch == '\\') { curStat = STAT_ESC_AFTER_FIRST_QM; } else if(ch == '"') { curStat = STAT_NONE; } if(i == size - 1) { codeCount++; } break; } case STAT_ESC_AFTER_FIRST_QM: { curStat = STAT_FIRST_QM; if(i == size - 1) { codeCount++; } break; } case STAT_FIRST_SQM: { if(ch == '\\') { curStat = STAT_ESC_AFTER_FIRST_SQM; } else if(ch == '\'') { curStat = STAT_NONE; } if(i == size - 1) { codeCount++; } break; } case STAT_ESC_AFTER_FIRST_SQM: { curStat = STAT_FIRST_SQM; if(i == size - 1) { codeCount++; } break; } } } } } catch(Exception e) { e.printStackTrace(); } } private static void error(String str) { System.out.println(str); } public void showResult() { System.out.printf("LINE COUNT = %d\n", lineCount); System.out.printf("CODE COUNT = %d\n", codeCount); System.out.printf("COMMENT COUNT = %d\n", commentCount); System.out.printf("BLANK COUNT = %d\n", spaceCount); } public static void main(String[] args) { CodeCounter cc = new CodeCounter(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(new File("test.java"))); cc.parse1(reader); cc.showResult(); reader.close(); } catch(Exception e) { // TODO: handle exception } } }