MES3.0はLinuxの下位互換性であり、MES3.0のユーザープログラムは原則としてLinuxでも同じソースコードで動作します。
以下、MES3.0で動作確認されたLinuxとソースコード互換の時刻の設定と表示の例です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
static const int daysinmonth[] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int main(int argc, char **argv) {
int i, value;
struct timeval tv;
struct timezone tz;
struct tm *t;
if(argc == 3 && argv[1][0] == '-') {
if(gettimeofday(&tv, &tz) == -1) return -1;
t = localtime(&tv.tv_sec);
value = atoi(argv[2]);
switch(argv[1][1]) {
case 'Y':
t->tm_year = value + 100;
break;
case 'M':
t->tm_mon = value - 1;
t->tm_yday = -1;
for(i = 0;i < t->tm_mon;i++) {
t->tm_yday += daysinmonth[i];
if(i == 2 && isleap(t->tm_year + 1900)) t->tm_yday++;
}
t->tm_yday += t->tm_mday;
break;
case 'D':
t->tm_mday = value;
t->tm_yday = -1;
for(i = 0;i < t->tm_mon;i++) {
t->tm_yday += daysinmonth[i];
if(i == 2 && isleap(t->tm_year + 1900)) t->tm_yday++;
}
t->tm_yday += t->tm_mday;
break;
case 'h':
t->tm_hour = value;
break;
case 'm':
t->tm_min = value;
break;
case 's':
t->tm_sec = value;
break;
}
tv.tv_sec = mktime(t);
settimeofday(&tv, &tz);
} else if(argc == 1) {
gettimeofday(&tv, NULL);
t = localtime(&tv.tv_sec);
printf("%04d/%d/%d ", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);
printf((t->tm_hour / 12) ? "PM" : "AM");
printf(" %d:%02d:%02d\r", t->tm_hour % 12, t->tm_min, t->tm_sec);
} else {
printf("Syntax error\r");
fflush(stdout);
return -1;
}
fflush(stdout);
return 0;
}