mirror of https://github.com/dirtbags/moth.git
add 2012 generalstatics.com site
This commit is contained in:
parent
4d457b2b43
commit
fd26e233ac
Binary file not shown.
After Width: | Height: | Size: 178 KiB |
|
@ -0,0 +1,241 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "cgi.h"
|
||||||
|
|
||||||
|
#ifdef NODUMP
|
||||||
|
# define DUMPf(fmt, args...)
|
||||||
|
#else
|
||||||
|
# define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
|
||||||
|
#endif
|
||||||
|
#define DUMP() DUMPf("")
|
||||||
|
#define DUMP_d(v) DUMPf("%s = %d", #v, v)
|
||||||
|
#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
|
||||||
|
#define DUMP_s(v) DUMPf("%s = %s", #v, v)
|
||||||
|
#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
|
||||||
|
#define DUMP_p(v) DUMPf("%s = %p", #v, v)
|
||||||
|
|
||||||
|
|
||||||
|
#define POST_MAX 1024
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CGI
|
||||||
|
*/
|
||||||
|
static int is_cgi = 0;
|
||||||
|
static char **argv = NULL;
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_char_argv()
|
||||||
|
{
|
||||||
|
static int arg = 0;
|
||||||
|
static char *p;
|
||||||
|
|
||||||
|
if (NULL == argv) {
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == arg) {
|
||||||
|
arg = 1;
|
||||||
|
p = argv[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! p) {
|
||||||
|
return EOF;
|
||||||
|
} else if (! *p) {
|
||||||
|
arg += 1;
|
||||||
|
p = argv[arg];
|
||||||
|
return '&';
|
||||||
|
}
|
||||||
|
|
||||||
|
return *(p++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_char_stdin()
|
||||||
|
{
|
||||||
|
static int inlen = -1;
|
||||||
|
|
||||||
|
if (-1 == inlen) {
|
||||||
|
char *p = getenv("CONTENT_LENGTH");
|
||||||
|
if (p) {
|
||||||
|
inlen = atoi(p);
|
||||||
|
if (inlen > POST_MAX) {
|
||||||
|
inlen = POST_MAX;
|
||||||
|
}
|
||||||
|
if (inlen < 0) {
|
||||||
|
inlen = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
inlen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inlen) {
|
||||||
|
inlen -= 1;
|
||||||
|
return getchar();
|
||||||
|
}
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
read_char_query_string()
|
||||||
|
{
|
||||||
|
static char *p = (char *)-1;
|
||||||
|
|
||||||
|
if ((char *)-1 == p) {
|
||||||
|
p = getenv("QUERY_STRING");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! p) {
|
||||||
|
return EOF;
|
||||||
|
} else if (! *p) {
|
||||||
|
return EOF;
|
||||||
|
} else {
|
||||||
|
return *(p++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int (* read_char)() = read_char_argv;
|
||||||
|
|
||||||
|
int
|
||||||
|
cgi_init(char *global_argv[])
|
||||||
|
{
|
||||||
|
char *rm = getenv("REQUEST_METHOD");
|
||||||
|
|
||||||
|
if (! rm) {
|
||||||
|
read_char = read_char_argv;
|
||||||
|
argv = global_argv;
|
||||||
|
} else if (0 == strcmp(rm, "POST")) {
|
||||||
|
read_char = read_char_stdin;
|
||||||
|
is_cgi = 1;
|
||||||
|
} else if (0 == strcmp(rm, "GET")) {
|
||||||
|
read_char = read_char_query_string;
|
||||||
|
is_cgi = 1;
|
||||||
|
} else {
|
||||||
|
printf(("405 Method not allowed\r\n"
|
||||||
|
"Allow: GET, POST\r\n"
|
||||||
|
"Content-type: text/plain\r\n"
|
||||||
|
"\r\n"
|
||||||
|
"%s is not allowed.\n"),
|
||||||
|
rm);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char
|
||||||
|
tonum(int c)
|
||||||
|
{
|
||||||
|
if ((c >= '0') && (c <= '9')) {
|
||||||
|
return c - '0';
|
||||||
|
}
|
||||||
|
if ((c >= 'a') && (c <= 'f')) {
|
||||||
|
return 10 + c - 'a';
|
||||||
|
}
|
||||||
|
if ((c >= 'A') && (c <= 'F')) {
|
||||||
|
return 10 + c - 'A';
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char
|
||||||
|
read_hex()
|
||||||
|
{
|
||||||
|
int a = read_char();
|
||||||
|
int b = read_char();
|
||||||
|
|
||||||
|
return tonum(a)*16 + tonum(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read a key or a value. Since & and = aren't supposed to appear
|
||||||
|
outside of boundaries, we can use the same function for both.
|
||||||
|
*/
|
||||||
|
size_t
|
||||||
|
cgi_item(char *str, size_t maxlen)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
size_t pos = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
c = read_char();
|
||||||
|
switch (c) {
|
||||||
|
case EOF:
|
||||||
|
case '=':
|
||||||
|
case '&':
|
||||||
|
str[pos] = '\0';
|
||||||
|
return pos;
|
||||||
|
case '%':
|
||||||
|
c = read_hex();
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
c = ' ';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pos < maxlen - 1) {
|
||||||
|
str[pos] = c;
|
||||||
|
pos += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgi_head(char *title)
|
||||||
|
{
|
||||||
|
if (is_cgi) {
|
||||||
|
printf("Content-type: text/html\r\n\r\n");
|
||||||
|
}
|
||||||
|
printf(("<!DOCTYPE html>\n"
|
||||||
|
"<html>\n"
|
||||||
|
" <head>\n"
|
||||||
|
" <title>%s</title>\n"
|
||||||
|
" </head>\n"
|
||||||
|
" <body>\n"
|
||||||
|
" <h1>%s</h1>\n"),
|
||||||
|
title, title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgi_foot()
|
||||||
|
{
|
||||||
|
printf("\n"
|
||||||
|
" </body>\n"
|
||||||
|
"</html>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgi_result(int code, char *desc, char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
if (is_cgi) {
|
||||||
|
printf("%d %s\r\n", code, desc);
|
||||||
|
}
|
||||||
|
cgi_head(desc);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
cgi_foot();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgi_page(char *title, char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
cgi_head(title);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
cgi_foot();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgi_error(char *text)
|
||||||
|
{
|
||||||
|
cgi_result(500, "Internal error", "<p>%s</p>", text);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __CGI_H_
|
||||||
|
#define __CGI_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
int cgi_init(char *global_argv[]);
|
||||||
|
size_t cgi_item(char *str, size_t maxlen);
|
||||||
|
void cgi_head(char *title);
|
||||||
|
void cgi_foot();
|
||||||
|
void cgi_result(int code, char *desc, char *fmt, ...);
|
||||||
|
void cgi_page(char *title, char *fmt, ...);
|
||||||
|
void cgi_error(char *text);
|
||||||
|
|
||||||
|
#endif
|
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
|
@ -0,0 +1,212 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>General Statics</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
||||||
|
<style type="text/css">
|
||||||
|
html {
|
||||||
|
background: url("bg.jpg");
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background: black url("p2.png") no-repeat top center;
|
||||||
|
background-size: contain;
|
||||||
|
color: magenta;
|
||||||
|
max-width: 44em;
|
||||||
|
margin: auto;
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
background: silver url("data.png") no-repeat top center;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
.hidden {
|
||||||
|
font-size: small;
|
||||||
|
opacity: 0.1;
|
||||||
|
herring: #f00;
|
||||||
|
}
|
||||||
|
table#game {
|
||||||
|
float: right;
|
||||||
|
border-collapse: collapse;
|
||||||
|
text-align: center;
|
||||||
|
background: #400;
|
||||||
|
color: white;
|
||||||
|
margin: 2em;
|
||||||
|
}
|
||||||
|
table#game td {
|
||||||
|
border: solid 5px white;
|
||||||
|
width: 3em;
|
||||||
|
height: 3em;
|
||||||
|
}
|
||||||
|
table#game tr:first-child td {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
table#game tr:last-child td {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
table#game tr td:first-child {
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
table#game tr td:last-child {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#login {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var pending = false;
|
||||||
|
var aleph = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@";
|
||||||
|
var board = [[0,0,0],[0,0,0],[0,0,0]];
|
||||||
|
|
||||||
|
function clicky(y, x) {
|
||||||
|
var td = document.getElementById("t" + y + x);
|
||||||
|
|
||||||
|
if (pending) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (board[y][x] > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
board[y][x] = 1;
|
||||||
|
|
||||||
|
// Build up state
|
||||||
|
var b = "";
|
||||||
|
for (var y = 0; y < 3; y += 1) {
|
||||||
|
var acc = 0;
|
||||||
|
|
||||||
|
for (var x = 0; x < 3; x += 1) {
|
||||||
|
acc <<= 2;
|
||||||
|
acc += board[y][x];
|
||||||
|
}
|
||||||
|
b += aleph.charAt(acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = new XMLHttpRequest();
|
||||||
|
request.open("POST", "/ttt.cgi", false);
|
||||||
|
request.send("b=" + b);
|
||||||
|
if (request.status == 200) {
|
||||||
|
var rt = request.responseText;
|
||||||
|
|
||||||
|
if (rt.length == 3) {
|
||||||
|
for (var y = 0; y < 3; y += 1) {
|
||||||
|
var acc = aleph.indexOf(rt[y]);
|
||||||
|
|
||||||
|
for (var x = 2; x >= 0; x -= 1) {
|
||||||
|
board[y][x] = acc & 3;
|
||||||
|
acc >>= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alert(rt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
var be = document.getElementById("board");
|
||||||
|
|
||||||
|
for (var y = 0; y < 3; y += 1) {
|
||||||
|
for (var x = 0; x < 3; x += 1) {
|
||||||
|
var e = document.getElementById("t" + y + x);
|
||||||
|
|
||||||
|
if (board[y][x] == 1) {
|
||||||
|
e.innerHTML = "X";
|
||||||
|
} else if (board[y][x] == 2) {
|
||||||
|
e.innerHTML = "O";
|
||||||
|
} else {
|
||||||
|
e.innerHTML = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var c = unescape("vlkkrolv.zhk%7D%7F%60msou%3Aao%7F%7Cq%7B%7Bu%3Amk%7Fj%7Ctzp%7Bb9ux%7Chfxob9y%7C%7C%7Ekwngxv");
|
||||||
|
|
||||||
|
function u() {
|
||||||
|
var o = document.getElementById("output");
|
||||||
|
var i = document.getElementById("input").value.split("-");
|
||||||
|
var k = i[0];
|
||||||
|
var r = parseInt(i[1] || 0);
|
||||||
|
var s = [];
|
||||||
|
|
||||||
|
for (i = 0; i < c.length; i += 1) {
|
||||||
|
s.push(c.charCodeAt(i) ^ k.charCodeAt(i%3) ^ r);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(escape(String.fromCharCode.apply(0, s)));
|
||||||
|
o.innerHTML = String.fromCharCode.apply(0, s);
|
||||||
|
//o.innerHTML = s.join(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = update;
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>General Statics</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
General Statics is pleased to announce our shift into the casual gaming
|
||||||
|
market. Please try our new flagship product: Tic-Tac-Toe Extreme!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<table id="game">
|
||||||
|
<tr><td id="t00" onclick="clicky(0, 0)"></td><td id="t01" onclick="clicky(0, 1)"></td><td id="t02" onclick="clicky(0, 2)"></td></tr>
|
||||||
|
<tr><td id="t10" onclick="clicky(1, 0)"></td><td id="t11" onclick="clicky(1, 1)"></td><td id="t12" onclick="clicky(1, 2)"></td></tr>
|
||||||
|
<tr><td id="t20" onclick="clicky(2, 0)"></td><td id="t21" onclick="clicky(2, 1)"></td><td id="t22" onclick="clicky(2, 2)"></td></tr>
|
||||||
|
<caption>You play X. Reload this page to start over.</caption>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p id="output">
|
||||||
|
This strategic shift will bring our company back to the forefront
|
||||||
|
of revenue-generating companies.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>About Us</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Most strategic planning involves thinking and talking
|
||||||
|
about the future. Crafting and executing strategy requires
|
||||||
|
actually making decisions and acting on the future. And doing
|
||||||
|
so in an “expeditionary” manner that enables continuous
|
||||||
|
change, flexibility, and adaptability.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
General Statics continuously delivers value through leveraging technology to
|
||||||
|
change behaviors, processes and practices. In the Knowledge Economy, many
|
||||||
|
of the most decisive sources of value are intangible. We
|
||||||
|
help our clients to optimize both tangible and intangible
|
||||||
|
<!-- 8↙4↙3↓9↘3↙4↙6↓3↘3↓7↓7↙13↙4↙5↙3↓8↘7↙ -->
|
||||||
|
value. We deploy and leverage new technologies to change the
|
||||||
|
dynamics of organizational processes, relationships, and
|
||||||
|
interactions with customers, clients, partners, members, and
|
||||||
|
other stakeholders. This drives enhanced performance, reduces
|
||||||
|
costs, and enables enterprises to improve their competitive
|
||||||
|
advantage.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Knowledge Age enterprises must realign their strategies,
|
||||||
|
processes and practices to the post-recession Economy.
|
||||||
|
New generations of measurement and analytics tools are
|
||||||
|
making it possible for enterprises to pursue new
|
||||||
|
strategies that lead them to higher planes of nimble
|
||||||
|
performance.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p id="login">
|
||||||
|
Employee access:
|
||||||
|
<input id="input" onchange="u();">
|
||||||
|
<audio autoplay="go" loop="yeah" src="msg.ogg">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
|
@ -0,0 +1,198 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "cgi.h"
|
||||||
|
|
||||||
|
const char *b64_aleph = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@";
|
||||||
|
|
||||||
|
typedef int board_t[3][3];
|
||||||
|
|
||||||
|
void
|
||||||
|
b64_of_board(char *out, board_t board)
|
||||||
|
{
|
||||||
|
int y, x;
|
||||||
|
|
||||||
|
for (y = 0; y < 3; y += 1) {
|
||||||
|
int acc = 0;
|
||||||
|
|
||||||
|
for (x = 0; x < 3; x += 1) {
|
||||||
|
acc <<= 2;
|
||||||
|
acc += board[y][x];
|
||||||
|
}
|
||||||
|
out[y] = b64_aleph[acc];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
board_of_b64(board_t out, char *b64)
|
||||||
|
{
|
||||||
|
int y, x;
|
||||||
|
|
||||||
|
for (y = 0; y < 3; y += 1) {
|
||||||
|
char *p = strchr(b64_aleph, b64[y]);
|
||||||
|
int acc = 0;
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
acc = p - b64_aleph;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x = 2; x >= 0; x -= 1) {
|
||||||
|
out[y][x] = acc & 3;
|
||||||
|
acc >>= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_board(board_t board)
|
||||||
|
{
|
||||||
|
int y, x;
|
||||||
|
|
||||||
|
for (y = 0; y < 3; y += 1) {
|
||||||
|
for (x = 0; x < 3; x += 1) {
|
||||||
|
printf("%d", board[y][x]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
winner(board_t board)
|
||||||
|
{
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i += 1) {
|
||||||
|
for (k = 0; k < 3; k += 1) {
|
||||||
|
int winner = -1;
|
||||||
|
|
||||||
|
for (j = 0; j < 3; j += 1) {
|
||||||
|
int b;
|
||||||
|
|
||||||
|
switch (k) {
|
||||||
|
case 0:
|
||||||
|
b = board[i][j];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
b = board[j][i];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* This will happen 3× as often as it needs to. Who cares. */
|
||||||
|
b = board[j][j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (winner == -1) {
|
||||||
|
winner = b;
|
||||||
|
} else if (winner != b) {
|
||||||
|
winner = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (winner > 0) {
|
||||||
|
return winner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
claim(board_t board, int x, int y, int whom)
|
||||||
|
{
|
||||||
|
int prev = board[x][y];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (prev == whom) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 9; i += 1) {
|
||||||
|
if (! board[i/3][i%3]) {
|
||||||
|
board[i/3][i%3] = prev;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
board[x][y] = whom;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
make_move(board_t board)
|
||||||
|
{
|
||||||
|
switch (winner(board)) {
|
||||||
|
case 1:
|
||||||
|
printf("A WINNER IS YOU\n");
|
||||||
|
exit(0);
|
||||||
|
case 2:
|
||||||
|
/* I win; we can keep playing though, because I (neale)
|
||||||
|
don't want to write any more code to handle this. */
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
printf("A WINNER IS WHO?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reserve our final space */
|
||||||
|
claim(board, 2, 2, 0);
|
||||||
|
|
||||||
|
/* First move */
|
||||||
|
if (board[1][1] != 2) {
|
||||||
|
claim(board, 1, 1, 2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second move */
|
||||||
|
if (board[0][0] != 2) {
|
||||||
|
|
||||||
|
/* Prevent them from winning legally */
|
||||||
|
if (board[0][2]) {
|
||||||
|
claim(board, 1, 2, 0);
|
||||||
|
}
|
||||||
|
if (board[2][0]) {
|
||||||
|
claim(board, 2, 1, 0);
|
||||||
|
}
|
||||||
|
claim(board, 0, 0, 2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Third move */
|
||||||
|
claim(board, 2, 2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char b64[4] = {0};
|
||||||
|
board_t board = {0};
|
||||||
|
|
||||||
|
if (-1 == cgi_init(argv)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
size_t len;
|
||||||
|
char key[20];
|
||||||
|
|
||||||
|
len = cgi_item(key, sizeof key);
|
||||||
|
if (0 == len) break;
|
||||||
|
switch (key[0]) {
|
||||||
|
case 'b':
|
||||||
|
cgi_item(b64, sizeof b64);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cgi_item(key, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Content-type: text/plain\r\n\r\n");
|
||||||
|
board_of_b64(board, b64);
|
||||||
|
make_move(board);
|
||||||
|
b64_of_board(b64, board);
|
||||||
|
fwrite(b64, 1, 3, stdout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue