Name: L. A. Calculus !!wKyoNUUHDOmjW7I 2013-06-20 0:33
CARN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
SIZE = 8192
};
size_t count(const char *s, int c)
{
size_t r;
for (r = 0; *s; r += *s++ == (char) c)
;
return r;
}
size_t max_strcspn(const char *s, int c)
{
size_t max, tmp;
for (max = tmp = 0; *s; s++) {
if (*s != (char) c) {
tmp++;
continue;
}
if (tmp > max)
max = tmp;
tmp = 0;
}
return max;
}
char *fill(char *to, size_t longest, size_t lines, const char *from)
{
char *save = to;
size_t n;
for (n = longest; lines; from++)
if (*from == '\n') {
memset(to, ' ', n);
to += n;
n = longest;
lines--;
} else {
*to++ = *from;
n--;
}
return save;
}
char *readall(FILE *iop)
{
char buf[SIZE];
size_t a = 0, n;
char *r, *tmp;
for (r = 0; (n = fread(buf, 1, SIZE, iop)) == SIZE; r = tmp) {
if (!(tmp = realloc(r, a + SIZE))) {
free(r);
return 0;
}
memcpy(tmp + SIZE, buf, SIZE);
a += SIZE;
}
if (!(tmp = realloc(r, a + n + 1))) {
free(r);
return 0;
}
memcpy(tmp + a, buf, n);
tmp[a + n] = '\0';
return tmp;
}
int main(void)
{
size_t lines, longest;
char *ptr, *s;
if (!(s = readall(stdin))
|| !(ptr = malloc((lines = count(s, '\n')) *
(longest = max_strcspn(s, '\n'))))) {
free(s);
return EXIT_FAILURE;
}
fill(ptr, longest, lines, s);
for (size_t i = 0; i < longest; i++) {
for (size_t n = 0; n < lines; n++)
putchar(ptr[longest * n + i]);
puts("");
}
free(s);
free(ptr);
}