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;
+ }
+ if ( (current_token == parmnum) &&
+ (*s != separator) &&
+ (len < maxlen) ) {
+ dest[len] = *s;
+ ++len;
+ }
+ else if ((current_token > parmnum) || (len >= maxlen)) {
+ break;
}
- s++;
+ ++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);
}
-
+//*/
/**
* \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, len;
+ const char *ptr;
+ int b;
b = 0;
- len = strlen(st);
- for (a = 0; a < len; ++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 + 1 < (maxlen)) && (ch != 13) && (ch != 10)) {
+ buf[len++] = ch;
}
if ((ch == 10) || (ch == 0)) {
+ buf[len] = 0;
+ *retlen = len;
return ptr;
}
}
* \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.