public static function parseRulesFile()
{
$filename = 'libraries/advisory_rules.txt';
$file = file($filename, FILE_IGNORE_NEW_LINES);
$errors = array();
$rules = array();
$lines = array();
if ($file === FALSE) {
$errors[] = sprintf(__('Error in reading file: The file \'%s\' does not exist or is not readable!'), $filename);
return array('rules' => $rules, 'lines' => $lines, 'errors' => $errors);
}
$ruleSyntax = array('name', 'formula', 'test', 'issue', 'recommendation', 'justification');
$numRules = count($ruleSyntax);
$numLines = count($file);
$ruleNo = -1;
$ruleLine = -1;
for ($i = 0; $i < $numLines; $i++) {
$line = $file[$i];
if ($line == "" || $line[0] == '#') {
continue;
}
// Reading new rule
if (substr($line, 0, 4) == 'rule') {
if ($ruleLine > 0) {
$errors[] = sprintf(__('Invalid rule declaration on line %1$s, expected line ' . '%2$s of previous rule.'), $i + 1, $ruleSyntax[$ruleLine++]);
continue;
}
if (preg_match("/rule\\s'(.*)'( \\[(.*)\\])?\$/", $line, $match)) {
$ruleLine = 1;
$ruleNo++;
$rules[$ruleNo] = array('name' => $match[1]);
$lines[$ruleNo] = array('name' => $i + 1);
if (isset($match[3])) {
$rules[$ruleNo]['precondition'] = $match[3];
$lines[$ruleNo]['precondition'] = $i + 1;
}
} else {
$errors[] = sprintf(__('Invalid rule declaration on line %s.'), $i + 1);
}
continue;
} else {
if ($ruleLine == -1) {
$errors[] = sprintf(__('Unexpected characters on line %s.'), $i + 1);
}
}
// Reading rule lines
if ($ruleLine > 0) {
if (!isset($line[0])) {
continue;
// Empty lines are ok
}
// Non tabbed lines are not
if ($line[0] != "\t") {
$errors[] = sprintf(__('Unexpected character on line %1$s. Expected tab, but ' . 'found "%2$s".'), $i + 1, $line[0]);
continue;
}
$rules[$ruleNo][$ruleSyntax[$ruleLine]] = chop(mb_substr($line, 1));
$lines[$ruleNo][$ruleSyntax[$ruleLine]] = $i + 1;
++$ruleLine;
}
// Rule complete
if ($ruleLine == $numRules) {
$ruleLine = -1;
}
}
return array('rules' => $rules, 'lines' => $lines, 'errors' => $errors);
}