00001
00007
00008
00009 #include "NMEAutolink.h"
00010
00012 #define isBlank(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n')
00013
00015 #define isAlpha(c) ((c) >= 'a' && (c) <= 'z' || (c) >= 'A' && (c) <= 'Z')
00016
00017 NMEBoolean NMEAutoconvertCamelCase(NMEConstText src, NMEInt srcLen,
00018 NMEInt *i,
00019 NMEContext *context,
00020 void *userData)
00021 {
00022 NMEInt i1, j;
00023
00024
00025 if (*i == 0)
00026 i1 = isBlank(src[*i]) ? *i + 1 : *i;
00027 else if (!isBlank(src[*i]))
00028 return FALSE;
00029 else
00030 i1 = *i + 1;
00031
00032 if (isAlpha(src[i1]))
00033 for (j = 1; i1 + j < srcLen && isAlpha(src[i1 + j]); j++)
00034 if (src[i1 + j] <= 'Z' && src[i1 + j - 1] >= 'a')
00035 {
00036
00037
00038 for (; i1 + j < srcLen && isAlpha(src[i1 + j]); j++)
00039 ;
00040
00041 NMEAddString(&src[*i], i1 - *i, '\0', context);
00042 NMEAddString("[[", -1, '\0', context);
00043 NMEAddString(&src[i1], j, '\0', context);
00044 NMEAddString("]]", -1, '\0', context);
00045 *i = i1 + j;
00046 return TRUE;
00047 }
00048
00049 return FALSE;
00050 }
00051
00052 NMEBoolean NMEAutoconvertURL(NMEConstText src, NMEInt srcLen,
00053 NMEInt *i,
00054 NMEContext *context,
00055 void *userData)
00056 {
00057 NMEInt i1, j, k, p;
00058 static char const * const prefix[] =
00059 {
00060 "http://", "https://", "ftp://", "mailto:", NULL
00061 };
00062 static char const punctuation[] = ",.?!:;'";
00063
00064
00065 if (*i == 0)
00066 i1 = isBlank(src[*i]) ? *i + 1 : *i;
00067 else if (!isBlank(src[*i]))
00068 return FALSE;
00069 else
00070 i1 = *i + 1;
00071
00072
00073 for (j = 0; prefix[j]; j++)
00074 {
00075 for (k = 0; prefix[j][k] && i1 + k < srcLen && src[i1 + k] == prefix[j][k]; k++)
00076 ;
00077 if (prefix[j][k])
00078 continue;
00079
00080
00081 for (p = k; i1 + p < srcLen && src[i1 + p] != '"'
00082 && !(src[i1 + p] >= '\0' && src[i1 + p] <= ' '); p++)
00083 ;
00084
00085
00086 if (p == k)
00087 continue;
00088
00089
00090 for (j = 0; punctuation[j]; j++)
00091 if (src[i1 + p - 1] == punctuation[j])
00092 {
00093 p--;
00094 break;
00095 }
00096
00097
00098 NMEAddString(&src[*i], i1 - *i, '\0', context);
00099 NMEAddString("[[", -1, '\0', context);
00100 NMEAddString(&src[i1], p, '\0', context);
00101 NMEAddString("]]", -1, '\0', context);
00102 *i = i1 + p;
00103 return TRUE;
00104 }
00105
00106 return FALSE;
00107 }