*/
long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen)
{
- const char *s; /* source */
- int len = 0; /* running total length of extracted string */
- int current_token = 0; /* token currently being processed */
+ const char *s; //* source * /
+ int len = 0; //* running total length of extracted string * /
+ int current_token = 0; //* token currently being processed * /
s = source;
return(-1);
}
+// cit_backtrace();
+// lprintf (CTDL_DEBUG, "test >: n: %d sep: %c source: %s \n willi \n", parmnum, separator, source);
dest[0] = 0;
if (s == NULL) {
return(-1);
}
+ maxlen--;
+
while (*s) {
if (*s == separator) {
++current_token;
}
- else if ( (current_token == parmnum) && (len < maxlen) ) {
+ if ( (current_token == parmnum) &&
+ (*s != separator) &&
+ (len < maxlen) ) {
dest[len] = *s;
++len;
}
+ else if ((current_token > parmnum) || (len >= maxlen)) {
+ break;
+ }
++s;
}
- dest[len] = 0;
- if (current_token < parmnum) return(-1);
+ dest[len] = '\0';
+ if (current_token < parmnum) {
+// lprintf (CTDL_DEBUG,"test <!: %s\n", dest);
+ return(-1);
+ }
+// lprintf (CTDL_DEBUG,"test <: %d; %s\n", len, dest);
return(len);
}
+//*/
/**
}
+/**
+ * \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;
+ }
+ }
+}
+
+
/**
* \brief searches for a paternn within asearch string
* \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.