/* ACM Mid-Central Regional Programming Contest */
/* Solution to Problem F, "Instruens Fabulam" */
/* by Dr. Eric Shade, Computer Science Dept. */
/* Southwest Missouri State University */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEFT '<'
#define RIGHT '>'
#define CENTER '='
enum {MAX_ROWS = 21; MAX_COLS = 19};
enum {HEADER; ROW; BOTTOM};
FILE *in;
FILE *out;
int rows; /* number of rows in the table */
int columns; /* number of columns in the table */
char align[MAX_COLS + 1]; /* alignment of each column */
int max_width[MAX_COLS]; /* maximum width of column */
char *entry[MAX_ROWS][MAX_COLS]; /* text of each entry */
int width[MAX_ROWS][MAX_COLS]; /* width of each entry */
char line[80 + 1]; /* the last line read from the file */
int line_type; /* HEADER, ROW, or BOTTOM */
int read_line(void)
{
fgets(line
, sizeof(line
), in
); line
[strlen(line
) - 1] = '\0';
if (line[0] == '*')
line_type = BOTTOM;
else if (line[0]==LEFT || line[0]==RIGHT || line[0]==CENTER)
line_type = HEADER;
else
line_type = ROW;
return line_type;
}
void process_header(void)
{
int c;
for (c = 0; c < columns; ++c)
max_width[c] = 0;
}
void read_rows(void)
{
rows = 0;
while (read_line() == ROW) {
char *s;
int c = 0;
for (s
= strtok(line
, "&"); s
!= NULL
; s
= strtok(NULL
, "&")) {
entry[rows][c] = strdup(s);
width[rows][c] = n;
if (n > max_width[c]) max_width[c] = n;
++c;
}
++rows;
}
}
void print_char(int ch, int n)
{
int i;
for (i
= 0; i
< n
; ++i
) fputc(ch
, out
); }
void print_row(int r)
{
int c;
for (c = 0; c < columns; ++c) {
int n = width[r][c];
int pad = max_width[c] - n;
switch (align[c]) {
case LEFT:
print_char(' ', pad);
break;
case RIGHT:
print_char(' ', pad);
break;
case CENTER:
print_char(' ', pad / 2);
print_char(' ', pad - (pad/2));
}
}
}
void print_separator(int outer_char, int inner_char)
{
int c;
print_char(outer_char, 1);
print_char('-', max_width[0] + 2);
for (c = 1; c < columns; ++c) {
print_char(inner_char, 1);
print_char('-', max_width[c] + 2);
}
print_char(outer_char, 1);
}
int main(void)
{
in
= fopen("fab.in", "r"); out
= fopen("fab.out", "w");
read_line();
while (line_type != BOTTOM) {
int r;
process_header();
read_rows();
print_separator('@', '-');
print_row(0);
print_separator('|', '+');
for (r = 1; r < rows; ++r) print_row(r);
print_separator('@', '-');
}
return 0;
}
LyogQUNNIE1pZC1DZW50cmFsIFJlZ2lvbmFsIFByb2dyYW1taW5nIENvbnRlc3QgKi8KLyogU29sdXRpb24gdG8gUHJvYmxlbSBGLCAiSW5zdHJ1ZW5zIEZhYnVsYW0iICovCi8qIGJ5IERyLiBFcmljIFNoYWRlLCBDb21wdXRlciBTY2llbmNlIERlcHQuICovCi8qIFNvdXRod2VzdCBNaXNzb3VyaSBTdGF0ZSBVbml2ZXJzaXR5ICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIExFRlQgICAnPCcKI2RlZmluZSBSSUdIVCAgJz4nCiNkZWZpbmUgQ0VOVEVSICc9JwoKZW51bSB7TUFYX1JPV1MgPSAyMTsgTUFYX0NPTFMgPSAxOX07CmVudW0ge0hFQURFUjsgUk9XOyBCT1RUT019OwoKRklMRSAqaW47CkZJTEUgKm91dDsKCmludCByb3dzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZSAqLwppbnQgY29sdW1uczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUgKi8KCmNoYXIgYWxpZ25bTUFYX0NPTFMgKyAxXTsgICAgICAgICAgIC8qIGFsaWdubWVudCBvZiBlYWNoIGNvbHVtbiAqLwppbnQgIG1heF93aWR0aFtNQVhfQ09MU107ICAgICAgICAgICAvKiBtYXhpbXVtIHdpZHRoIG9mIGNvbHVtbiAqLwoKY2hhciAqZW50cnlbTUFYX1JPV1NdW01BWF9DT0xTXTsgICAgLyogdGV4dCBvZiBlYWNoIGVudHJ5ICovCmludCB3aWR0aFtNQVhfUk9XU11bTUFYX0NPTFNdOyAgICAgIC8qIHdpZHRoIG9mIGVhY2ggZW50cnkgKi8KCmNoYXIgbGluZVs4MCArIDFdOyAgICAgICAgICAgICAgICAgIC8qIHRoZSBsYXN0IGxpbmUgcmVhZCBmcm9tIHRoZSBmaWxlICovCmludCBsaW5lX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIEhFQURFUiwgUk9XLCBvciBCT1RUT00gKi8KCgoKaW50IHJlYWRfbGluZSh2b2lkKQp7CiAgICBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKTsKICAgIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPSAnXDAnOwogICAgCiAgICBpZiAobGluZVswXSA9PSAnKicpCiAgICAgICAgbGluZV90eXBlID0gQk9UVE9NOwogICAgZWxzZSBpZiAobGluZVswXT09TEVGVCB8fCBsaW5lWzBdPT1SSUdIVCB8fCBsaW5lWzBdPT1DRU5URVIpCiAgICAgICAgbGluZV90eXBlID0gSEVBREVSOwogICAgZWxzZQogICAgICAgIGxpbmVfdHlwZSA9IFJPVzsKICAgIAogICAgcmV0dXJuIGxpbmVfdHlwZTsKfQoKCgp2b2lkIHByb2Nlc3NfaGVhZGVyKHZvaWQpCnsKICAgIGludCBjOwogICAgCiAgICBjb2x1bW5zID0gc3RybGVuKGxpbmUpOwogICAgc3RyY3B5KGFsaWduLCBsaW5lKTsKICAgIAogICAgZm9yIChjID0gMDsgYyA8IGNvbHVtbnM7ICsrYykKICAgICAgICBtYXhfd2lkdGhbY10gPSAwOwp9CgoKCnZvaWQgcmVhZF9yb3dzKHZvaWQpCnsKICAgIHJvd3MgPSAwOwogICAgCiAgICB3aGlsZSAocmVhZF9saW5lKCkgPT0gUk9XKSB7CiAgICAgICAgY2hhciAqczsKICAgICAgICBpbnQgYyA9IDA7CiAgICAgICAgICAgICAgICAKICAgICAgICBmb3IgKHMgPSBzdHJ0b2sobGluZSwgIiYiKTsgcyAhPSBOVUxMOyBzID0gc3RydG9rKE5VTEwsICImIikpIHsKICAgICAgICAgICAgaW50IG4gPSBzdHJsZW4ocyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBlbnRyeVtyb3dzXVtjXSA9IHN0cmR1cChzKTsKICAgICAgICAgICAgd2lkdGhbcm93c11bY10gPSBuOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKG4gPiBtYXhfd2lkdGhbY10pIG1heF93aWR0aFtjXSA9IG47CiAgICAgICAgICAgIAogICAgICAgICAgICArK2M7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICsrcm93czsKICAgIH0KfQoKCgp2b2lkIHByaW50X2NoYXIoaW50IGNoLCBpbnQgbikgCnsKICAgIGludCBpOwogICAgCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBmcHV0YyhjaCwgb3V0KTsKfQoKCgp2b2lkIHByaW50X3JvdyhpbnQgcikKewogICAgaW50IGM7CiAgICAKICAgIGZvciAoYyA9IDA7IGMgPCBjb2x1bW5zOyArK2MpIHsKICAgICAgICBpbnQgbiA9IHdpZHRoW3JdW2NdOwogICAgICAgIGludCBwYWQgPSBtYXhfd2lkdGhbY10gLSBuOwogICAgICAgIAogICAgICAgIGZwcmludGYob3V0LCAifCAiKTsKICAgICAgICBzd2l0Y2ggKGFsaWduW2NdKSB7CiAgICAgICAgICAgIGNhc2UgTEVGVDoKICAgICAgICAgICAgICAgIGZwcmludGYob3V0LCAiJXMiLCBlbnRyeVtyXVtjXSk7CiAgICAgICAgICAgICAgICBwcmludF9jaGFyKCcgJywgcGFkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFJJR0hUOgogICAgICAgICAgICAgICAgcHJpbnRfY2hhcignICcsIHBhZCk7CiAgICAgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiVzIiwgZW50cnlbcl1bY10pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQ0VOVEVSOgogICAgICAgICAgICAgICAgcHJpbnRfY2hhcignICcsIHBhZCAvIDIpOwogICAgICAgICAgICAgICAgZnByaW50ZihvdXQsICIlcyIsIGVudHJ5W3JdW2NdKTsKICAgICAgICAgICAgICAgIHByaW50X2NoYXIoJyAnLCBwYWQgLSAocGFkLzIpKTsKICAgICAgICB9CiAgICAgICAgZnByaW50ZihvdXQsICIgIik7CiAgICB9CiAgICAKICAgIGZwcmludGYob3V0LCAifFxuIik7Cn0KCgoKdm9pZCBwcmludF9zZXBhcmF0b3IoaW50IG91dGVyX2NoYXIsIGludCBpbm5lcl9jaGFyKQp7CiAgICBpbnQgYzsKICAgIAogICAgcHJpbnRfY2hhcihvdXRlcl9jaGFyLCAxKTsKICAgIHByaW50X2NoYXIoJy0nLCBtYXhfd2lkdGhbMF0gKyAyKTsKICAgIAogICAgZm9yIChjID0gMTsgYyA8IGNvbHVtbnM7ICsrYykgewogICAgICAgIHByaW50X2NoYXIoaW5uZXJfY2hhciwgMSk7CiAgICAgICAgcHJpbnRfY2hhcignLScsIG1heF93aWR0aFtjXSArIDIpOwogICAgfQogICAgCiAgICBwcmludF9jaGFyKG91dGVyX2NoYXIsIDEpOwogICAgZnB1dGMoJ1xuJywgb3V0KTsKfQoKCgppbnQgbWFpbih2b2lkKQp7CiAgICBpbiA9IGZvcGVuKCJmYWIuaW4iLCAiciIpOwogICAgb3V0ID0gZm9wZW4oImZhYi5vdXQiLCAidyIpOwogICAgCiAgICByZWFkX2xpbmUoKTsKICAgIHdoaWxlIChsaW5lX3R5cGUgIT0gQk9UVE9NKSB7CiAgICAgICAgaW50IHI7CiAgICAgICAgCiAgICAgICAgcHJvY2Vzc19oZWFkZXIoKTsKICAgICAgICByZWFkX3Jvd3MoKTsKICAgICAgICAKICAgICAgICBwcmludF9zZXBhcmF0b3IoJ0AnLCAnLScpOwogICAgICAgIHByaW50X3JvdygwKTsKICAgICAgICBwcmludF9zZXBhcmF0b3IoJ3wnLCAnKycpOwogICAgICAgIAogICAgICAgIGZvciAociA9IDE7IHIgPCByb3dzOyArK3IpIHByaW50X3JvdyhyKTsKICAgICAgICAKICAgICAgICBwcmludF9zZXBhcmF0b3IoJ0AnLCAnLScpOwogICAgfQogICAgICAgIAogICAgZmNsb3NlKGluKTsKICAgIGZjbG9zZShvdXQpOwogICAgCiAgICByZXR1cm4gMDsKfQo=