*/
int num_tokens(char *source, char tok)
{
- int a = 0;
int count = 1;
+ char *ptr = source;
- if (source == NULL)
+ if (source == NULL) {
return (0);
- for (a = 0; a < strlen(source); ++a) {
- if (source[a] == tok)
+ }
+
+ while (*ptr != '\0') {
+ if (*ptr++ == tok) {
++count;
+ }
}
+
return (count);
}
-/**
- * brief a string tokenizer
- * \param dest destination string
- * \param source the string to grab tokens from
- * \param parmnum the n'th token to grab
- * \param separator the tokenizer string
- * \param maxlen the length of dest
+/*
+ * extract_token() - a string tokenizer
+ * returns -1 if not found, or length of token.
*/
-void extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen)
+long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen)
{
- char *d; /* dest */
- const char *s; /* source */
- int count = 0;
- int len = 0;
+ const char *s; //* source * /
+ int len = 0; //* running total length of extracted string * /
+ int current_token = 0; //* token currently being processed * /
+
+ s = source;
+ if (dest == NULL) {
+ return(-1);
+ }
+
+// cit_backtrace();
+// lprintf (CTDL_DEBUG, "test >: n: %d sep: %c source: %s \n willi \n", parmnum, separator, source);
dest[0] = 0;
- /* Locate desired parameter */
- s = source;
- while (count < parmnum) {
- /* End of string, bail! */
- if (!*s) {
- s = NULL;
- break;
- }
+ if (s == NULL) {
+ return(-1);
+ }
+
+ maxlen--;
+
+ while (*s) {
if (*s == separator) {
- count++;
+ ++current_token;
}
- s++;
+ if ( (current_token == parmnum) &&
+ (*s != separator) &&
+ (len < maxlen) ) {
+ dest[len] = *s;
+ ++len;
+ }
+ else if ((current_token > parmnum) || (len >= maxlen)) {
+ break;
+ }
+ ++s;
}
- if (!s) return; /* Parameter not found */
- for (d = dest; *s && *s != separator && ++len<maxlen; s++, d++) {
- *d = *s;
+ dest[len] = '\0';
+ if (current_token < parmnum) {
+// lprintf (CTDL_DEBUG,"test <!: %s\n", dest);
+ return(-1);
}
- *d = 0;
+// lprintf (CTDL_DEBUG,"test <: %d; %s\n", len, dest);
+ return(len);
}
-
+//*/
/**
return;
}
- for (i = 0; i < slen; ++i) {
+ for (i = 0;
+ ( (i < slen) && (end == -1) );
+ ++i) {
if ((start < 0) && (curr_parm == parmnum)) {
start = i;
}
}
if (end < 0)
- end = strlen(source);
+ end = slen;
- memmove(&source[start], &source[end], slen - end);
+ memmove(&source[start], &source[end], slen - end + 1);
}
* \param ch the char to search
* \return the position inside of st
*/
-int haschar(char *st,char ch)
+int haschar(const char *st,char ch)
{
- int a, b;
+ const char *ptr;
+ int b;
b = 0;
- for (a = 0; a < strlen(st); ++a)
- if (st[a] == ch)
+ ptr = st;
+ while (!IsEmptyStr(ptr))
+ if (*ptr == ch)
++b;
return (b);
}
int len = 0; /**< tally our own length to avoid strlen() delays */
ptr = start;
- memset(buf, 0, maxlen);
+ while (1) {
+ ch = *ptr++;
+ if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) {
+ buf[len++] = ch;
+ }
+ if ((ch == 10) || (ch == 0)) {
+ buf[len] = 0;
+ return ptr;
+ }
+ }
+}
+
+
+/**
+ * \brief Utility function to "readline" from memory
+ * \param start Location in memory from which we are reading.
+ * \param buf the buffer to place the string in.
+ * \param maxlen Size of string buffer
+ * \param retlen the length of the returned string
+ * \return Pointer to the source memory right after we stopped reading.
+ */
+char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen)
+{
+ char ch;
+ char *ptr;
+ int len = 0; /**< tally our own length to avoid strlen() delays */
+
+ ptr = start;
while (1) {
ch = *ptr++;
- if ((len < (maxlen - 1)) && (ch != 13) && (ch != 10)) {
- buf[strlen(buf) + 1] = 0;
- buf[strlen(buf)] = ch;
- ++len;
+ if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) {
+ buf[len++] = ch;
}
if ((ch == 10) || (ch == 0)) {
+ buf[len] = 0;
+ *retlen = len;
return ptr;
}
}
int pattern2(char *search, char *patn)
{
int a;
- for (a = 0; a < strlen(search); ++a) {
- if (!strncasecmp(&search[a], patn, strlen(patn)))
+ int len, plen;
+ len = strlen (search);
+ plen = strlen (patn);
+ for (a = 0; a < len; ++a) {
+ if (!strncasecmp(&search[a], patn, plen))
return (a);
}
return (-1);
}
+/**
+ * \brief Strip leading and trailing spaces from a string; with premeasured and adjusted length.
+ * \param buf the string to modify
+ * \param len length of the string.
+ */
+void stripltlen(char *buf, int *len)
+{
+ int delta = 0;
+ if (*len == 0) return;
+ while ((*len > delta) && (isspace(buf[delta]))){
+ delta ++;
+ }
+ memmove (buf, &buf[delta], *len - delta + 1);
+ (*len) -=delta;
+
+ if (*len == 0) return;
+ while (isspace(buf[(*len) - 1])){
+ buf[--(*len)] = '\0';
+ }
+}
+
/**
* \brief Strip leading and trailing spaces from a string
* \param buf the string to modify
*/
void striplt(char *buf)
{
- if (strlen(buf) == 0) return;
- while ((strlen(buf) > 0) && (isspace(buf[0])))
- strcpy(buf, &buf[1]);
- if (strlen(buf) == 0) return;
- while (isspace(buf[strlen(buf) - 1]))
- buf[strlen(buf) - 1] = 0;
+ int len;
+ len = strlen(buf);
+ stripltlen(buf, &len);
}
int a;
int lb = (-1);
int rb = (-1);
+ int len = strlen(str);
do {
lb = (-1);
rb = (-1);
- for (a = 0; a < strlen(str); ++a) {
+ for (a = 0; a < len; ++a) {
if (str[a] == leftboundary)
lb = a;
if (str[a] == rightboundary)
}
if ((lb > 0) && (rb > lb)) {
- strcpy(&str[lb - 1], &str[rb + 1]);
+ memmove(&str[lb - 1], &str[rb + 1], len - rb);
+ len -= (rb - lb + 2);
}
} while ((lb > 0) && (rb > lb));
* \param dest encrypted string
* \param source the string to encrypt
* \param sourcelen the length of the source data (may contain string terminators)
+ * \return the length of the encoded string.
*/
-void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int linebreaks)
+size_t CtdlEncodeBase64(char **pdest, const char *source, size_t sourcelen, size_t *destlen, int linebreaks)
{
int i, hiteof = FALSE;
int spos = 0;
int dpos = 0;
int thisline = 0;
+ char *dest;
+
+ dest = *pdest;
/** Fill dtable with character encodings. */
}
}
for (i = 0; i < 4; i++) {
+ if (dpos > *destlen)
+ {
+ int newlen;
+ char *newbuf;
+ newlen = *destlen + *destlen / 2;
+ newbuf = (char*) malloc(newlen);
+ memcpy(newbuf, dest, *destlen);
+ *pdest = dest = newbuf;
+ *destlen = newlen;
+ }
dest[dpos++] = ogroup[i];
dest[dpos] = 0;
}
thisline += 4;
if ( (linebreaks) && (thisline > 70) ) {
+ if (dpos + 3 > *destlen)
+ {
+ int newlen;
+ char *newbuf;
+ newlen = *destlen + *destlen / 2;
+ newbuf = (char*) malloc(newlen);
+ memcpy(newbuf, dest, *destlen);
+ *pdest = dest = newbuf;
+ *destlen = newlen;
+ }
dest[dpos++] = '\r';
dest[dpos++] = '\n';
dest[dpos] = 0;
}
}
if ( (linebreaks) && (thisline > 70) ) {
+ if (dpos + 3 > *destlen)
+ {
+ int newlen;
+ char *newbuf;
+ newlen = *destlen + 5;
+ newbuf = (char*) malloc(newlen);
+ memcpy(newbuf, dest, *destlen);
+ *pdest = dest = newbuf;
+ *destlen = newlen;
+ }
dest[dpos++] = '\r';
dest[dpos++] = '\n';
dest[dpos] = 0;
thisline = 0;
}
+ return dpos;
}
}
+/*
+ * Convert "quoted-printable" to binary. Returns number of bytes decoded.
+ * according to RFC2045 section 6.7
+ */
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
+ unsigned int ch;
+ int decoded_length = 0;
+ int pos = 0;
+
+ while (pos < sourcelen)
+ {
+ if (!strncmp(&encoded[pos], "=\r\n", 3))
+ {
+ pos += 3;
+ }
+ else if (!strncmp(&encoded[pos], "=\n", 2))
+ {
+ pos += 2;
+ }
+ else if (encoded[pos] == '=')
+ {
+ ch = 0;
+ sscanf(&encoded[pos+1], "%02x", &ch);
+ pos += 3;
+ decoded[decoded_length++] = ch;
+ }
+ else
+ {
+ decoded[decoded_length++] = encoded[pos];
+ pos += 1;
+ }
+ }
+ decoded[decoded_length] = 0;
+ return(decoded_length);
+}
+
+
/**
* \brief Local replacement for controversial C library function that generates
* names for temporary files. Included to shut up compiler warnings.