#include "stdio.h"
#include "string.h"
int maxTemp[12*31];
int maxTempYear[12*31];
int minTemp[12*31];
int minTempYear[12*31];
char link[100*12*31];
const char *months[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
bool no_link = false;
bool since(int year, int month)
{
return year > 1981 || (year == 1981 && month >= 8);
//return year > 1996 || (year == 1995 && month >= 2);
}
FILE *fout = 0;
void processFile(const char *fn)
{
FILE *f = fopen(fn, "r");
if (f == 0)
{
printf("Could not open %s\n", fn);
return;
}
char buffer[1000];
while (fgets(buffer, 999, f))
{
if (strncmp(buffer, " 290,", 6) == 0)
{
int date;
int ddvec;
int fg;
int gem_temp;
int min_temp;
int max_temp;
int dr;
int respiration;
/*
STN,YYYYMMDD,DDVEC,FHVEC, FG, FHX, FHXH, FHN, FHNH, FXX, FXXH, TG, TN, TNH, TX, TXH, T10N,T10NH, SQ, SP, Q, DR, RH, RHX, RHXH, PG, PX, PXH, PN, PNH, VVN, VVNH, VVX, VVXH, NG, UG, UX, UXH, UN, UNH, EV24
*/
sscanf(buffer + 6, "%d", &date);
sscanf(buffer + 15, "%d", &ddvec);
sscanf(buffer + 27, "%d", &fg);
sscanf(buffer + 69, "%d", &gem_temp);
sscanf(buffer + 75, "%d", &min_temp);
sscanf(buffer + 87, "%d", &max_temp);
sscanf(buffer + 129, "%d", &dr);
sscanf(buffer + 135, "%d", &respiration);
int year = date / 10000;
int month = (date / 100) % 100;
int day = date % 100;
int nr = 31 * (month - 1) + day - 1;
//if (date > 20230800)
// fprintf(stdout, "%s\n%d %d %d %d %d %d\n", buffer, min_temp, max_temp, year, month, day, nr);
char c = link[(((year % 100) * 12) + month) * 31 + day];
char ext[2] = { 0, 0 };
if (c != '"')
ext[0] = c;
if (min_temp < minTemp[nr])
{
if (since(year, month) && minTempYear[nr] > 0)
{
//printf("%d new min temp of %4d from year %d\n", date, min_temp, minTempYear[nr]);
if (c != '\0')
fprintf(fout, "
%s %d, %d: Record minimum temperature of %.1lf°C beating record %.1lf°C from %d\n",
year % 100, month, day, ext, months[month-1], day, year, min_temp * 0.1, minTemp[nr] * 0.1, minTempYear[nr]);
else
fprintf(fout, "%s %d, %d: Record minimum temperature of %.1lf°C beating record %.1lf°C from %d\n",
months[month-1], day, year, min_temp * 0.1, minTemp[nr] * 0.1, minTempYear[nr]);
}
minTemp[nr] = min_temp;
minTempYear[nr] = year;
}
if (max_temp > maxTemp[nr])
{
if (since(year, month) && maxTempYear[nr] > 0)
{
//printf("%d new max temp of %4d from year %d\n", date, max_temp, maxTempYear[nr]);
if (c != '\0')
fprintf(fout, "%s %d, %d: Record maximum temperature of %.1lf°C beating record %.1lf°C from %d\n",
year % 100, month, day, ext, months[month-1], day, year, max_temp * 0.1, maxTemp[nr] * 0.1, maxTempYear[nr]);
else
fprintf(fout, "%s %d, %d: Record maximum temperature of %.1lf°C beating record %.1lf°C from %d\n",
months[month-1], day, year, max_temp * 0.1, maxTemp[nr] * 0.1, maxTempYear[nr]);
}
maxTemp[nr] = max_temp;
maxTempYear[nr] = year;
}
}
}
fclose(f);
}
void parse_file(const char *fn, bool stop_at_H2)
{
FILE *f = fopen(fn, "r");
char line[300];
while (fgets(line, 299, f))
{
const char *s = strstr(line, "");
if (stop_at_H2 && s != 0)
break;
s = strstr(line, "HREF=\"D");
if (s != 0)
{
s += 7;
int year;
int month;
int day;
char ext;
if (sscanf(s, "%2d%2d.html#%d%c", &year, &month, &day, &ext) == 4)
{
if (link[((year * 12) + month) * 31 + day] != '\0')
printf("Repeated: %s\n", line);
else
link[((year * 12) + month) * 31 + day] = ext;
char buf[40];
snprintf(buf, 39, "%02d%02d.html#%d%c", year, month, day, ext);
if (strncmp(s, buf, strlen(buf)) != 0)
printf("ERROR: %s %s\n", buf, s);
//printf("%s\n", buf);
}
}
}
fclose(f);
}
int main(int argc, char *argv[])
{
for (int i = 0; i < 100*12*31; i++)
link[i] = '\0';
parse_file("Dseasons.html", true);
parse_file("Snow.html", false);
fout = fopen("TempRecords.html", "w");
fprintf(fout,
"\n"
"Temperature records\n"
"\n"
"\n"
"Temperature records
\n"
"\n"
"Below the temperature records as recorded at Twente Airport since August 1981\n"
"according to the data in the file etmgeg_290.zip from the Royal Netherlands Meteorological Institute. This page is generated by the\n"
"program temprecords.cpp.\n"
"\n"
"\n"
"\n");
for (int i = 0; i < 12*31; i++)
{
maxTemp[i] = -5000;
maxTempYear[i] = 0;
minTemp[i] = 5000;
minTempYear[i] = 0;
}
processFile("etmgeg_290.txt");
fprintf(fout,
"
\n"
"\n"
"
\n"
"\n"
"Seasons |\n"
"Useless lists |\n"
"home | email\n"
"\n"
"\n");
return 0;
}