nyctergatis.com

Contact

Projects
Sysquake Remote Live
NME
PDF
Hike
Sudoku
GifBuilder
jpeglib for Palm OS
MySQL Client
Cross-GCC for Mac OS
NMEPluginWiki.c
Go to the documentation of this file.
00001 
00008 /* License: new BSD license (see NME.h) */
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     // read keywords in data
00031     for (i = 0; i < dataLen; i = j + 1)
00032     {
00033         // skip white spaces
00034         while (i < dataLen && isWhiteSpace(data[i]))
00035             i++;
00036         // find next comma
00037         for (j = i; j < dataLen && data[j] != ','; j++)
00038             ;
00039         // discard trailing white spaces
00040         for (k = j; k > i && isWhiteSpace(data[k - 1]); k--)
00041             ;
00042         // output keyword
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     // skip white spaces
00062     for (i = 0; i < dataLen && isWhiteSpace(data[i]); i++)
00063         ;
00064     // discard trailing white spaces
00065     for (k = dataLen; k > i && isWhiteSpace(data[k - 1]); k--)
00066         ;
00067     // output
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)   // compute number of digits in n (at least 1)
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     // read date and time in data
00129     for (i = 0; i < dataLen; )
00130     {
00131         // skip spaces
00132         while (i < dataLen && isWhiteSpace(data[i]))
00133             i++;
00134         // check format
00135         if (matchTemplate(data, dataLen, i, "00:00"))
00136         {
00137             // hh:mm
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             // h:mm
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             // yyyy-mm-dd
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             // dd.mm.yyyy
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             // mm/dd/yyyy
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             // yyyy
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             // dd
00186             day = 10 * digit(data[i]) + digit(data[i + 1]);
00187             i += 2;
00188         }
00189         else if (matchTemplate(data, dataLen, i, "0"))
00190         {
00191             // d
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                 // try to find a month name (at least 3 char)
00206                 NMEInt m;   // month index in monthNames
00207                 NMEInt j;   // char index in monthNames
00208                 NMEInt k;   // i+k = index in data
00209                 
00210                 for (m = j = 0; monthNames[j]; m++)
00211                 {
00212                     // match?
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                     // skip month name in monthNames
00225                     while (monthNames[j] && monthNames[j] != ',')
00226                         j++;
00227                     if (monthNames[j] == ',')
00228                         j++;
00229                 }
00230             }
00231             // no month name found
00232             i++;
00233 next:
00234             ;
00235         }
00236     }
00237     
00238     // write date
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     // write time
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 }
Generated by Doxygen.
Copyright 2007-2013, Yves Piguet.
All rights reserved.