/* A program that will quickly check if the file names passed in via
* command line arguments look like IBCM files. In particular, it
* checks if the first four digits on each line are all hexadecimal
* digits. It does not program validity checking beyond this. It is
* useful to tell the students if, on submission, their programs will
* parse correctly in an IBCM simulator.
*/
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
using namespace std;
int main (int argc, char *argv[]) {
string line;
int linenum = 0;
bool allowComments = false;
// make sure they gave some command-line parameters
if ( argc == 1 ) {
cout << argv[0] << ": no input files" << endl;
exit(1);
}
for ( int i = 1; i < argc; i++ ) {
// a comment has a '//' as the first two characters on a line
if ( !strcmp(argv[i],"-allowcomments") ) {
allowComments = true;
continue;
}
// open the file
ifstream file(argv[i]);
if ( !file.is_open() ) {
cout << argv[0] << ": " << argv[i] << ": no such file" << endl;
exit(2);
}
// read in the entire file...
while ( file.good() ) {
// read in a line from the file
getline (file, line);
linenum++;
// is it the last line of the file?
if ( (line.size() == 0) && (!file.good()) )
break;
// is it a comment?
if ( allowComments && (line.size() >= 2) &&
(line[0] == '/') && (line[1] == '/') )
continue;
// is the line too short?
if ( line.size() < 4 ) {
cout << argv[0] << ": " << argv[i] << " has too short a line on line number " << linenum << "(" << line.size() << ")" << endl;
exit(3);
}
// are the first four digits hex characters?
for ( int j = 0; j < 4; j++ )
if ( !isxdigit(line[j]) ) {
cout << argv[0] << ": " << argv[i] << " invalid hexadecimal digit on line " << linenum << " character " << (j+1) << endl;
exit(3);
}
}
// all done with this file!
file.close();
}
return 0;
}