#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <getopt.h>
#define spc(x, xs, c) \
((x) % (xs) == 0 ? (c) : ' ')
void line(size_t xwidth, size_t xlength, size_t space, const char* c)
{
size_t x;
for (x = 0; x < xwidth; ++x)
{
}
for (; x < xlength; ++x)
{
}
for (; x < xlength + xwidth; ++x)
{
}
for (; x < xlength * 2; ++x)
{
}
for (; x < xlength * 2 + xwidth; ++x)
{
}
}
void draw(size_t size, size_t thickness, size_t spacing, char c)
{
size_t xwidth = thickness * spacing;
size_t xlength = size * spacing;
size_t ywidth = thickness;
size_t ylength = size;
size_t y;
for (y = 0; y < ywidth; ++y)
{
char chars[] = {c, ' ', c, c, c};
line(xwidth, xlength, spacing, chars);
}
for (; y < ylength; ++y)
{
char chars[] = {c, ' ', c, ' ', ' '};
line(xwidth, xlength, spacing, chars);
}
for (; y < ylength + ywidth; ++y)
{
char chars[] = {c, c, c, c, c,};
line(xwidth, xlength, spacing, chars);
}
for (; y < ylength * 2; ++y)
{
char chars[] = {' ', ' ', c, ' ', c};
line(xwidth, xlength, spacing, chars);
}
for (; y < ylength * 2 + ywidth; ++y)
{
char chars[] = {c, c, c, ' ', c};
line(xwidth, xlength, spacing, chars);
}
}
size_t parse_number(const char* string)
{
size_t value;
char* ptr;
if (value == 0 || value == ULONG_MAX || ptr == NULL || *ptr != '\0')
{
fprintf(stderr
, "Not a valid number: %s\n", optarg
); }
return value;
}
int main(int argc, char **argv)
{
size_t armlength = 3;
size_t thickness = 2;
size_t spacing = 2;
char character = 'x';
int opt;
while ((opt = getopt(argc, argv, "-:l:w:s:h")) != -1)
{
switch (opt)
{
case ':':
fprintf(stderr
, "Option -%c requires a value\n", optopt
);
case '?':
fprintf(stderr
, "Unknown option -%c\n", optopt
);
case 'l':
armlength = parse_number(optarg);
break;
case 'w':
thickness = parse_number(optarg);
break;
case 's':
spacing = parse_number(optarg);
break;
case 'h':
fprintf(stderr
, "Usage: %s [-l <arm length>] [-w <arm thickness>] [-s <horizontal spacing>]\n", argv
[0]); }
}
draw(armlength, thickness, spacing, character);
}
I2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxnZXRvcHQuaD4KCiNkZWZpbmUgc3BjKHgsIHhzLCBjKSBcCiAgICAoKHgpICUgKHhzKSA9PSAwID8gKGMpIDogJyAnKQoKCnZvaWQgbGluZShzaXplX3QgeHdpZHRoLCBzaXplX3QgeGxlbmd0aCwgc2l6ZV90IHNwYWNlLCBjb25zdCBjaGFyKiBjKQp7CiAgICBzaXplX3QgeDsKCiAgICBmb3IgKHggPSAwOyB4IDwgeHdpZHRoOyArK3gpCiAgICB7CiAgICAgICAgcHV0Y2hhcihzcGMoeCwgc3BhY2UsIGNbMF0pKTsKICAgIH0KCiAgICBmb3IgKDsgeCA8IHhsZW5ndGg7ICsreCkKICAgIHsKICAgICAgICBwdXRjaGFyKHNwYyh4LCBzcGFjZSwgY1sxXSkpOwogICAgfQoKICAgIGZvciAoOyB4IDwgeGxlbmd0aCArIHh3aWR0aDsgKyt4KQogICAgewogICAgICAgIHB1dGNoYXIoc3BjKHgsIHNwYWNlLCBjWzJdKSk7CiAgICB9CgogICAgZm9yICg7IHggPCB4bGVuZ3RoICogMjsgKyt4KQogICAgewogICAgICAgIHB1dGNoYXIoc3BjKHgsIHNwYWNlLCBjWzNdKSk7CiAgICB9CgogICAgZm9yICg7IHggPCB4bGVuZ3RoICogMiArIHh3aWR0aDsgKyt4KQogICAgewogICAgICAgIHB1dGNoYXIoc3BjKHgsIHNwYWNlLCBjWzRdKSk7CiAgICB9CgogICAgcHV0Y2hhcignXG4nKTsKfQoKCnZvaWQgZHJhdyhzaXplX3Qgc2l6ZSwgc2l6ZV90IHRoaWNrbmVzcywgc2l6ZV90IHNwYWNpbmcsIGNoYXIgYykKewogICAgc2l6ZV90IHh3aWR0aCA9IHRoaWNrbmVzcyAqIHNwYWNpbmc7CiAgICBzaXplX3QgeGxlbmd0aCA9IHNpemUgKiBzcGFjaW5nOwogICAgc2l6ZV90IHl3aWR0aCA9IHRoaWNrbmVzczsKICAgIHNpemVfdCB5bGVuZ3RoID0gc2l6ZTsKICAgIHNpemVfdCB5OwoKICAgIGZvciAoeSA9IDA7IHkgPCB5d2lkdGg7ICsreSkKICAgIHsKICAgICAgICBjaGFyIGNoYXJzW10gPSB7YywgJyAnLCBjLCBjLCBjfTsKICAgICAgICBsaW5lKHh3aWR0aCwgeGxlbmd0aCwgc3BhY2luZywgY2hhcnMpOwogICAgfQoKICAgIGZvciAoOyB5IDwgeWxlbmd0aDsgKyt5KQogICAgewogICAgICAgIGNoYXIgY2hhcnNbXSA9IHtjLCAnICcsIGMsICcgJywgJyAnfTsKICAgICAgICBsaW5lKHh3aWR0aCwgeGxlbmd0aCwgc3BhY2luZywgY2hhcnMpOwogICAgfQoKICAgIGZvciAoOyB5IDwgeWxlbmd0aCArIHl3aWR0aDsgKyt5KQogICAgewogICAgICAgIGNoYXIgY2hhcnNbXSA9IHtjLCBjLCBjLCBjLCBjLH07CiAgICAgICAgbGluZSh4d2lkdGgsIHhsZW5ndGgsIHNwYWNpbmcsIGNoYXJzKTsKICAgIH0KCiAgICBmb3IgKDsgeSA8IHlsZW5ndGggKiAyOyArK3kpCiAgICB7CiAgICAgICAgY2hhciBjaGFyc1tdID0geycgJywgJyAnLCBjLCAnICcsIGN9OwogICAgICAgIGxpbmUoeHdpZHRoLCB4bGVuZ3RoLCBzcGFjaW5nLCBjaGFycyk7CiAgICB9CgogICAgZm9yICg7IHkgPCB5bGVuZ3RoICogMiArIHl3aWR0aDsgKyt5KQogICAgewogICAgICAgIGNoYXIgY2hhcnNbXSA9IHtjLCBjLCBjLCAnICcsIGN9OwogICAgICAgIGxpbmUoeHdpZHRoLCB4bGVuZ3RoLCBzcGFjaW5nLCBjaGFycyk7CiAgICB9Cn0KCgpzaXplX3QgcGFyc2VfbnVtYmVyKGNvbnN0IGNoYXIqIHN0cmluZykKewogICAgc2l6ZV90IHZhbHVlOwogICAgY2hhciogcHRyOwoKICAgIHZhbHVlID0gc3RydG91bChzdHJpbmcsICZwdHIsIDApOwogICAgaWYgKHZhbHVlID09IDAgfHwgdmFsdWUgPT0gVUxPTkdfTUFYIHx8IHB0ciA9PSBOVUxMIHx8ICpwdHIgIT0gJ1wwJykKICAgIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIHZhbGlkIG51bWJlcjogJXNcbiIsIG9wdGFyZyk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICByZXR1cm4gdmFsdWU7Cn0KCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIHNpemVfdCBhcm1sZW5ndGggPSAzOwogICAgc2l6ZV90IHRoaWNrbmVzcyA9IDI7CiAgICBzaXplX3Qgc3BhY2luZyA9IDI7CiAgICBjaGFyIGNoYXJhY3RlciA9ICd4JzsKICAgIGludCBvcHQ7CgogICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIi06bDp3OnM6aCIpKSAhPSAtMSkKICAgIHsKICAgICAgICBzd2l0Y2ggKG9wdCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJzonOgogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPcHRpb24gLSVjIHJlcXVpcmVzIGEgdmFsdWVcbiIsIG9wdG9wdCk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwoKICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIC0lY1xuIiwgb3B0b3B0KTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CgogICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgICAgIGFybWxlbmd0aCA9IHBhcnNlX251bWJlcihvcHRhcmcpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIHRoaWNrbmVzcyA9IHBhcnNlX251bWJlcihvcHRhcmcpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgIHNwYWNpbmcgPSBwYXJzZV9udW1iZXIob3B0YXJnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWwgPGFybSBsZW5ndGg+XSBbLXcgPGFybSB0aGlja25lc3M+XSBbLXMgPGhvcml6b250YWwgc3BhY2luZz5dXG4iLCBhcmd2WzBdKTsKICAgICAgICAgICAgICAgIGV4aXQoMik7CiAgICAgICAgfQogICAgfQoKICAgIGRyYXcoYXJtbGVuZ3RoLCB0aGlja25lc3MsIHNwYWNpbmcsIGNoYXJhY3Rlcik7CiAgICBleGl0KDApOwp9Cg==