From c66ad87d24f507de21f784591e8d5f361ea3c55f Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Tue, 12 Jan 2010 18:27:49 +0000 Subject: [PATCH] Add knot Convert a textual description of a knot into a graphical description using HTML tables. --- knot/.gitignore | 3 ++ knot/hitch.txt | 8 +++++ knot/html.ct | 41 +++++++++++++++++++++++ knot/img/ld.png | Bin 0 -> 1098 bytes knot/img/lr.png | Bin 0 -> 276 bytes knot/img/lu.png | Bin 0 -> 1103 bytes knot/img/rd.png | Bin 0 -> 1031 bytes knot/img/ru.png | Bin 0 -> 1087 bytes knot/img/ud.png | Bin 0 -> 282 bytes knot/knot.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ knot/knot.h | 14 ++++++++ knot/mkfile | 10 ++++++ 12 files changed, 161 insertions(+) create mode 100644 knot/.gitignore create mode 100644 knot/hitch.txt create mode 100644 knot/html.ct create mode 100644 knot/img/ld.png create mode 100644 knot/img/lr.png create mode 100644 knot/img/lu.png create mode 100644 knot/img/rd.png create mode 100644 knot/img/ru.png create mode 100644 knot/img/ud.png create mode 100644 knot/knot.c create mode 100644 knot/knot.h create mode 100644 knot/mkfile diff --git a/knot/.gitignore b/knot/.gitignore new file mode 100644 index 0000000..d201525 --- /dev/null +++ b/knot/.gitignore @@ -0,0 +1,3 @@ +html.c +*.html +knot diff --git a/knot/hitch.txt b/knot/hitch.txt new file mode 100644 index 0000000..a131f4b --- /dev/null +++ b/knot/hitch.txt @@ -0,0 +1,8 @@ + | +.---..--. +'|. ||.-|-+ + ||.-|-.| +.||-||-||--- +'-|-'|'-' + ||'-' | + |'----' diff --git a/knot/html.ct b/knot/html.ct new file mode 100644 index 0000000..40fbe44 --- /dev/null +++ b/knot/html.ct @@ -0,0 +1,41 @@ +<% #include "knot.h" %> + +<% static void print_img(int ptrn) { %> + <% if (ptrn) { %> + + <% if (ptrn & RIGHT) printf("r"); %> + <% if (ptrn & UP ) printf("u"); %> + <% if (ptrn & DOWN ) printf("d"); %>.png"> + <% } %> +<% } %> + +<% void print_index(tile_t **tiles) { %> + + + Knot + + + + + + + <% for (int row = 1; row < 10; row++) { %> + + <% for (int col = 1; col < 30; col++) { %> + + <% } %> + + <% } %> +
+ <% print_img(tiles[row][col].bot); %> + <% print_img(tiles[row][col].top); %> +
+ + +<% } %> diff --git a/knot/img/ld.png b/knot/img/ld.png new file mode 100644 index 0000000000000000000000000000000000000000..232d866fbcf6f51b6637dffc8973d9bb0d04ab9d GIT binary patch literal 1098 zcmV-Q1hxB#P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igG) z5f})W_CX>@2HM@dakSAh-}000A}Nkl+kDS@T1xrAi2CGDYyNYV|-QlvY??EHE#6Q08uLwEBg-I*^8%zG@e zZ$I;UzxR8;-&=z=N<`2h!!X+RtPBZP3LpiL0!RU*08#)cfD}LqAO(;DNCBh(k|+ac z0&17+Z@_P5t+8cq(Vt*tF_97iT6C-<|8KY(fA zxK04ATn7fAs@ZIc>$);MJ^d~a>%f(c1)$3FJh5$ChK7csK>QAT+0g)0RjXAg6bexw z9s!?rJb*xzN=15md!s;nod^JdpD35hQ4sC{CpsQLptZF%85tFI;oz&;QzBnChL zA!0h5NeqC%Cxjg1OJGO`fW3S`+^W~>^z`(oT~B~>hn){NGD*=~E{E&7YS&rdnvVVS zky1p&IMVSxAgs{dVLlN)K-K#CI{p3qYS$&;PDlFyRr!3La=EN_T?alm)U5DPlkfZV z_4Tp2xfyib0=`Rx1ps6+8Eo5DyDkGCCaN|#GBQG;P*BHuDKS$Z(89t3#bPmN{te^- zuWf}9Kn%kW(==spa8NAEl9`#ABeg7sQtn@AsSTQ@DVAkPtyYU2fNk6A*s5BKqlRIK zWm&NT@H{U(uFns{8FmB1z{TCt)>~hi&1Per8lf`WZ5{q+7ht7KknE8KJyaz0r(8~7+`sMnT?GN#>dC?9b_;JYPA~G>Yfi= z0e;aMoB=Wm{grOPEg!XM^^+Gpi QX#fBK07*qoM6N<$f^`hm(EtDd literal 0 HcmV?d00001 diff --git a/knot/img/lr.png b/knot/img/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..256c562ab506407f061b15a87583dffe9e2bfb2a GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg4Mjk;acI&LAAY&v;Tq8=H^K)}k z^GX<;i&7IyQd1PlGfOfQ+&z5*!W;R-fr|1yT^vIyZoR#EP>?}EfXT4r&HhxKmK;vW zpB2kPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igG) z5g0VKjHXHe000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000B3Nkl6RqSUgqSK#&Q7Ac%NSK|Cot zcqwiS55f*bFCL0Qd)O|sR0VMdN2Rs6L=QHsO+GJq@)p`{ZPJ%y%O4)R7fSMdzxU;P z?|rER=c4}|B8ZSANvvxEIO6195r?)!+88BLO}OPik2=aa0|Ns>JhnyIU#|hgS!ZNq zLvp?N^c{dK%cLlZ&`nM!<#IXRwl}UHu_Z|& zS(YgtkCUP(o`!lmB@zi9z-2d`kBTZ|^{TbCHEeEfvf&1RSGyEQgdd0du1qGw51+eU zUnC!gK(ScF#KZ&}{X{4m$adAI89zEU=uwQtH!?P0&8<|_cU0}lbXxsM5S z)O?czG)=?M(2fe%YXFz_10e7@pxJC9nN0GRHUL}`@^G)i-ZV{nrI!Gl>%#uv<^a<) z?PV?kaJ9<`3?_gM&fo4Kf`bQOdwaWG*x&E*6%G~vRaI$xeBAE*0|z-QH~`wL^910I z!z3OI0Bv@71R&$WD&}th)oPWdrl#zU{{V2orDfco01U(EH0y5xBwXCb_zys#P@v)A z;daj7?ZZaSKLA!&SKDQH_9f?RpLVj|0?>7xa=Dznbj{i?05|%)l@|}dFbpb}%l6Mz zd@}$%1aM5iSw;*1RaGgU&$rvY^6j_f_;FDuNv8m!{Eb?z78;EPG)+ULQbDOyLO!3z z^78VY-!A}U0lWa9BVeK)+ZU@+djL#_}&2p|Ly0tf+w073vEfDk|kAOsKs2mu^M{R6e^ V_bP5jaF+l8002ovPDHLkV1mE()=K~Y literal 0 HcmV?d00001 diff --git a/knot/img/rd.png b/knot/img/rd.png new file mode 100644 index 0000000000000000000000000000000000000000..90f74ad1562315110928f9ecde799e60617fdfe7 GIT binary patch literal 1031 zcmV+i1o-=jP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igG) z5g8*aL=wyZ000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000AGNklvM53t#w@_%FORheSwAAG8y=!xS2;75k_x``{-FqM3cLqL6 z2!RS2hT+@2Vhp$<01SnrB zDhbDN#Mai9=tW@%un7G2n$Bjk!nSSEYPCea3M+sDu;MkI%jHC^Rug_Ii~t^aji=LT zvAVh{f>4+MWPwj!^W}26=l6R*0k{VIkd4pG%!qouE`nAV0Nm~tbyd<0;Gx&N<2XX4 zbOLzh-QoWyf!Xf>p33Ge%MzQLn?i?l0C?a{U)$}r&?VIX=E7uNHGnJLWv|=3N&sWP zy1e1(dgr}TRS$RvTz3b}W|LGZH84fdyRv!5aYAEWML}drSB4jsJ>Y|!+lNs>?g6vF zTX#^e*BKuVU!gY0J>ao>Q7)H5X&xY`6>uMT0gz6oX*3$dV&QB;1u?5(pyUp0+YYVy zpa3ia#{qJ=9ECz5+`Yj7UV-&aUyfR>Mn0b(sAlU8xpW;SEiEkx(=^5862dSH zH$U-JA6)>pZEH8(Xf%Xrnj(=%?A9OjO{e7>`_Z)MN2Y1YQC0%rp4_g|xztBTN4pvQ z3ETnB0V6>i04ur*o30iX7P=Wt%d)zezo=^WpOwp8A&C5PXPGP0 z8~5SWYE}6=?=k-x4Ih7faVMaq;9C|7z_COMvSzNZb( zkL5D8O`=#-MtyE>POeD32Wq^`l&*!`!E8vuSk;!C~5U*4!v|259 z_zU=^6Tr4>RpstVr6LcX=q`vHb1#y~q!IvYYisiGvu*&}VUNe-N&swZY{Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igG) z5g8Pe`M1LW000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000A;Nkl}ZBQ0O6hbZ3g?ic2vUOz+dXp*G^;EDGK_Uu*AR_p2 zTS4r>OQE^#p|F9y7Iw)V=2S|+gWd!qQ=8(Yp{JEJ?Q~ct0uu1QY%DA+Xf;1QJ*|dkfyX=fTzdlQ$4|g%fcExw zY}?i*Ae+syw6uily7Hv~-~{kDu&%8i>R8;|+!VTT9LHY|v=_!_^1`K3Ntj@2YHB+P zbB)XscEUq>(OfPkOp(v${e@8;uYpT7865%EzdFCD7pzvR!X&nB`{xOtIs(O&CoU8U z!Ze=e3EQ^))8?iMxGYbc$z(*B$mjFIwr$bd+bfdEWIa2qMi()Bt24>kSlb8Sx-J6) z1B98N3qcilB7=#E3Bpd$836Dj@KVYx7K;oH4n|4QHbTM{I3v zMWP1yGodbFa&pqR1l}3i{lj5xZ7os)0Pd&~`uqE}?)RGk8jeN_gtd)W{4)o!UrfI~nJa1clV?ZDnZ1sM9j zz<04G7+PWhv4B`WEFcyT3y1~80%8HNfLK5*AQlis-T{1kSL%uqFirpf002ovPDHLk FV1gli;X?ob literal 0 HcmV?d00001 diff --git a/knot/img/ud.png b/knot/img/ud.png new file mode 100644 index 0000000000000000000000000000000000000000..059dc950f0f9dd7049378d2cceb91c537d96f36c GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBh@*9zkAX`Pi#}fkKict`Q~9`MJ5N zc_j?aMX8A;sVNHOnI#zt?w-B@;f;LaKt-jVE{-7;x87dZ$je~J!)*Ba`~90QoAQ~< zIZY36ChXd+=Dmse^0kBMf9;GjYrp;g>Yx}L;EmqBfU8z+{jBRCvpik>T-G@yGywo; C*gvfR literal 0 HcmV?d00001 diff --git a/knot/knot.c b/knot/knot.c new file mode 100644 index 0000000..13954d1 --- /dev/null +++ b/knot/knot.c @@ -0,0 +1,85 @@ +#include +#include + +#include "knot.h" + +static void do_tile(tile_t **tiles, int row, int col) +{ + tile_t *t = &tiles[row][col]; + tile_t *l = &tiles[row][col-1]; + tile_t *r = &tiles[row][col+1]; + tile_t *u = &tiles[row-1][col]; + //tile_t *d = &tiles[row+1][col]; + + /* Fill in what we know */ + switch (tiles[row][col].c) { + case '-': t->top = LEFT | RIGHT; break; + case '|': t->top = UP | DOWN; break; + case '\'': t->top = UP; break; + case '.': t->top = DOWN; break; + } + + /* Follow bottoms */ + if (t->c == '|' && (l->top | l->bot) & RIGHT) + t->bot = LEFT | RIGHT; + if (t->c == '-' && (u->top | u->bot) & DOWN) + t->bot = UP | DOWN; + + /* Adds sides for ''s and .'s */ + if (t->c == '.' || t->c == '\'') { + if ((l->top | l->bot) & RIGHT) + t->top |= LEFT; + else + t->top |= RIGHT; + } + +} + +static void print_ptrn(int ptrn) +{ + printf("%c", ptrn & LEFT ? '<' : '-'); + printf("%c", ptrn & RIGHT ? '>' : '-'); + printf("%c", ptrn & UP ? '^' : '-'); + printf("%c", ptrn & DOWN ? 'v' : '-'); +} + +int main() +{ + /* Init tiles */ + tile_t *tiles[64]; + for (int i = 0; i < 64; i++) + tiles[i] = calloc(512, sizeof(tile_t)); + + /* Read data */ + char c; + int row = 1, col = 1; + while ((c = getchar()) != EOF) { + if (row > 63 || col > 511) + exit(-1); + if (c == '\n') { + row++; + col = 1; + } else { + tiles[row][col].c = c; + col++; + } + } + + /* Process */ + for (row = 1; row < 63; row++) + for (col = 1; col < 511; col++) + do_tile(tiles, row, col); + + /* Output */ + //for (row = 1; row < 63; row++) { + // for (col = 1; col < 511; col++) { + // print_ptrn(tiles[row][col].top); + // print_ptrn(tiles[row][col].bot); + // printf(" "); + // } + // printf("\n"); + //} + + /* HTML */ + print_index(tiles); +} diff --git a/knot/knot.h b/knot/knot.h new file mode 100644 index 0000000..0e77797 --- /dev/null +++ b/knot/knot.h @@ -0,0 +1,14 @@ +enum { + LEFT = 1<<0, + RIGHT = 1<<1, + UP = 1<<2, + DOWN = 1<<3, +}; + +typedef struct { + char c; + int top; + int bot; +} tile_t; + +void print_index(tile_t **tiles); diff --git a/knot/mkfile b/knot/mkfile new file mode 100644 index 0000000..f38e2c9 --- /dev/null +++ b/knot/mkfile @@ -0,0 +1,10 @@ +PROGS=knot +CLEAN=html.c *.html + +default:V: hitch.html +knot: knot.o html.o knot.h + +%.html: $PROGS %.txt + ./$PROGS < $stem.txt > $stem.html + +<../mkcommon -- 2.43.2