// ===============================================
// Программа CGI counter.c
// Реализация счетчика посещений
//
// (C) Фролов А.В., 1997
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//         или
//         http://www.dials.ccas.ru/frolov
// ===============================================

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>

void main(int argc, char *argv[])
{
  // Идентификатор файла шаблона главной страницы
  HFILE hSrcFile;

  // Идентификатор файла счетчика
  FILE *CounterFile;

  // Размер файла шаблона
  DWORD dwFileSize;

  // Адрес шаблона главной страницы
  LPSTR szTemplate;

  // Временный буфер для работы со счетчиком
  CHAR  szBuf[10];

  // Текущее значение счетчика
  INT   nCounter;

  // Указатель на поле счетчика в шаблоне
  LPSTR szCounterPtr;

  // -----------------------------------------------
  // Считываем файл шаблона в оперативную память
  // -----------------------------------------------
  
  // Открываем файл шаблона
  hSrcFile = _lopen("HOME.TM", OF_READ);
  
  // Определяем размер файла в байтах
  dwFileSize = _llseek(hSrcFile, 0, 2);

  // Устанавливаем указатель текущей позиции
  // на начало файла шаблона
  _llseek(hSrcFile, 0, 0);

  // Получаем память для буфера шаблона
  szTemplate = malloc(dwFileSize);

  // Загружаем шаблон в буфер
  _hread(hSrcFile, szTemplate, dwFileSize);
    
  // -----------------------------------------------
  // Увеличиваем значение счетчика в файле
  // -----------------------------------------------
  
  // Открываем файл счетчика для чтения
  CounterFile = fopen("CNTDAT.DAT", "r");

  // Читаем из файла строку значения счетчика
  fgets(szBuf, 7, CounterFile);

  // Закрываем файл счетчика
  fclose(CounterFile);
  
  // Преобразуем значение счетчика из текстовой
  // строки в численную величину
  sscanf(szBuf, "%d", &nCounter);
  
  // Увеличиваем значение счетчика
  nCounter++;
  
  // Записываем в буфер szBuf пять цифр нового
  // значения счетчика
  sprintf(szBuf, "%05.5ld", nCounter);

  // Сохраняем новое значение счетчика в файле
  CounterFile = fopen("CNTDAT.DAT", "w");
  fprintf(CounterFile, "%d", nCounter);
  fclose(CounterFile);

  // -----------------------------------------------
  // Заменяем 5 цифр значения счетчика на новые
  // в буфере шаблона
  // -----------------------------------------------

  // Ищем маркер поля счетчика
  szCounterPtr = strstr(szTemplate, "~~~~~");
  
  // Копируем в это поле новое значение счетчика
  if(szCounterPtr != NULL)
    strncpy(szCounterPtr, szBuf, 5);
  
  // Выводим заголовок HTTP и разделительную строку
  printf("Content-type: text/html\n\n");

  // Выводим шаблон с измененным значением
  // поля счетчика
  fwrite(szTemplate, dwFileSize, 1, stdout);

  // Освобождаем буфер шаблона    
  free(szTemplate);
}