On Jul 3, 1:02*am, luserXtrog <mijo...@yahoo.com> wrote:
> On Jul 2, 5:02*am, "lovecreatesbea...@gmail.c0m"
> (how old are you two guys
)
>
> > Sigh.
>
> I turn 31 this year.
> I'm still in awe of Peter's code. It illustrates explicitly what
> I had to do by intuition. That first enum is brilliant.
>
> I think you should be able to extend this to display multiple
> units per line. Try expanding the seg array out to the total
> width, and adding an offset to i which increases by the width
> of unit after each digit.
>
> Sometimes a smoke/porn/tomb-raider break helps see it from a
> different angle.
>
Or all three. Here's my take 2, with garbage refusal:
#include <stdio.h>
#include <string.h>
int ao(int c) {
switch(c) {
case '0':return 0;
case '1':return 1;
case '2':return 2;
case '3':return 3;
case '4':return 4;
case '5':return 5;
case '6':return 6;
case '7':return 7;
case '8':return 8;
case '9':return 9;
case 'A':case 'a':return 10;
case 'B':case 'b':return 11;
case 'C':case 'c':return 12;
case 'D':case 'd':return 13;
case 'E':case 'e':return 14;
case 'F':case 'f':return 15;
default:return -1;
}
}
enum {
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
E = 1 << 4,
F = 1 << 5,
G = 1 << 6,
H = 1 << 7 };
int seg[] = {
/*0*/ A+B+C+D+E+F,
/*1*/ B+C,
/*2*/ A+B+ D+E+ G,
/*3*/ A+B+C+D+ G,
/*4*/ B+C+ F+G,
/*5*/ A+ C+D+ F+G,
/*6*/ A+ C+D+E+F+G,
/*7*/ A+B+C,
/*8*/ A+B+C+D+E+F+G,
/*9*/ A+B+C+ F+G,
/*A*/ A+B+C+ E+F+G,
/*b*/ C+D+E+F+G,
/*C*/ A+ D+E+F,
/*d*/ B+C+D+E+ G,
/*E*/ A+ D+E+F+G,
/*F*/ A+ E+F+G,
};
int print(char *s) {
int r;
for (r=0; r<3; r++) {
int i;
for (i=0; s[i]; i++) {
switch(r) {
case 0:
putchar(' ');
putchar( (seg[ao(s[i])] & A)? '_' : ' ');
putchar(' ');
break;
case 1:
putchar( (seg[ao(s[i])] & F)? '|' : ' ');
putchar( (seg[ao(s[i])] & G)? '_' : ' ');
putchar( (seg[ao(s[i])] & B)? '|' : ' ');
break;
case 2:
putchar( (seg[ao(s[i])] & E)? '|' : ' ');
putchar( (seg[ao(s[i])] & D)? '_' : ' ');
putchar( (seg[ao(s[i])] & C)? '|' : ' ');
break;
}
}
putchar('\n');
}
}
int main(int ac, char **av) {
for (++av,--ac;ac;ac--,av++) {
if (strspn(*av, "012345789abcdefABCDEF") != strlen(*av))
fprintf(stderr, "Hex only!\n");
else
print(*av);
}
return 0;
}
--
lxt