private function countLocInFile($filename)
{
$return = array('comments' => 0, 'whitespace' => 0, 'tokens' => 0, 'total' => 0, 'code' => 0, 'files' => 1);
$lines = array();
$php = new Phpexec();
$tokens = $php->getTokenFromFile($filename);
if (empty($tokens)) {
display("{$filename} is empty\n");
$return['files'] = 0;
$return['error'] = self::EMPTYFILE;
return $return;
}
// One token if it fails compilation but we don't know the error
if (count($tokens) == 1) {
display("{$filename} doesn't compile\n");
$return['files'] = 0;
$return['error'] = self::INCOMPILABLE;
return $return;
}
$line = 0;
foreach ($tokens as $token) {
if (is_array($token)) {
$line = $token[2];
$tokenName = token_name($token[0]);
// counting comments
if ($tokenName == 'T_DOC_COMMENT') {
$return['comments'] += substr_count($token[1], "\n") + 1;
} elseif ($tokenName == 'T_COMMENT') {
++$return['comments'];
} elseif ($tokenName == 'T_WHITESPACE') {
++$return['whitespace'];
} else {
if (isset($lines[$line])) {
++$lines[$line];
} else {
$lines[$line] = 1;
}
++$return['tokens'];
}
} else {
++$return['tokens'];
if (!in_array($token, array('{', '}'))) {
if (isset($lines[$line])) {
++$lines[$line];
} else {
$lines[$line] = 1;
}
}
}
}
if (is_array($token) && $tokenName == 'T_CLOSE_TAG') {
--$lines[$line];
if ($lines[$line] == 0) {
unset($lines[$line]);
--$line;
}
}
$return['total'] = $line;
$return['code'] = count($lines);
$return['error'] = self::OK;
return $return;
}