scriptreader.cxx

changeset 7
118d3d5db64f
parent 3
08cab2b67dce
child 8
c8bfa7e6ae1b
--- a/scriptreader.cxx	Sat Jul 14 01:49:32 2012 +0300
+++ b/scriptreader.cxx	Sat Jul 14 02:16:48 2012 +0300
@@ -53,9 +53,11 @@
 	return false;
 }
 
-ScriptReader::ScriptReader (char* path) {
+ScriptReader::ScriptReader (str path) {
+	atnewline = false;
+	filepath = path;
 	if (!(fp = fopen (path, "r"))) {
-		error ("couldn't open %s for reading!\n", path);
+		error ("couldn't open %s for reading!\n", path.chars ());
 		exit (1);
 	}
 	
@@ -73,9 +75,14 @@
 	if (!fread (c, sizeof (char), 1, fp))
 		return 0;
 	
-	// If we just read a new line, increase current line number counter.
+	// We're at a newline, thus next char read will begin the next line
+	if (atnewline) {
+		atnewline = false;
+		curline++;
+	}
+	
 	if (c[0] == '\n')
-		curline++;
+		atnewline = true;
 	
 	return c[0];
 }
@@ -157,17 +164,28 @@
 void ScriptReader::MustNext (const char* c) {
 	if (!Next()) {
 		if (strlen (c))
-			ParseError ("expected `%s`, reached end of file instead\n", c);
+			ParserError ("expected `%s`, reached end of file instead\n", c);
 		else
-			ParseError ("expected a token, reached end of file instead\n");
+			ParserError ("expected a token, reached end of file instead\n");
 	}
 	
 	if (strlen (c) && token.compare (c) != 0) {
-		ParseError ("expected `%s`, got `%s` instead", c, token.chars());
+		ParserError ("expected `%s`, got `%s` instead", c, token.chars());
 	}
 }
 
-void ScriptReader::ParseError (const char* message, ...) {
+void ScriptReader::ParserError (const char* message, ...) {
+	PERFORM_FORMAT (message, outmessage);
+	ParserMessage ("\nParse error\n", outmessage);
+	exit (1);
+}
+
+void ScriptReader::ParserWarning (const char* message, ...) {
 	PERFORM_FORMAT (message, outmessage);
-	error ("Parse error on line %d:\n%s\n", curline, outmessage);
+	ParserMessage ("Warning: ", outmessage);
+}
+
+void ScriptReader::ParserMessage (const char* header, char* message) {
+	fprintf (stderr, "%sIn file %s, on line %d: %s\n",
+		header, filepath.chars(), curline, message);
 }
\ No newline at end of file

mercurial