using LAview;
public class Main : Object {
static string fname_limits = "";
static string fname_table = "";
static string fname_etalon = "";
static string fname_write = "";
const OptionEntry [] options = {
{ "limits", 'l', 0, OptionArg.FILENAME, ref fname_limits, "File with limits", null },
{ "table", 't', 0, OptionArg.FILENAME, ref fname_table, "File with a table", null },
{ "etalon", 'e', 0, OptionArg.FILENAME, ref fname_etalon, "File with etalon table", null },
{ "write", 'w', 0, OptionArg.FILENAME, ref fname_write, "File to write", null },
{ null }
};
public static int main (string [] args) {
Intl.setlocale (LocaleCategory.ALL, "");
/* commandline arguments processing */
try {
var opt_context = new OptionContext ("- tests LaTeX parser");
opt_context.set_help_enabled (true);
opt_context.add_main_entries (options, null);
opt_context.parse (ref args);
} catch (OptionError e) {
stderr.printf ("error: %s\n", e.message);
stderr.printf ("Run '%s --help' to see a full list of available command line options.\n", args[0]);
return -1;
}
/* read limits */
if (fname_limits == null) {
stderr.printf ("Specify file with limits\n");
return -1;
}
var stream = FileStream.open (fname_limits, "r");
if (stream == null) {
stdout.puts ("Cann't open limits file\n");
return -1;
}
uint lim[3] = { 0, 0, 0};
var limits = new List
();
while (3 == stream.scanf ("%u %u %u", out lim[0], out lim[1], out lim[2])) {
var split_lim = Table.ATable.SplitLimit ();
split_lim.first = lim[0];
split_lim.last = lim[1];
split_lim.max_cols = lim[2];
limits.append (split_lim);
}
/* read table */
if (fname_table == null) {
stderr.printf ("Specify file with a table or read help (%s --help)", args[0]);
return -1;
}
/* load file contents */
string contents;
try {
FileUtils.get_contents (fname_table, out contents);
} catch (FileError e) {
stderr.printf ("error: %s\n", e.message);
return -1;
}
/* parse TeX */
Glob doc;
try {
doc = LAview.parse (contents);
stdout.printf ("TeX document successfully parsed\n");
} catch (Parsers.ParseError e) {
stderr.printf ("Error parsing TeX document: %s\n", e.message);
return -1;
}
/* find a longtable object */
Table.Longtable table = null;
foreach (var subdoc in doc) {
if (subdoc is Table.Longtable) {
table = subdoc as Table.Longtable;
break;
}
}
if (table == null) {
stderr.puts ("longtable object not found\n");
return -1;
}
/* split the table */
try {
table.split (doc, limits);
} catch (Table.SplitError e) {
stderr.puts (e.message);
return -1;
}
/* load etalon file */
if (fname_etalon != null) {
try {
FileUtils.get_contents (fname_etalon, out contents);
} catch (FileError e) {
stderr.printf ("error: %s\n", e.message);
return -1;
}
}
/* generate */
var generated = doc.generate ();
/* compare with an etalon */
if (contents == generated)
stdout.puts ("Etalon and generated text are EQUAL ;-)\n");
else
stdout.puts ("Etalon and generated text are NOT EQUAL ;-(\n");
stdout.printf ("--- Generated plain-TeX (generated) ---\n%s", generated);
/* write to file */
if (fname_write != null )
try {
FileUtils.set_contents (fname_write, generated);
} catch (FileError e) {
stderr.printf ("error: %s\n", e.message);
return -1;
}
return 0;
}
}