CikiWiki는 2005년 IOCCC에 제출한 제 코드로, CGI 기반의 위키위키를 구현합니다. 위키위키에 대해서는 OriginalWiki나 한국에서 가장 큰 위키 사이트인 노스모크를 참고하세요.
이 프로그램은 다음과 같은 기능을 지원합니다:
아래 코드는 IOCCC에 냈던 코드에서 탭을 공백으로 치환한 것입니다. (이 코드는 가로로 엄청나게 깁니다! 브라우저로 보기 힘들면 아래에서 받아서 보시길 바랍니다.)
#include<stdio.h> #include<stdlib.h> #include<string.h> #define T for( #define O getenv(w+ #define K printf(w+ #define I(O,c,C)C ##c##O #define G(G,\ U)strcspn(G,#U)[G]=0; #define N(N)"<a; href=?"#N"=%s>%s</a>" typedef char _; _* q, p[ 99 ], a[ 99 ]= "_ ", r[ 99 *9 ], b[ 999] ,w [] =" ;} %c} %s} <p >} </ b\ >} </i >} &g t{; } &l t{; } &a mp {; } < /u l>} <h %d>} <pre >} <%s %c>} \ </ h% d>} </ pr e>} <h r> <p >} QU ER Y_ ST RI NG} </ ul >< ul >< li >} RE QU ES T_ M\ ETHOD} CONT ENT_ LE NGTH } <h 1> \"%s\" </h1 ><ul >} < h1>"N( S)"< /h 1>} Co nt en t- Ty pe :text/ html {\n {\n }< li >" N( P) "} </ te xt ar ea >< br >< i\ np ut; ty pe =s ub mi t> </ fo rm >} <h r> <f or m; acti on =? >" N( E) "; or; sear ch; <input; na me=S></for m>} <h 1> "N( P) "</h 1> <for m" "; ac ti on=?E=% s; me th od =p os t> <t ex ta re a; name=x; ro ws =2 5; col s= 80 >} Fr on tP ag e} ", *m =( "rb" ); int i, j, s[ 3] ,u ,v ,l =- 1, c; I( LE ,I ,F)* f, *g; d( _* s, _* t) { T -- s; +* ++ s; u|| (* t++ =* s- 43 ?* s: 32 )) if (u= *s== 37 ){ T i= j= 0; ++i<3; j= j* 16 +( 4- (* s- 8) /10? (( 32|* s) -1 )/6-16 ?+ 666: (* s| 32 )-87 :* s- 48 )) ++ s; j >> 8?(s -= 2, u= 0) :( *t ++ =j ); } * t= 0; } y (){ K( c- 38 ?c +- 60 ?c -62 ?2 :22 :3 *9 :32 ), c); } e( _* p, _* q) { T a[ i= 1] =0; *p; ++ i, ++ i) sprintf (a+i,"%" "0" "2x" ,* (p ++ )); g= fopen( a, q); } o (_ *p ){ *b =0; e( p, m); if (g ){ I(k, ee, fs) (g, 0, I( END ,K_, SEE )); I( ad ,e, fr )( b, 01, 9* 99, I( pen ,eo, fr )( a, m, g) )[ b]=0x0; } } main () { T q=w; c=*q ++; c> 32 &&( w[j ++ ]= c- 59 ?c -123?c -125 ?c :0:*q++ :32)); strcpy (p ,w+ 448 ); +K 190 ); q= (O 85) ); if(v=*q&&q [1]== 61){ q[ 2] && d( q+2 ,p ); if (+ *q == 69 ){ v =2; if (* O 112)%v){ +K 354 ,p ,p ,p ); m= "r" ; o( p); T q =b; c= *q ++; y( )); I( t, xi ,e )( +K 240 )) ;} I( ad, re ,f )(r,1, j= I( i, o, at )( (O 127)) ),stdin )[ r] =0; T e( "","r" ); j&& g&& I( ts ,e, fg )( b, 99 ,g ); j= I( mp, trc ,s )( b, p) )G (b , \r \n )e ("","a" ); (j && g) && I( tf, rin ,fp )( g, "%" "s \n" ,p ); if (q =I(r ,st ,str )( r,"x=" )){ G( q, &)d( q+ 2, (b)); } e( p, "wb" ); g? fputs( b,g):0; } if(+*q == 83 ){ K + 142 ,p ); e( "", "r" ); T f= g; f&& I(s ,et, fg) (r, 99 ,f ); I( tr, trs ,s )( b, p) && +K 215 ,r ,r )) { G (r ,\r \n )o (r ); } exit (K 38) ); } } v|| *q&&d( q,p ); v< 2&&o (p); q= b; T K 160 ,p ,p); * b; v =u ){ c= *q ++ ; if (c- 10 && c- 13 ){ if (l ){ T u= 0; 33== c; u -- )c =* q++; if (!u) (c +- 32 && c- 42 )|| (u =--c %3 ,c =*q ++ ); } if (u -v || !c ){ s[2] && +K 12 ); *s && +K 17 ); *s =s [2 ]= 0; K( v< 0?63:v -2 ?v -1?1 :+70: 38),-v ); if (! c) I( ak, re ,b ); K( u< 0? 44 :u -2?u -1 ?c -45? 1: 8: 50 :+ 103 ), -u); {} } else if (l ){ +u || K( l<0 || (l >1 && !v )? 8: 45 ==c) ); T u- 2|| K( l< 2)* 9+ 98 ); (u == 1) &&l -- ;K 213 )) ;} if (u -1)if (c -+ 95 && c- 39 || *q -c ) if (( !l || u||45- c) || (i =I( pn ,rs, st) (q,"-" )) <3 )if (c >64&& c< 91 ){ T i =j =v =0; ++ i&& !j; (j =( (c |+ 32 )- 19 )/ 26 -3 )|| (v =c &32 ?v ?v :1 :v ?2 :v )) c= *q ++; q[ -1]=00; K(v<2?5: 219 ),q- i,q-i); *--q=c; } else y( ); else { K 77 ); q+= i; } else{ +K 56," /" +8 +( s[c%3] ^=01), "i b"[c% 3* 2] ); q++ ;} else y(); l =0; } else { * q- 10 || c- 13 || ++ q; l<0 || ++ l; } } exit (K 282 ,p, "ed" "it" )); }
이 C 코드는 ANSI C를 지원하는 웬만한 C 컴파일러에서 잘 컴파일됩니다. (Microsoft Visual C++로도 동작하는 것을 확인했습니다.) 단 문자열 길이가 ANSI C가 보장하는 문자열 길이보다 길기 때문에 warning이 발생할 수 있습니다.
컴파일한 후 일반 CGI 프로그램같이 CGI를 실행할 수 있는 디렉토리로 옮기고 실행 권한을 준 뒤 웹 브라우저로 사용하면 됩니다. 모든 위키 페이지는 실행 파일과 같은 디렉토리에 텍스트 파일로 저장되므로, 해당 디렉토리에 쓰기 권한을 줘야 합니다.
이 프로그램이 지원하는 위키 문법은 다음과 같습니다. (PhpWiki, wikiX의 영향을 많이 받았습니다)
<ul>
에 해당)이 됩니다.한 페이지에 891바이트까지 쓸 수 있고 (원래는 좀 많이 잡았는데 코드 만들다 보니까 줄어 들었음 -_-) 페이지 이름은 48바이트까지 쓸 수 있습니다. 실제로 쓰기는 좀 거시기합니다;;
ASCII 문자를 사용하는 시스템(웬만한 것들이 그렇지만;)에서 사용할 수 있으며, 엔디안에는 (아마도) 별 영향을 받지 않습니다. 즉 PowerPC 등에서도 똑같은 방법으로 사용할 수 있습니다.
대부분의 웹 브라우저에서는 이 프로그램이 잘 돌아 가지만, lynx와 같은 몇몇 브라우저들은 RFC 1808을 완벽하게 구현하지 못 해서 페이지 링크가 깨지는 문제가 발생합니다. 만약 텍스트 환경 밖에 못 쓰시겠다면 lynx 대신 w3m을 쓰시길 바랍니다. -_-;;; (links는 안 써 봐서 모르겠습니다.)
마지막으로, 이 프로그램의 이름인 CikiWiki의 Ciki는 토오노 시키(遠野 志貴)와 전혀 관련 없습니다. -_-+
이 코드를 만드는 데 별 도움을 주진 않았지만 관심을 가진 nohmad 님과 krisna 님께, 그리고 klutzy 놈에게 감사합... 음, 아무튼.
설명서(remarks) 번역에 도움을 주신 Puzzlet Chung 님과 Burnhard 님(Bernhard Riedel)께도 감사합니다 :)