#include #include #include #include "../fs.h" char *WhatFilename = "what-count.txt"; Field_Value *Name; Field_Value *IP; FS_CGI_arg FSexpect[] = { { "Name", &Name, NULL}, { "REMOTE_ADDR", &IP, "0123456789"}, NULL }; void output(char *buf, int len) { while (len--) putchar(*buf++); } int FSquery() { FS_panel p1; int err; int sum = 0; Field_Value *Sum; char buf[4000]; int offsets[] = { 0x13, 0x4F, 0x88, 0xC2, 0xFB, 0x134, 0x16C, 0x1A8, 0x1E0, 0x21D, 0x25A }; FILE *fp; int len, width, digit, offset, pos; char *p; char digits[20]; p1 = FSsetPanel(1); err = FSequalRec(p1,FSifList(p1,1,Name)); if (err == FS_OK) { sum = atoi( FSfield(p1,2)->field_data ); } else { sum = 0; } sum++; sprintf(digits,"%d",sum); Sum = NewField('0',0,strlen(digits),digits); if (err == FS_OK) { err = FSupdateField(p1,FSifList(p1,1,Name),2,':',Sum); } else { err = FScreateRec(p1,FSfList(p1,Name,Sum)); if (err != FS_OK) { sprintf(digits,"%d",err); } } printf("Content-type: image/gif\n\n"); fp = fopen("images/lwdigits.gif", "rb"); if (fp != NULL) { len = fread(buf, 1, 4000, fp); fclose(fp); if (len==offsets[10]+1 /* correct length */ && buf[8]==20 && buf[9]==0 /* height is 20 pixels */ && buf[offsets[0]]==',' /* digit 0 offset correct */ && buf[offsets[1]]==',' /* digit 1 offset correct */ && buf[offsets[2]]==',' /* digit 2 offset correct */ && buf[offsets[3]]==',' /* digit 3 offset correct */ && buf[offsets[4]]==',' /* digit 4 offset correct */ && buf[offsets[5]]==',' /* digit 5 offset correct */ && buf[offsets[6]]==',' /* digit 6 offset correct */ && buf[offsets[7]]==',' /* digit 7 offset correct */ && buf[offsets[8]]==',' /* digit 8 offset correct */ && buf[offsets[9]]==',' /* digit 9 offset correct */ && buf[len-1]==';') { width = strlen(digits) * 10; buf[6] = width % 256; buf[7] = width / 256; output(buf,offsets[0]); p = digits; if (*p == '"') p++; if (*p == '#') p++; pos = 0; while (*p) { digit = *p - '0'; if (0<=digit && digit<=9) { offset = offsets[digit]; len = offsets[digit+1] - offset; buf[offset+1] = pos % 256; buf[offset+2] = pos / 256; output(&buf[offset],len); } pos += 10; p++; } output(";",1); } else { output(buf,len); } } return 0; }