00001
00007
00008
00009 #include "NMEPluginCalendar.h"
00010 #include <string.h>
00011 #include <stdio.h>
00012
00013 NMEErr NMEPluginCalendar(NMEConstText name, NMEInt nameLen,
00014 NMEConstText data, NMEInt dataLen,
00015 NMEContext *context,
00016 void *userData)
00017 {
00018 char *endp;
00019 int year, month;
00020 int weekday;
00021 int m1, y1;
00022 int d, dmax;
00023 char str[16];
00024 static int const nd[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
00025 (void)name;
00026 (void)nameLen;
00027 (void)userData;
00028
00029
00030 year = strtol(data, &endp, 0);
00031 month = strtol(endp, NULL, 0);
00032 if (year < 0)
00033 year = 0;
00034 if (month < 1 || month > 12)
00035 month = 1;
00036
00037
00038 m1 = (month - 14) / 12;
00039 y1 = year + 4800;
00040 weekday = (1461 * (y1 + m1) / 4 + 367 * (month - 2 - 12 * m1) / 12
00041 - 3 * ((y1 + m1 + 100) / 100) / 4 - 32074) % 7;
00042
00043 if (!NMEAddString("\n|=Mon|=Tue|=Wed|=Thu|=Fri|=Sat|=Sun\n", -1,
00044 '\0', context))
00045 return kNMEErrNotEnoughMemory;
00046 dmax = nd[month - 1];
00047 if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
00048 dmax = 29;
00049 for (d = 0; d < weekday; d++)
00050 if (!NMEAddString("|", 1, '\0', context))
00051 return kNMEErrNotEnoughMemory;
00052 for (d = 1; d <= dmax; d++)
00053 {
00054 sprintf(str, "|%d", d);
00055 if (!NMEAddString(str, -1, '\0', context))
00056 return kNMEErrNotEnoughMemory;
00057 if ((d + weekday) % 7 == 0)
00058 if (!NMEAddString("\n", 1, '\0', context))
00059 return kNMEErrNotEnoughMemory;
00060 }
00061 if (!NMEAddString("\n\n", 2, '\0', context))
00062 return kNMEErrNotEnoughMemory;
00063
00064 return kNMEErrOk;
00065 }