00001
00008
00009
00010 #include "NMEPluginWiki.h"
00011 #include <string.h>
00012 #include <stdio.h>
00013
00014 #define isWhiteSpace(c) ((c) <= ' ' && (c) >= '\0')
00015 #define isDigit(c) ((c) >= '0' && (c) <= '9')
00016 #define isAlpha(c) ((c) >= 'a' && (c) <= 'z' || (c) >= 'A' && (c) <= 'Z')
00017 #define digit(c) ((c) - '0')
00018 #define lower(c) ((c) >= 'A' && (c) <= 'Z' ? (c) + 32 : (c))
00019
00020 NMEErr NMEPluginKeywords(NMEConstText name, NMEInt nameLen,
00021 NMEConstText data, NMEInt dataLen,
00022 NMEContext *context,
00023 void *userData)
00024 {
00025 int i, j, k;
00026 (void)name;
00027 (void)nameLen;
00028 (void)userData;
00029
00030
00031 for (i = 0; i < dataLen; i = j + 1)
00032 {
00033
00034 while (i < dataLen && isWhiteSpace(data[i]))
00035 i++;
00036
00037 for (j = i; j < dataLen && data[j] != ','; j++)
00038 ;
00039
00040 for (k = j; k > i && isWhiteSpace(data[k - 1]); k--)
00041 ;
00042
00043 NMEAddRawString("Keyword: ", -1, context);
00044 NMEAddRawString(data + i, k - i, context);
00045 NMEAddRawString("\n", -1, context);
00046 }
00047
00048 return kNMEErrOk;
00049 }
00050
00051 NMEErr NMEPluginExecute(NMEConstText name, NMEInt nameLen,
00052 NMEConstText data, NMEInt dataLen,
00053 NMEContext *context,
00054 void *userData)
00055 {
00056 int i, k;
00057 (void)name;
00058 (void)nameLen;
00059 (void)userData;
00060
00061
00062 for (i = 0; i < dataLen && isWhiteSpace(data[i]); i++)
00063 ;
00064
00065 for (k = dataLen; k > i && isWhiteSpace(data[k - 1]); k--)
00066 ;
00067
00068 NMEAddRawString("Execute: ", -1, context);
00069 NMEAddRawString(data + i, k - i, context);
00070 NMEAddRawString("\n", -1, context);
00071
00072 return kNMEErrOk;
00073 }
00074
00084 static NMEBoolean matchTemplate(NMEConstText data, NMEInt dataLen, NMEInt i,
00085 NMEConstText template)
00086 {
00087 NMEInt j;
00088
00089 for (j = 0; template[j]; j++)
00090 if (i + j >= dataLen
00091 || (template[j] == '0' ? !isDigit(data[i + j])
00092 : template[j] == 'a' ? !isAlpha(data[i + j])
00093 : template[j] != data[i + j]))
00094 return FALSE;
00095 return i + j >= dataLen || !isDigit(data[i + j]) && !isAlpha(data[i + j]);
00096 }
00097
00101 static void writeInt(NMEInt n, NMEInt padding, NMEContext *context)
00102 {
00103 NMEChar str[5];
00104 NMEInt i;
00105
00106 if (padding <= 0)
00107 for (i = 10, padding = 1; n >= i; i *= 10)
00108 padding++;
00109
00110 for (i = 0; i < padding; i++, n /= 10)
00111 str[padding - i - 1] = '0' + n % 10;
00112 str[padding] = '\0';
00113
00114 NMEAddRawString(str, -1, context);
00115 }
00116
00117 NMEErr NMEPluginDate(NMEConstText name, NMEInt nameLen,
00118 NMEConstText data, NMEInt dataLen,
00119 NMEContext *context,
00120 void *userData)
00121 {
00122 int year = 0, month = 0, day = 0, hour = -1, min = 0;
00123 NMEInt i;
00124 NMEConstText monthNames = (NMEConstText)userData;
00125 (void)name;
00126 (void)nameLen;
00127
00128
00129 for (i = 0; i < dataLen; )
00130 {
00131
00132 while (i < dataLen && isWhiteSpace(data[i]))
00133 i++;
00134
00135 if (matchTemplate(data, dataLen, i, "00:00"))
00136 {
00137
00138 hour = 10 * digit(data[i]) + digit(data[i + 1]);
00139 min = 10 * digit(data[i + 3]) + digit(data[i + 4]);
00140 i += 5;
00141 }
00142 else if (matchTemplate(data, dataLen, i, "0:00"))
00143 {
00144
00145 hour = digit(data[i]);
00146 min = 10 * digit(data[i + 2]) + digit(data[i + 3]);
00147 i += 4;
00148 }
00149 else if (matchTemplate(data, dataLen, i, "0000-00-00"))
00150 {
00151
00152 year = 1000 * digit(data[i]) + 100 * digit(data[i + 1])
00153 + 10 * digit(data[i + 2]) + digit(data[i + 3]);
00154 month = 10 * digit(data[i + 5]) + digit(data[i + 6]);
00155 day = 10 * digit(data[i + 8]) + digit(data[i + 9]);
00156 i += 10;
00157 }
00158 else if (matchTemplate(data, dataLen, i, "00.00.0000"))
00159 {
00160
00161 day = 10 * digit(data[i]) + digit(data[i + 1]);
00162 month = 10 * digit(data[i + 3]) + digit(data[i + 4]);
00163 year = 1000 * digit(data[i + 6]) + 100 * digit(data[i + 7])
00164 + 10 * digit(data[i + 8]) + digit(data[i + 9]);
00165 i += 10;
00166 }
00167 else if (matchTemplate(data, dataLen, i, "00/00/0000"))
00168 {
00169
00170 month = 10 * digit(data[i]) + digit(data[i + 1]);
00171 day = 10 * digit(data[i + 3]) + digit(data[i + 4]);
00172 year = 1000 * digit(data[i + 6]) + 100 * digit(data[i + 7])
00173 + 10 * digit(data[i + 8]) + digit(data[i + 9]);
00174 i += 10;
00175 }
00176 else if (matchTemplate(data, dataLen, i, "0000"))
00177 {
00178
00179 year = 1000 * digit(data[i]) + 100 * digit(data[i + 1])
00180 + 10 * digit(data[i + 2]) + digit(data[i + 3]);
00181 i += 4;
00182 }
00183 else if (matchTemplate(data, dataLen, i, "00"))
00184 {
00185
00186 day = 10 * digit(data[i]) + digit(data[i + 1]);
00187 i += 2;
00188 }
00189 else if (matchTemplate(data, dataLen, i, "0"))
00190 {
00191
00192 day = digit(data[i]);
00193 i += 1;
00194 }
00195 else if (matchTemplate(data, dataLen, i, "pm"))
00196 {
00197 if (hour < 12 && hour >= 0)
00198 hour += 12;
00199 i += 2;
00200 }
00201 else
00202 {
00203 if (monthNames && i + 2 < dataLen)
00204 {
00205
00206 NMEInt m;
00207 NMEInt j;
00208 NMEInt k;
00209
00210 for (m = j = 0; monthNames[j]; m++)
00211 {
00212
00213 for (k = 0;
00214 i + k < dataLen && lower(data[i + k]) == monthNames[j + k];
00215 k++)
00216 ;
00217 if (k >= 3)
00218 {
00219 i += k;
00220 month = 1 + m % 12;
00221 goto next;
00222 }
00223
00224
00225 while (monthNames[j] && monthNames[j] != ',')
00226 j++;
00227 if (monthNames[j] == ',')
00228 j++;
00229 }
00230 }
00231
00232 i++;
00233 next:
00234 ;
00235 }
00236 }
00237
00238
00239 if (year > 0 && month > 0 && day > 0)
00240 {
00241 NMEAddRawString("Date: ", -1, context);
00242 writeInt(year, 4, context);
00243 NMEAddRawString("-", -1, context);
00244 writeInt(month, 2, context);
00245 NMEAddRawString("-", -1, context);
00246 writeInt(day, 2, context);
00247 NMEAddRawString("\n", -1, context);
00248 }
00249
00250
00251 if (hour >= 0)
00252 {
00253 NMEAddRawString("Time: ", -1, context);
00254 writeInt(hour, 2, context);
00255 NMEAddRawString(":", -1, context);
00256 writeInt(min, 2, context);
00257 NMEAddRawString("\n", -1, context);
00258 }
00259
00260 return kNMEErrOk;
00261 }