X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Ftools.c;h=53151fb950565a0d0500cced540c27c86efd80a2;hb=954e5749b5e0102f8598fcc19fc10267f31a6cda;hp=ff35f9ecae04b9e7408cf9322bb17848fca7216d;hpb=4e567f2a85608cc801193319701cb79fdf169eb2;p=citadel.git diff --git a/libcitadel/lib/tools.c b/libcitadel/lib/tools.c index ff35f9eca..53151fb95 100644 --- a/libcitadel/lib/tools.c +++ b/libcitadel/lib/tools.c @@ -1,24 +1,10 @@ -/* - * A basic toolset containing miscellaneous functions for string manipluation, - * encoding/decoding, and a bunch of other stuff. - * - * Copyright (c) 1987-2011 by the citadel.org team - * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - +// A basic toolset containing miscellaneous functions for string manipluation, +// encoding/decoding, and a bunch of other stuff. +// +// Copyright (c) 1987-2022 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #include #include @@ -30,8 +16,6 @@ #include #include #include -#include "b64/cencode.h" -#include "b64/cdecode.h" #if TIME_WITH_SYS_TIME # include @@ -52,20 +36,18 @@ typedef unsigned char byte; /* Byte type */ -/* - * copy a string into a buffer of a known size. abort if we exceed the limits - * - * dest the targetbuffer - * src the source string - * n the size od dest - * - * returns the number of characters copied if dest is big enough, -n if not. - */ -int safestrncpy(char *dest, const char *src, size_t n) -{ +// copy a string into a buffer of a known size. abort if we exceed the limits +// +// dest the targetbuffer +// src the source string +// n the size od dest +// +// returns the number of characters copied if dest is big enough, -n if not. +int safestrncpy(char *dest, const char *src, size_t n) { int i = 0; - if (dest == NULL || src == NULL) { + if (dest == NULL || src == NULL) + { fprintf(stderr, "safestrncpy: NULL argument\n"); abort(); } @@ -80,12 +62,8 @@ int safestrncpy(char *dest, const char *src, size_t n) } - -/* - * num_tokens() - discover number of parameters/tokens in a string - */ -int num_tokens(const char *source, char tok) -{ +// num_tokens() - discover number of parameters/tokens in a string +int num_tokens(const char *source, char tok) { int count = 1; const char *ptr = source; @@ -102,18 +80,13 @@ int num_tokens(const char *source, char tok) return (count); } -//extern void cit_backtrace(void); - -/* - * extract_token() - a string tokenizer - * returns -1 if not found, or length of token. - */ -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 * / +// extract_token() - a string tokenizer +// returns -1 if not found, or length of token. +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 s = source; @@ -121,8 +94,6 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, 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) { @@ -135,9 +106,7 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, if (*s == separator) { ++current_token; } - if ( (current_token == parmnum) && - (*s != separator) && - (len < maxlen) ) { + if ( (current_token == parmnum) && (*s != separator) && (len < maxlen) ) { dest[len] = *s; ++len; } @@ -149,70 +118,21 @@ long extract_token(char *dest, const char *source, int parmnum, char separator, dest[len] = '\0'; if (current_token < parmnum) { - //lprintf (CTDL_DEBUG,"test : n: %d sep: %c source: %s \n willi \n", parmnum, separator, source); - strcpy(dest, ""); - - // Locate desired parameter - s = source; - while (count < parmnum) { - // End of string, bail! - if (!*s) { - s = NULL; - break; - } - if (*s == separator) { - count++; - } - s++; - } - if (!s) { - //lprintf (CTDL_DEBUG,"test 0) @@ -259,11 +170,9 @@ int extract_int(const char *source, int parmnum) return 0; } -/* - * extract_long() - extract an long parm w/o supplying a buffer - */ -long extract_long(const char *source, int parmnum) -{ + +// extract_long() - extract an long parm without supplying a buffer +long extract_long(const char *source, int parmnum) { char buf[32]; if (extract_token(buf, source, parmnum, '|', sizeof buf) > 0) @@ -273,11 +182,8 @@ long extract_long(const char *source, int parmnum) } -/* - * extract_unsigned_long() - extract an unsigned long parm - */ -unsigned long extract_unsigned_long(const char *source, int parmnum) -{ +// extract_unsigned_long() - extract an unsigned long parm +unsigned long extract_unsigned_long(const char *source, int parmnum) { char buf[32]; if (extract_token(buf, source, parmnum, '|', sizeof buf) > 0) @@ -286,73 +192,9 @@ unsigned long extract_unsigned_long(const char *source, int parmnum) return 0; } -size_t CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen, int linebreaks) -{ - // linebreaks at 70 are ugly for base64, since 3 bytes in makes 4 bytes out - int breaklength = 68; - int readlength = 3 * breaklength / 4; - - int t; - int destoffset; - int sourceoffset; - int sourceremaining; - - base64_encodestate _state; - - base64_init_encodestate(&_state); - - if (linebreaks) { - sourceremaining = sourcelen; - destoffset = 0; - sourceoffset = 0; - - while (sourceremaining > 0) { - destoffset += base64_encode_block( - &(source[sourceoffset]), - (readlength > sourceremaining ? sourceremaining : readlength), - &(dest[destoffset]), - &_state); - sourceoffset += readlength; - sourceremaining -= readlength; - dest[destoffset++] = '\r'; - dest[destoffset++] = '\n'; - } - - t = destoffset; - destoffset += base64_encode_blockend(&(dest[destoffset]), &_state); - } - else { - destoffset = base64_encode_block(source, sourcelen, dest, &_state); - destoffset += base64_encode_blockend(&(dest[destoffset]), &_state); - } - dest[destoffset] = 0; - return destoffset; -} - - -/* - * Convert base64-encoded to binary. Returns the length of the decoded data. - * It will stop after reading 'length' bytes. - */ -int CtdlDecodeBase64(char *dest, const char *source, size_t length) -{ - base64_decodestate _state; - int len; - - base64_init_decodestate(&_state); - - len = base64_decode_block(source, length, dest, &_state); - dest[len] = '\0'; - return len; -} - - -/* - * if we send out non ascii subjects, we encode it this way. - */ -char *rfc2047encode(const char *line, long length) -{ +// if we send out non ascii subjects, we encode it this way. +char *rfc2047encode(const char *line, long length) { const char *AlreadyEncoded; char *result; long end; @@ -360,16 +202,13 @@ char *rfc2047encode(const char *line, long length) /* check if we're already done */ AlreadyEncoded = strstr(line, "=?"); - if ((AlreadyEncoded != NULL) && - ((strstr(AlreadyEncoded, "?B?") != NULL)|| - (strstr(AlreadyEncoded, "?Q?") != NULL))) - { + if ((AlreadyEncoded != NULL) && ((strstr(AlreadyEncoded, "?B?") != NULL)|| (strstr(AlreadyEncoded, "?Q?") != NULL))) { return strdup(line); } result = (char*) malloc(sizeof(UTF8_HEADER) + 4 + length * 2); strncpy (result, UTF8_HEADER, strlen (UTF8_HEADER)); - CtdlEncodeBase64(result + strlen(UTF8_HEADER), line, length, 0); + CtdlEncodeBase64(result + strlen(UTF8_HEADER), line, length, BASE64_NO_LINEBREAKS); end = strlen (result); result[end]='?'; result[end+1]='='; @@ -377,12 +216,9 @@ char *rfc2047encode(const char *line, long length) return result; } -/* - * removes double slashes from pathnames - * allows / disallows trailing slashes - */ -void StripSlashes(char *Dir, int TrailingSlash) -{ +// removes double slashes from pathnames +// allows / disallows trailing slashes +void StripSlashes(char *Dir, int TrailingSlash) { char *a, *b; a = b = Dir; @@ -407,9 +243,8 @@ void StripSlashes(char *Dir, int TrailingSlash) } -/* - * Strip leading and trailing spaces from a string - */ + +// Strip leading and trailing spaces from a string size_t striplt(char *buf) { char *first_nonspace = NULL; char *last_nonspace = NULL; @@ -441,11 +276,11 @@ size_t striplt(char *buf) { } -/** - * \brief check for the presence of a character within a string (returns count) - * \param st the string to examine - * \param ch the char to search - * \return the number of times ch appears in st +/* + * check for the presence of a character within a string (returns count) + * st the string to examine + * ch the char to search + * returns the number of times ch appears in st */ int haschar(const char *st, int ch) { @@ -463,37 +298,12 @@ int haschar(const char *st, int ch) } - - - -/* - * Format a date/time stamp for output - * seconds is whether to print the seconds - */ -void fmt_date(char *buf, size_t n, time_t thetime, int seconds) { - struct tm tm; - char *teh_format = NULL; - - *buf = '\0'; - localtime_r(&thetime, &tm); - - if (seconds) { - teh_format = "%F %R:%S"; - } - else { - teh_format = "%F %R"; - } - - strftime(buf, n, teh_format, &tm); -} - - - /* * Determine whether the specified message number is contained within the * specified sequence set. */ -int is_msg_in_sequence_set(const char *mset, long msgnum) { +int is_msg_in_sequence_set(const char *mset, long msgnum) +{ int num_sets; int s; char setstr[128], lostr[128], histr[128]; @@ -504,13 +314,16 @@ int is_msg_in_sequence_set(const char *mset, long msgnum) { extract_token(setstr, mset, s, ',', sizeof setstr); extract_token(lostr, setstr, 0, ':', sizeof lostr); - if (num_tokens(setstr, ':') >= 2) { + if (num_tokens(setstr, ':') >= 2) + { extract_token(histr, setstr, 1, ':', sizeof histr); - if (!strcmp(histr, "*")) { + if (!strcmp(histr, "*")) + { snprintf(histr, sizeof histr, "%ld", LONG_MAX); } } - else { + else + { strcpy(histr, lostr); } lo = atol(lostr); @@ -522,18 +335,18 @@ int is_msg_in_sequence_set(const char *mset, long msgnum) { return(0); } -/** - * \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 - * \return Pointer to the source memory right after we stopped reading. +/* + * Utility function to "readline" from memory + * start Location in memory from which we are reading. + * buf the buffer to place the string in. + * maxlen Size of string buffer + * returns pointer to the source memory right after we stopped reading. */ char *memreadline(char *start, char *buf, int maxlen) { char ch; char *ptr; - int len = 0; /**< tally our own length to avoid strlen() delays */ + int len = 0; /* tally our own length to avoid strlen() delays */ ptr = start; @@ -550,28 +363,31 @@ char *memreadline(char *start, char *buf, int maxlen) } -/** - * \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. +/* + * Utility function to "readline" from memory + * start Location in memory from which we are reading. + * buf the buffer to place the string in. + * maxlen Size of string buffer + * retlen the length of the returned string + * returns a 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 */ + int len = 0; /* tally our own length to avoid strlen() delays */ ptr = start; - while (1) { + while (1) + { ch = *ptr++; - if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) { + if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) + { buf[len++] = ch; } - if ((ch == 10) || (ch == 0)) { + if ((ch == 10) || (ch == 0)) + { buf[len] = 0; *retlen = len; return ptr; @@ -638,8 +454,6 @@ const char *cmemreadlinelen(const char *start, char *buf, int maxlen, int *retle } - - /* * Strip a boundarized substring out of a string (for example, remove * parentheses and anything inside them).